পতাকাগুলির একটি অ্যারের সংরক্ষণের জন্য ডেটা প্রকার (একটি বিটম্যাপ / বিট অ্যারে)


15

নীচের ক্রিয়াকলাপকে সমর্থন করে একটি টেবিলের প্রতিটি রেকর্ডের জন্য আমার কিছুটা অ্যারে সঞ্চয় করা দরকার:

  • কিছুটা সেট করা থাকলে পরীক্ষা করা এবং কিছু সেট করা (এসকিউএল ব্যবহার করে)

  • ADO 2.8 (ADO.NET নয়) ব্যবহার করে অনুসন্ধান করা এবং মান নির্ধারণ করা

  • ইনডেক্সিং ("কভারিং ইনডেক্স" বৈশিষ্ট্যটি উপকারের জন্য)

এই অ্যারেতে সর্বাধিক সংখ্যক বিট সংরক্ষণ করা হবে তবে এটি 32 এর বেশি হতে পারে । অর্থাৎ একটি সহজ int- এ কলাম সবসময় কাজ করে না।

আমি এখন পর্যন্ত যা দেখেছি তার থেকে আমার বিকল্পগুলি হ'ল:

  1. বেশ কয়েকটি ইনট কলাম ব্যবহার করুন
  2. বিগিন্ট ব্যবহার করুন (বিটের সংখ্যা <= 64 হওয়া পর্যন্ত কাজ করে)
  3. বাইনারি ব্যবহার করুন
  4. ?

প্রথম বিকল্পটি কাজ করবে, তবে ডেটা অ্যাক্সেস করে এমন কোডে বেশ কিছুটা রিফ্যাক্টরিং প্রয়োজন। দ্বিতীয় বিকল্প কেবলমাত্র একটি অস্থায়ী ত্রাণ ও আমার অনুসন্ধান থেকে এ পর্যন্ত আমি খুব নিশ্চিত যদি ADO সঙ্গে ভাল যে কাজ নই bigintবাইনারি নিয়ে আমার কোনও অভিজ্ঞতা নেই এবং আমি অন্য কোনও বিকল্প সম্পর্কে অবগত নই।

প্রয়োজনীয়তাগুলি বিবেচনা করে আপনি কোন ডেটা টাইপ পছন্দ করবেন?

উত্তর:


12

আমি এর জন্য একটি একক ক্ষেত্র না ব্যবহার করার পক্ষে দৃ strongly়তার সাথে উকিল করতে পারি না

আমি বর্তমানে bigintবিটমাস্ক ফিল্ডের সাথে একটি খুব বড় ডেটাসেট বজায় রাখার জন্য কাজ করছি এবং এটি কিছুটা পারফরম্যান্স দুঃস্বপ্ন।

আপনি যদি এককটি পরীক্ষা করেন তবে তা ঠিক আছে। আপনি যদি একাধিক বিট পারফরম্যান্স পরীক্ষা করেন তবে খুব তাড়াতাড়ি অবনতি ঘটে।

বিটমাস্ক পূর্ণসংখ্যার প্রকৃতির কারণে, ডেটা বিতরণ খুব ভারসাম্যহীন হবে এবং আপনি পরাশক্তি পরিকল্পনা পাবেন।

একাধিক বিট চেকগুলির ফলাফল প্রতিটি সারির বিপরীতে চলমান একটি ফাংশন সহ সীমা বা সূচি স্ক্যানগুলির ফলাফল করে। এটি একটি জগাখিচুড়ি.

আমার কাজটি সহজ ছিল - প্রতিটি শর্ত পরীক্ষা করার জন্য আমি পিকে সংরক্ষণের জন্য একটি টেবিল তৈরি করেছিলাম। এটি প্রাথমিকভাবে পাল্টা স্বজ্ঞাত তবে প্রয়োজনীয় স্থানটি কম (আপনি কেবল পিকে সংরক্ষণ করেন) এবং লুক্কুলগুলি দ্রুত বজ্রপাত হয়, বিশেষত আপনি যদি এটি ব্যবহার করেন UNIQUE CLUSTERED INDEX

আপনার প্রধান টেবিলকে প্রভাবিত না করে আপনি যতগুলি শর্ত চান তা যোগ করতে পারেন এবং আপডেটগুলিও আপনার প্রধান সারণিকে প্রভাবিত করে না।

ইনডেক্সিং সহজ, যেহেতু আপনি ব্যক্তিগতভাবে সমস্ত অনুসন্ধানের টেবিলগুলি পৃথকভাবে সূচক করেন এবং যেহেতু আপনার ক্লাস্টারযুক্ত কীটি আপনার মূল টেবিলের সাথে একই এবং আপনার সমস্ত মূল্যায়ন merge joinযা খুব কার্যকর।


1
আপনি কি আপনার কাজের দিক দিয়ে আরও কিছুটা ব্যাখ্যা করতে পারবেন? আমি এটি খুঁজে পেয়েছি কারণ আমি একই বেসিক সমস্যাটি সমাধান করার চেষ্টা করছি তবে কীভাবে এটি করা যায় তা নিশ্চিত নয়।
জোশুয়া ফ্র্যাঙ্ক

4

আপনার যা সঞ্চয় করতে হবে তা হ'ল সংখ্যক সত্য / মিথ্যা মানের হয়, আপনি bitডেটা টাইপ ব্যবহার করতে পারেন ।

অভ্যন্তরীণভাবে, এসকিউএল সার্ভার bitকলামগুলি প্যাকেটে বাইটে "খণ্ডগুলি" সঞ্চয় করে । সুতরাং bitআপনার টেবিলের 8 টি পর্যন্ত কলামের জন্য , এসকিউএল 1 প্যাকেজযুক্ত 1 বাইট হিসাবে সঞ্চয় করে; bit2 বাইটে 9-16 কলাম এবং আরও কিছু।

আপনি কলাম সীমাতে যাচ্ছেন বলে মনে হচ্ছে না, তাই এটি বেশ সোজা-এগিয়ে মনে হচ্ছে। এবং অবশ্যই, এগুলি এটিকে সুন্দরভাবে পৃথক করে রাখার ফলে আপনি কলামগুলি পঠনযোগ্যতার জন্য নামকরণ করতে পারবেন এবং আপনার সূচীকরণের সমস্ত সম্ভাবনা আপনি পেতে সাধারণত পারবেন (যদি পতাকাগুলি অত্যন্ত নির্বাচনী হয় তবে আপনি যদি ২০০++ টার্গেট করতে পারেন তবে ফিল্টারযুক্ত সূচিগুলি কার্যকর হতে পারে)।

নিজেকে বিট-প্যাকিং করা ইন্ডেক্সিং করতে আরও অনেক বেশি সংশ্লেষিত করে তুলবে (সম্ভবত গণনা করা এবং bitমুখোশের প্রতিটি অবস্থানকে উপস্থাপন করার জন্য কলামযুক্ত কলামগুলি ... তবে তারপরে আপনি bitসরাসরি বনামের তুলনায় আরও খারাপ হন )।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.