এসকিউএল বড় টেবিল ডিজাইন


17

এসকিউএল সার্ভার ২০০ টেবিল (গুলি) নকশা সম্পর্কে আমার একটি সাধারণ প্রশ্ন রয়েছে। আমাদের কাছে বর্তমানে একটি টেবিল রয়েছে যা 600 গিগাবাইটের বেশি এবং দিনে প্রায় 3 জিবিতে বাড়তে থাকে। এই টেবিলটির যথাযথ উদাসীনতা রয়েছে তবে ক্যোয়ারি চলাকালীন এবং তার আকারের কারণে এটি একটি প্রধান হ্যাঙ্গআপ হয়ে উঠছে। প্রশ্নটি হল যে আমি বছর এবং মাসের মধ্যে টেবিলটি একাধিক টেবিলগুলিতে বিভক্ত করা উচিত (এটি অন্যান্য বিভাগগুলি তাদের বৃহত ডেটা সেটগুলি কীভাবে বিভক্ত করে তা মাপসই হবে) বা এসকিউএল সার্ভারে নির্মিত পার্টিশনটি কীভাবে নেওয়া উচিত? এটি প্রদর্শিত হচ্ছে যে পার্টিশনটি ব্যবহার করে কোডের কম পরিবর্তন প্রয়োজন require পার্টিশন করার সময় আমি যা পড়েছি তা থেকে আপনি কেবল একটি টেবিলটি জিজ্ঞাসা করেছেন এবং সার্ভার কীভাবে ডেটা পাবেন তা পরিচালনা করে। আমরা যদি একাধিক টেবিলের রুটে চলে যাই তবে আমাদের একাধিক টেবিল থেকে ডেটা টানতে হবে।


1
কী কী অপ্টিমাইজেশন করা হবে: খুব প্রশস্ত ডেটাটাইপস, ওভারল্যাপিং বা অব্যবহৃত সূচিপত্র ইত্যাদি?
gbn

সম্ভবত, আমি অন্যান্য অপ্টিমাইজেশনের জন্য এখনও উদাসীনতাগুলি দেখিনি। আপনার কি সুপারিশ আছে?
HunterX3

উত্তর:


11

"এই টেবিলটির যথাযথ উদাসীনতা রয়েছে তবে ক্যোয়ারি চলাকালীন একটি বড় হ্যাঙ্গআপ হয়ে উঠছে"

এসকিউএল সার্ভার কোয়েরি চালানোর সময় পার্টিশনগুলি নির্মূল করতে সক্ষম না হলে একা পার্টিশন করা কোয়েরি কার্যকারিতাটিতে সহায়তা করে না। আপনার পার্টিশনটির সাথে আপনার WHERE ধারাটি রক্ষা করতে হবে। আমরা কেবলমাত্র একটি ক্ষেত্রকে একটি বিভাজন ক্ষেত্র হিসাবে ব্যবহার করতে পারি, সুতরাং সেই ক্ষেত্রটি যদি আপনার পুরো ধারাটিতে অন্তর্ভুক্ত না করা হয় তবে আপনি পার্টিশন থাকা সত্ত্বেও পুরো টেবিলটি স্ক্যান করতে পারেন।

"এবং কেবল তার আকারের কারণে" "

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

"এটি উপস্থিত রয়েছে যে পার্টিশনটি ব্যবহার করে কোডের কম পরিবর্তন প্রয়োজন require"

বাছাই করা - এটি প্রথম নজরে এমনভাবে দেখায়, তবে আপনি এতে যতটা getুকবেন, পার্টিশনযুক্ত মতামতের মতো বিকল্প পেয়েছেন। আপনি বিদ্যমান টেবিলটির পুনরায় নামকরণ করতে পারেন, এটির জায়গায় একটি দর্শন রেখে then

আমি এখানে বিভাজন সংক্রান্ত সমস্যাগুলি সম্পর্কে আরও লিখেছি:

http://www.brentozar.com/archive/2008/06/sql-server-partitioning-not-the-answer-to-everything/


3
নিবন্ধটির প্রিয় উক্তিটি অবশ্যই "পার্টিশন ফাংশন এবং স্কিমগুলি ভুলভাবে ডিজাইন করা সহজ" "
মার্ক স্টোর-স্মিথ

7

বিচ্ছিন্নভাবে বিভাজন যথেষ্ট হতে পারে তবে পার্টিশনযুক্ত দর্শন এবং একাধিক টেবিলের সাথে একত্রিত হয়ে আপনি আরও ভাল ফলাফল পেতে পারেন। এটি খুব অনুসন্ধান এবং বৃদ্ধির প্যাটার্নের উপর নির্ভর করে।

বিভাজনের সাথে বর্তমান সীমাবদ্ধতাটি হ'ল পার্টিশন স্তরের পরিবর্তে কলামের পরিসংখ্যান কেবলমাত্র একটি টেবিলে বজায় রাখা হয়। যদি আপনার কাছে কোয়েরি করার এমন একটি প্যাটার্ন থাকে যা আরও সঠিক পরিসংখ্যান থেকে উপকৃত হয়, পার্টিশনযুক্ত দর্শনগুলির সাথে টেবিল বিভাজনকে একত্রিত করে কার্যকর পারফরম্যান্স সুবিধা পেতে পারে।

যেখানে আপনার তথ্যের প্রকৃতি এক মাস থেকে মাসে, বছরের পর বছর পরিবর্তিত হয় সেখানে বিভাজনযুক্ত দর্শনগুলিও সহায়তা করতে পারে। এমন কোনও খুচরা বিক্রেতা কল্পনা করুন যা নিয়মিতভাবে তার পণ্যরেখাগুলি পরিবর্তিত করে, যেমন পণ্যাদির মধ্যে সামান্য সামঞ্জস্য থাকে r প্রতি বছর উত্পাদন আইড ব্যাপ্তি ব্যবহৃত হয়। একটি একক অর্ডার / অর্ডারডেটেল টেবিল এবং সেইজন্য একক পরিসংখ্যান হিস্টোগ্রামের সাথে পরিসংখ্যানগুলি কোয়েরি অপটিমাইজারকে সামান্য প্রস্তাব করবে। প্রতি বছর একটি সারণী (অর্ডার_2010, অর্ডার_2011, অর্ডারলাইন_2010, অর্ডারলাইন_2011) মাসে ভাগ হয়ে গেছে এবং পার্টিশনযুক্ত দর্শনগুলির সাথে মিলিত (অর্ডার, অর্ডারলাইন) আশাবাদীকে আরও দানাদার এবং সম্ভাব্য কার্যকর পরিসংখ্যান সরবরাহ করবে।

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

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

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

আপনার যদি নেটওয়ার্ক জুড়ে ব্যাকআপ প্রেরণের জন্য আদর্শ না হলেও অস্বাভাবিক প্রক্রিয়া থাকে তবে আপনি আপনার বর্তমান 600 গিগাবাইটের জন্য 3 ঘন্টা পুনরুদ্ধারের সময়টি খুঁজছেন। এক বছরে যখন আপনি 1.5TB লঙ্ঘন করেছেন, তখন আপনার সমস্যা হয়েছে।


1
"1 কলামের পরিসংখ্যান কেবল একটি টেবিলে রক্ষণাবেক্ষণ করা হয়" এর জন্য এবং আমি আশা করি আমি কিম্বারলি এবং কেন্দ্রের লিঙ্কগুলির জন্য আবার +1 করতে পারি।
ম্যাট এম

1

যেমনটি আপনি বলেছেন, আপনার কাছে এখানে দুটি বিকল্প রয়েছে:

  1. একাধিক সারণী ব্যবহার করুন
  2. পার্টিশনটি ব্যবহার করুন

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

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

আপনার যদি এন্টারপ্রাইজ সংস্করণ থাকে তবে আমি অবশ্যই বিভাজনটিকে এক নজর দেব। এটি দেখতে যত জটিল মনে হচ্ছে, এটি আসলে খুব খারাপ নয়। যদি তা না হয়, পার্টিশন করাও আপনার পক্ষে বিকল্প নয়।

পার্টিশনযুক্ত টেবিল তৈরি করা হচ্ছে

পার্টিশনযুক্ত টেবিলগুলি পরিবর্তন করা হচ্ছে

ডেটা সাবসেটগুলি পরিচালনা করতে পার্টিশন ডিজাইন করা

আশাকরি এটা সাহায্য করবে,

ঔজ্বল্যহীন


0

আপনার প্রশ্ন থেকে, আপনি historicalতিহাসিক ডেটা (লগগুলি) সঞ্চয় করছেন বলে মনে হচ্ছে এবং আপনার সীমাবদ্ধতার সন্ধানের ঘরের সমস্যাগুলি নয়, কোয়েরি গতি থেকে এসেছে বলে মনে হচ্ছে। আমার জন্য বিভাজন সাহায্য করবে না।

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


আমাদের সূচকগুলি ক্ষেত্রগুলি সর্বাধিক ব্যবহৃত হয় তা নির্ভর করে। আমাদের কাছে ১ টি ক্লাস্টারযুক্ত এবং ২ টি নন ক্লাস্টার রয়েছে, দুজনেই বিজ্ঞাপন হিসাবে কাজ করছে বলে মনে হচ্ছে। আমি মনে করি এটির আকারটি এটির চেয়ে বেশি।
HunterX3
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.