উত্তর:
একটি টেবিল বিভাজন করতে, আপনি নীচের সংক্ষিপ্ত পদক্ষেপগুলি অনুসরণ করতে পারেন:
DROP_EXISTING
তৈরি করতে হবে বা ক্লাস্টার ইনডেক্সটি পুনরায় তৈরি করতে আপনি ক্লজটি ব্যবহার করতে পারেন ।ONLINE=ON
আপনার আবেদনের জন্য যে কোনও ডাউনটাইম হ্রাস করতে CREATE INDEX বিবৃতিটির বিকল্পটি ব্যবহার করার নমনীয়তা রয়েছে । নোট করুন যে অন লাইন বিকল্পটি ব্যবহার করে সূচি পুনর্নির্মাণের সময় আপনি একটি কার্য সম্পাদনের অবনতি দেখতে পাবেন।পার্টিশনটি স্বয়ংক্রিয় করতে, আপনি কোডড্লেক্সে উপলব্ধ এসকিউএল সার্ভার পার্টিশন ম্যানেজমেন্ট ইউটিলিটি বা এসকিউএল সার্ভার পার্টিশনযুক্ত টেবিল ফ্রেমও ব্যবহার করতে পারেন ।
কিছু ভাল সম্পদ:
আপনার টেবিলের একটি ক্লাস্টার ইনডেক্স আছে কিনা তা আপনি নির্দিষ্ট করবেন না, তাই আসুন সমস্ত বিকল্পের মধ্য দিয়ে চলুন।
আমি এই উদাহরণটি পার্টিশন ফাংশন, পার্টিশন স্কিম এবং টেবিলটি ব্যবহার করতে যাচ্ছি:
CREATE PARTITION FUNCTION pf1(INT) AS RANGE LEFT FOR VALUES(10,20,30,40);
GO
CREATE PARTITION SCHEME ps1 AS PARTITION pf1 ALL TO ([PRIMARY])
GO
CREATE TABLE dbo.pt(pc INT NOT NULL, id INT NOT NULL) ON [PRIMARY];
GO
1. আপনার টেবিলটিতে একটি ক্লাস্টার ইনডেক্স রয়েছে যা কোনও বাধা দ্বারা তৈরি করা হয়নি।
এটি সবচেয়ে সহজ ক্ষেত্রে। টেবিলটি পার্টিশন স্কিমে সরাতে আপনি কেবলমাত্র ক্লজটি দিয়ে CREATE INDEX
বিবৃতিটি ব্যবহার করতে পারেন DROP_EXISTING
।
উদাহরণস্বরূপ ধরুন যে এই ক্লাস্টার্ড সূচকটি তৈরি হয়েছিল:
CREATE UNIQUE CLUSTERED INDEX ptc ON dbo.pt(Id) ON [PRIMARY];
এই টেবিলটি বিভাজন করতে, ক্লাস্টারড ইনডেক্সে মূল অংশ হিসাবে পার্টিশন কলাম (আমাদের ক্ষেত্রে পিটি) অন্তর্ভুক্ত করা হয়েছে। এই স্টেটমেন্টটি ক্লাস্টারড ইনডেক্সকে একই সাথে পার্টিশন কলাম এবং পার্টিশন অন্তর্ভুক্ত করতে পরিবর্তন করে:
CREATE UNIQUE CLUSTERED INDEX ptc ON dbo.pt(pc, Id) WITH(DROP_EXISTING = ON)ON ps1(pc) ;
DROP_Existing
নতুনটি তৈরি করার আগে এই ধারাটি স্বয়ংক্রিয়ভাবে বিদ্যমান সূচকটি সরিয়ে দেয়। এটি একটি পৃথক পৃথক DROP INDEX
হিসাবে পছন্দ করা হয় কারণ এটি অবিবাহিত সূচকগুলিকে কেবল একবার পুনর্নির্মাণের কারণ করে।
২. আপনার টেবিলটিতে একটি ক্লাস্টার ইনডেক্স রয়েছে যা একটি PRIMARY KEY
বা UNIQUE
সীমাবদ্ধতার অংশ এবং এতে কী এর অংশ হিসাবে পার্টিশন কলাম রয়েছে
এটি একটি এখনও সহজ এবং আগেরটির সাথে খুব মিল।
ধরুন এই PRIMARY KEY
সীমাবদ্ধতাটি টেবিলে তৈরি হয়েছিল:
ALTER TABLE dbo.pt ADD CONSTRAINT ptc PRIMARY KEY CLUSTERED (pc, Id) ON [PRIMARY];
এখন আপনি কেবল একই পুনর্নির্মাণ স্ক্রিপ্টটি চালাতে পারেন যা আমরা 1:
CREATE UNIQUE CLUSTERED INDEX ptc ON dbo.pt(pc, Id) WITH(DROP_EXISTING = ON)ON ps1(pc) ;
৩. টেবিলটিতে একটি ক্লাস্টারড ইনডেক্স রয়েছে যা পার্টিশন কলামটি অন্তর্ভুক্ত করে না তবে এটি PRIMARY KEY
বা UNIQUE
বাধার অংশ হিসাবে তৈরি হয়েছিল
শক্ত ভাগ্য। আপনি সত্যের পরে কোনও PRIMARY KEY
বা UNIQUE
বাধার সংজ্ঞা পরিবর্তন করতে পারবেন না । আপনার একমাত্র বিকল্পটি সীমাবদ্ধতা ফেলে দেওয়া এবং পার্টিশন কলাম সহ এটি পুনরায় তৈরি করা বা পার্টিশন কলাম অন্তর্ভুক্ত সীমাবদ্ধতার থেকে আলাদা একটি ক্লাস্টারড সূচক তৈরি করা। দ্বিতীয় ক্ষেত্রে আপনি NONCLUSTERED
পার্টিশন কলামটি অন্তর্ভুক্ত না করে আবার সীমাবদ্ধতা তৈরি করতে পারেন । কারণ এখন এই সীমাবদ্ধতাটি সারিবদ্ধ নয় (অর্থাত এটির সমর্থনকারী সূচকটি বিভাজনযুক্ত নয়) আপনাকে ডিস্কে কোথায় স্থাপন করতে হবে তা নির্দিষ্ট করতে হবে।
ধরুন টেবিলে এর মতো একটি প্রাথমিক কী রয়েছে:
ALTER TABLE dbo.pt ADD CONSTRAINT ptc PRIMARY KEY CLUSTERED (Id) ON [PRIMARY];
এই টেবিলটি বিভাজন করতে আপনাকে প্রথমে প্রতিবন্ধকতা ফেলে দিতে হবে:
ALTER TABLE dbo.pt DROP CONSTRAINT ptc;
তারপরে আপনাকে পার্টিশনযুক্ত ক্লাস্টারড ইনডেক্স তৈরি করতে হবে:
CREATE UNIQUE CLUSTERED INDEX ptci ON dbo.pt(pc, Id) ON ps1(pc) ;
আপনি যদি PRIMARY KEY
সীমাবদ্ধ না হয়ে সীমাবদ্ধতা পুনরায় তৈরি করতে চান তবে আপনি এটি করতে পারেন:
ALTER TABLE dbo.pt ADD CONSTRAINT ptc PRIMARY KEY NONCLUSTERED (Id) ON [PRIMARY];
৪. আপনার টেবিলটিতে একটি ক্লাস্টার্ড সূচক নেই
এই ক্ষেত্রে পার্টিশনটি প্রতিষ্ঠার জন্য বেশিরভাগ ক্ষেত্রে কেবল একটি ক্লাস্টারড ইনডেক্স তৈরি করা বাঞ্ছনীয়। আপনি এর জন্য পূর্বে দেখা সূচক বিবৃতি ব্যবহার করতে পারেন:
CREATE UNIQUE CLUSTERED INDEX ptci ON dbo.pt(pc, Id) ON ps1(pc) ;
তবে, যদি আপনার কাছে একটি ক্লাস্টার্ড সূচক তৈরি না করার উপযুক্ত কারণ থাকে তবে আপনি নিম্নলিখিত দুটি-পদক্ষেপের পদ্ধতির সাথে দূরে সরে যেতে পারেন। দুঃখজনকভাবে এই পরিবর্তনটি করার সরাসরি কোনও উপায় নেই।
ধরে নিন আপনার টেবিলটির একটি ক্লাস্টার্ড সূচক নেই। টেবিলটি বিভাজন করতে আপনাকে প্রথমে একটি CLUSTERED UNIQUE
সীমাবদ্ধতা তৈরি করতে হবে । (আপনিও CLUSTERED PRIMARY KEY
বাধা ব্যবহার করতে পারেন )। আপনার যদি কলাম সংমিশ্রণ থাকে যা অনন্য যে এটি একটি সরল পদক্ষেপ:
ALTER TABLE dbo.pt ADD CONSTRAINT ptc UNIQUE CLUSTERED(pc,id);
সীমাবদ্ধতা তৈরি হওয়ার পরে আপনি এটিকে আবার ফেলে দিতে পারেন এবং একই সময়ে টেবিলটিকে নতুন পার্টিশন স্কিমে "স্থানান্তরিত" করতে পারেন:
ALTER TABLE dbo.pt DROP CONSTRAINT ptc WITH(MOVE TO ps1(pc));
যদি আপনার কাছে অনন্য কলামের সংমিশ্রণ না থাকে তবে আপনার ভাগ্যের বাইরে। এই ক্ষেত্রে আপনার একমাত্র বিকল্পটি একটি নতুন কলাম যুক্ত করা এবং এটি অনন্য মান সহ পূরণ করা fill যদি টেবিলটি যথাযথভাবে ছোট হয় তবে আপনি এরকম কিছু করতে পারেন:
ALTER TABLE dbo.pt ADD tmp_id INT IDENTITY(1,1);
তবে, সমস্ত সারিটির মূল্য না হওয়া পর্যন্ত এটি একচেটিয়া টেবিল লক নেবে। টেবিলের আকারের উপর নির্ভর করে এটি বেশ কিছু সময়ের জন্য হতে পারে। এই কলামটি তৈরি হওয়ার পরে প্রথমে UNIQUE
সীমাবদ্ধতা তৈরি করতে উপরের দুটি পদক্ষেপ অনুসরণ করুন এবং তারপরে সরাসরি এটিকে আবার ফেলে দিন। এরপরে আপনি আবার কলামটিও ড্রপ করতে পারেন। এই সমস্ত পদক্ষেপগুলি মোটামুটি অনুপ্রবেশকারী, সুতরাং আপনি সম্ভবত টেবিলের উপরে একটি ক্লাস্টারড সূচক তৈরি করা ভাল। এমনকি অনন্য হতে হবে না।
আপনার যদি এন্টারপ্রাইজ সংস্করণ থাকে তবে আপনি WITH(ONLINE=ON)
উপরের বেশিরভাগ বিবৃতিতে ক্লজটি ব্যবহার করতে পারেন । এটি আপনার সংযোগটি অন্য সংযোগে উপলব্ধ রাখবে। তবে, সেই সময়ের মধ্যে একটি পারফরম্যান্স প্রভাব থাকবে impact