"সংরক্ষণাগারযুক্ত তবে উপলভ্য" ডেটার জন্য এসকিউএল সার্ভার ডাটাবেস ডিজাইন


12

আমাদের কাছে এই বিশাল ডাটাবেস (> 1 টিবি) রয়েছে যা আমরা "সঙ্কুচিত" করতে চাইছি। ডাটাবেসটি একটি প্রধান সত্তার চারদিকে ঘোরে, আসুন একে "ভিজিট" বলুন। আলোচনার জন্য, ধরা যাক এটি চিকিত্সা অনুশীলনের জন্য একটি ডাটাবেস।

মোট 30 টি পরিদর্শন "প্রকার" রয়েছে, যেমন পদ্ধতি, বার্ষিক, ফলো-আপ, টিকাদান ইত্যাদি, যার প্রতিটি "ভিজিট" এর জন্য সহায়ক টেবিল, যেমন "ভিজিট_মুনো"।

2000 সাল থেকে ডাটাবেসটি 12 বছরের ডেটা সংগ্রহ করেছে Someone কেউ প্রস্তাব দিয়েছেন যে আমরা "লাইভ" সংস্করণে প্রায় 3 বছরের ডেটা রাখি এবং বাকী একটি "ওল্ড_ডাটা" ডাটাবেসে লাইভ রাখি। তারিখটি কেবলমাত্র "ভিজিট" টেবিলটিতে সঞ্চিত রয়েছে যেহেতু এটি স্বাভাবিক করা হয়েছে। ভিজিট টেবিলটিতে একটি ROWVERSIONকলাম এবং BIGINTছদ্ম-পরিচয় (ক্লাস্টারড) কলামও রয়েছে। সমস্ত অভিপ্রায় এবং উদ্দেশ্যগুলির জন্য, আসুন বলি যে ক্লাস্টারিং কীটি একটি সিকোয়েন্স (এসকিউএল সার্ভার 2012 এন্টারপ্রাইজ) দ্বারা পপুলেটেড - আমরা এটির নাম দেব cid

visit.dateযখন একজন ডাক্তার বর্ধিত visitations এবং তার তথ্য "ব্রিফকেস" সঙ্গে আয় যায় ক্লাস্টারিং কী, উদাহরণ হিসেবে একই আদেশ সবসময় নয়, এটা প্রধান টেবিল মধ্যে মিশে গিয়ে তৈরি হয়। এছাড়াও এখানে "দর্শন" টেবিল থেকে কিছু আপডেট যে কারণ হবে হয় ROWVERSIONকলামে সাথে সিঙ্কের বাইরে হতে cidএবং dateকেবল এটা করা, তন্ন তন্ন - কলাম ROWVERSIONকিংবা cidএই কারণে উপযুক্ত পার্টিশন কী করতে হবে।

"লাইভ" থেকে ডেটা অপসারণের ব্যবসায়ের নিয়মটি হ'ল visit.date36 মাসের বেশি হওয়া উচিত এবং শিশু visit_paymentরেকর্ড থাকা আবশ্যক। এছাড়াও, "ওল্ড_ডাটা" ডাটাবেসে ব্যাস টেবিলগুলি বাদ দিয়ে আর কোনও কিছু থাকে না visit%

সুতরাং আমরা এখানে দিয়ে শেষ:

লাইভ ডিবি (দৈনন্দিন ব্যবহার) - সমস্ত টেবিলগুলি পুরানো ডেটা ডিবি - visit%টেবিলগুলির জন্য পুরানো ডেটা

একটি সম্মিলিত ডিবি যে ধারণকারী একটি শেল জন্য প্রস্তাব কল প্রতিশব্দ সমস্ত বেস সারণীগুলিতে Live DB(-setup visit%) প্লাস দেখেছে যে ইউনিয়ন জুড়ে visit%দুই ডাটাবেস টেবিল।

ধরে নিই Old-Dataডিবিতে একই সূচি তৈরি করা হয়েছে , প্রশ্নগুলি কি ইউনিয়ন-সমস্ত দৃষ্টিভঙ্গিতে ভাল সম্পাদন করবে ? কোন ধরণের ক্যোয়ারী নিদর্শনগুলি ইউনিয়ন-সমস্ত দর্শনগুলির জন্য কার্যকর পরিকল্পনাটি ট্রিপ করতে পারে ?


3
ক) প্রবীণ ডেটা সংরক্ষণাগার রাখার জন্য কী অনুপ্রেরণা এবং খ) এটিকে অ্যাক্সেসযোগ্য রাখা? উপরি রক্ষণাবেক্ষণ? পারফরম্যান্সে সমস্যা? সংরক্ষণাগারভুক্ত ডেটাটি কি বিনা বাধায় অ্যাপ্লিকেশনটিতে অ্যাক্সেসযোগ্য হওয়া দরকার? অ্যাপ্লিকেশন পরিবর্তন বা ছাড়া?
মার্ক স্টোর-স্মিথ

(ক) মূল ডিবি ছোট রাখা। এটি অন্য 3 এনভির প্রতিলিপি করা হয়েছে - দেব, প্রাক-পরীক্ষা, পরীক্ষা। এখানে প্রতিলিপি আয়না এবং ব্যাকআপগুলিও রয়েছে, সব ব্যয়বহুল স্টোরেজ দ্বারা সমর্থিত। (খ) যেহেতু ডাউন স্ট্রিম সিস্টেমগুলিতে বর্তমানে সমস্ত ডেটা অ্যাক্সেস রয়েছে তাই এটি স্থিতাবস্থা বজায় রাখে। (গ) অ্যাপ্লিকেশনটির একটি উদাহরণ সমস্ত মতামতের সাথে "সম্মিলিত" ডিবির বিরুদ্ধে চলতে পারে তবে আমি সন্দেহ করি যে এটি কোনওভাবেই সম্পাদন করতে পারে না।
孔夫子

শুধু স্পষ্ট করে বলতে গেলে, সংরক্ষণাগারভুক্ত ডেটা এখনও পঠন-লিখন, সঠিক? নাকি এটি কেবল পঠনযোগ্য?
জন সেগেল

পুরানো ডেটা কেবল পঠনযোগ্য এবং 100% ভরা পৃষ্ঠায় পরিবর্তিত হবে। সম্মিলিত দৃশ্যের সাথে সংযুক্ত অ্যাপ্লিকেশনটির উদাহরণটি যদি কোনও পুরানো ডেটার উপর নির্লিপ্ত কিছু চেষ্টা করে তবে ত্রুটি ছুঁড়ে দিতে পারে - আমাদের যত্ন নেই।
孔夫子

আমি মনে করি shellতিহাসিক ডেটা এবং আংশিক ব্যাকআপ / পুনরুদ্ধারের জন্য কেবল পঠনযোগ্য একটি ফাইলগ্রুপ শেল ডাটাবেস এবং প্রতিশব্দ যুক্ত না হওয়া ছাড়া এটি কভার করবে। আমি বলতে মনে যেমন আমি কিছু সময়ের এবং প্রয়োজন আমার মেমরি রিফ্রেশ করতে জন্য এটি বলবিজ্ঞান সঙ্গে হস্তক্ষেপ করেন নি। এটি প্রতিরূপের সাথে কীভাবে খাপ খায় তা ধারণা নেই তবে কেন আপনি যেভাবেই স্ট্রিম স্ট্রিমেন্টে লাইভ ডাটাবেসটি প্রতিলিপি করছেন তা আমি প্রশ্ন করব।
মার্ক স্টোরী-স্মিথ

উত্তর:


4

সুবিধার জন্য, ধরে নিই যে লাইভ ডাটাবেস কল করা হয়েছে LiveDbএবং আছিভ ডাটাবেস বলা হয়েছেArchiveDb

  • একটি প্রতিশব্দ মাধ্যমে ডাটাবেসে LiveDbটেবিলগুলিতে ইঙ্গিত করার জন্য একটি ইউনিয়ন সমস্ত দৃষ্টিভঙ্গি যুক্ত ArchiveDbকরুন (প্রতিশব্দ সহ সম্মিলিত ডিবি করার দরকার নেই)
  • "পার্টিশন" চালিয়ে যান visit.dateএবং এই কলামটি visit_paymentsইতিমধ্যে সেখানে না থাকলেও এটি অস্বীকৃত করুন (এটি সহ-অবস্থিত যোগদানের পারফরম্যান্সকে উন্নত করে)
  • সম্ভব হলে কেবলমাত্র দুটি বৃহত টেবিল সংরক্ষণাগারভুক্ত করুন (অপটিমাইজারের ট্রিপিংয়ের সুযোগ হ্রাস করে)। ইউনিয়ন সমস্ত দেখুন এবং অন্যান্য টেবিলগুলিতে রাখুন LiveDbযাতে ছোট টেবিলের সাথে সমস্ত যোগ হয় স্থানীয় রাখা হয়
  • উভয় টেবিল উপর একটি চেক বাধ্যতা যোগ করুন LiveDbএবং ArchiveDb যে পরিসীমা বর্ণনা করে visit.dateটেবিলে রয়েছে। এটি অপ্টিমাইজারটি কলামটি থাকা এবং অনুসন্ধানগুলি উভয় থেকে সংরক্ষণাগার সারণি অপসারণ করতে সহায়তা করে visit.data। আপনাকে নিয়মিত এই সীমাবদ্ধতা আপডেট করতে হবে।
  • ইউনিয়ন সমস্ত দর্শনে, ফিল্টার করে এমন একটি মানদণ্ড যুক্ত করুন visit.data। এটি ইতিমধ্যে আপনি চেক সীমাবদ্ধতায় সরবরাহ করেছেন এমন ইঙ্গিত ছাড়াও। এটি ফিল্টারগুলি নিচে নামার সুযোগ সর্বাধিক করে তোলে
  • আপনার যদি EE থাকে তবে সংরক্ষণাগার ডাটাবেজে টেবিলটি বিভাজন করুন (তবে লাইভ ডাটাবেসে নয়)। আপনি যদি সত্যিই অভিনব হতে চান, ব্যাকআপ সময়গুলি সংরক্ষণ করতে সংরক্ষণাগার ডাটাবেসের ফাইলগ্রুপ স্তরের ব্যাকআপ / পুনরুদ্ধার ব্যবহার করুন।
  • AchiveDbসিম্পল পুনরুদ্ধার মোডে রাখার বিষয়টি বিবেচনা করুন যদি এটি ইতিমধ্যে না থাকে। আপনার লেনদেনের লগ ব্যাকআপের প্রয়োজন নেইArchiveDb
  • INSERT ব্যবহার করুন ... উইথ (ট্যাবলক) নির্বাচন করুন ... উইথ (রোলক) সাথে গন্তব্যটিতে ন্যূনতম লগিং জোর করতে LiveDbএবং এর মধ্যে ডেটা সরিয়ে রাখার জন্য ArchiveDb

উপরের সমস্তটি গ্যারান্টি দেয় না যে অপটিমাইজকারী অনুসন্ধান এবং স্ক্যানগুলি থেকে সংরক্ষণাগার সারণীগুলি সরিয়ে ফেলবে, তবে এটি আরও বেশি সম্ভাবনা তৈরি করে।

বিলোপ যখন হয় না। এগুলি আপনি দেখতে পাচ্ছেন এমন প্রভাব (এই তালিকাটি অসম্পূর্ণ হতে পারে)। সিক্সের জন্য, আপনি প্রতিটি ক্যোয়ারীতে একটি অতিরিক্ত অনুসন্ধান পাবেন (এটি আইওপিএস চালায়)। স্ক্যানগুলির জন্য, ফলাফলগুলি পারফরম্যান্সের জন্য বিপর্যয়কর হতে পারে কারণ আপনি সংরক্ষণাগার এবং লাইভ টেবিল উভয়ই স্ক্যান করে শেষ করতে পারেন। আপনি অপটিমাইজারটি ট্রিপ করতে পারেন এমন সাধারণ উপায়গুলি এখানে:

  • আপনি যদি visit%একসাথে টেবিলগুলিতে যোগদান করেন এবং visit.dataযোগদানের মানদণ্ডে অন্তর্ভুক্ত না করেন (এজন্য আপনি অস্বীকার করতে চান)। এ কারণে, আপনি আপনার কিছু প্রশ্নের পরিবর্তন করতে চাইতে পারেন
  • যদি আপনি একটি হ্যাশ visit.dataএবং অন্য একটি সারণির (উদাহরণস্বরূপ একটি তারিখের মাত্রা) এর সাথে যোগদান করেন তবে আপনি টেবিলগুলির সঠিক বর্জন করতে পারবেন না
  • যদি আপনি সংরক্ষণাগারভুক্ত টেবিলগুলির উপর ডেটা একত্রিত করার চেষ্টা করেন
  • আপনি যদি তবে কিছুই ফিল্টার করেন visit.data, উদাহরণস্বরূপ একটি ভিউয়ের কীতে সরাসরি সন্ধান করুন।

শেষ দৃশ্যের জন্য, আপনি cidযদি এর উপর অন্য চেক সীমাবদ্ধতা যুক্ত করে সবচেয়ে খারাপ প্রভাব থেকে নিজেকে রক্ষা করতে পারেন - যদি এটি সম্ভব হয়। আপনি উল্লেখ করেছেন যে cidসারণিতে সারিগুলির তারিখ এবং অগ্রগতি সম্পর্কিত "পরিষ্কার" না হওয়ার ক্রম । তবে, আপনি কি এমন কোনও টেবিল বজায় রাখতে পারবেন যাতে তথ্য রয়েছে: "এর cidপরে এই সংখ্যার উপরে কোনও নেই visit.data" বা অনুরূপ? এটি তখন অতিরিক্ত বাধা চালাতে পারে।

আরেকটি বিষয় সম্পর্কে সতর্কতা অবলম্বন করতে হবে যে পার্টিশনাল ভিউটি অনুসন্ধান করার পরে সমান্তরাল প্রশ্নগুলি অনেক বেশি থ্রেড তৈরি করতে পারে (যেহেতু উভয় "সাব-টেবিল" একই সমান্তরাল অপটিমাইজেশনে প্রকাশিত হবে)। যে কারণে, আপনি সার্ভারে বা সমান্তরাল কোয়েরিতে MAXDOP সীমাবদ্ধ করতে চাইতে পারেন।

যাইহোক, আপনি যদি কোয়েরিগুলি ভালভাবে জানেন তবে - দুটি ডাটাবেসে আপনার একই সূচকের দরকারও পড়তে পারে না (এটি ধরে নেওয়া হয় আপনি 100% নিশ্চিত যে আপনি টেবিলগুলির সঠিক নির্মূলকরণ পাবেন)। আপনি এমনকি কলাম স্টোর ব্যবহার বিবেচনা করতে পারে ArchiveDb


-1

আমরা যেভাবে করেছি তা হ'ল ব্যাচগুলিতে একটি নতুন তৈরি ডাটাবেসে পুরানো ডেটা লেখা এবং লাইভ ডিবি থেকে পুরানো ডেটা মুছে ফেলা। এইভাবে উভয় ডিবি অ্যাক্সেসযোগ্য। আপনি নতুন তৈরি করা ডাটাবেসটিকে ব্যাক আপ করতে পারেন এবং উত্পাদন সার্ভারগুলি থেকে বড় পদচিহ্ন সরিয়ে নিতে অন্য কোথাও এটি পুনরুদ্ধার করতে পারেন। আশা করি এটি আপনার প্রয়োজনের একটি গ্রহণযোগ্য সমাধান।


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