একটি বিদ্যমান বিভাজনযুক্ত টেবিলকে কীভাবে পার্টিশন করবেন


22

আমার কাছে ডেটা সহ একটি বিদ্যমান টেবিল রয়েছে:

dbo.Test (col1,col2,col3....) ON [PRIMARY]

আমাকে এই টেবিলটি এভাবে বিভাজন করতে পরিবর্তন করতে হবে:

dbo.Test(col1,col2,col3....) ON Ps_Date(Col2)

আমি কীভাবে টেবিলটি বাদ দিয়ে এবং পুনরায় তৈরি না করে এটি অর্জন করতে পারি?

উত্তর:


23

একটি টেবিল বিভাজন করতে, আপনি নীচের সংক্ষিপ্ত পদক্ষেপগুলি অনুসরণ করতে পারেন:

  • প্রথমে একটি পার্টিশন ফাংশন এবং পার্টিশন স্কিম তৈরি করুন
  • এর পরে আপনি একটি টেবিল বিভাজন করতে পারেন।
  • যদি আপনার টেবিলটির একটি ক্লাস্টার্ড সূচক থাকে, তবে আপনাকে এটিকে ডান পার্টিশনে ফেলে এবং পুনরায় DROP_EXISTINGতৈরি করতে হবে বা ক্লাস্টার ইনডেক্সটি পুনরায় তৈরি করতে আপনি ক্লজটি ব্যবহার করতে পারেন ।
  • যদি আপনার টেবিলটিতে একটি ক্লাস্টার্ড সূচক না থাকে তবে আপনি পার্টিশন স্কিমটি ব্যবহার করে ডান পার্টিশনের জন্য একটি তৈরি করতে পারেন।
  • এছাড়াও এন্টারপ্রাইজ সংস্করণেONLINE=ON আপনার আবেদনের জন্য যে কোনও ডাউনটাইম হ্রাস করতে CREATE INDEX বিবৃতিটির বিকল্পটি ব্যবহার করার নমনীয়তা রয়েছে । নোট করুন যে অন লাইন বিকল্পটি ব্যবহার করে সূচি পুনর্নির্মাণের সময় আপনি একটি কার্য সম্পাদনের অবনতি দেখতে পাবেন।

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

কিছু ভাল সম্পদ:


53

আপনার টেবিলের একটি ক্লাস্টার ইনডেক্স আছে কিনা তা আপনি নির্দিষ্ট করবেন না, তাই আসুন সমস্ত বিকল্পের মধ্য দিয়ে চলুন।

আমি এই উদাহরণটি পার্টিশন ফাংশন, পার্টিশন স্কিম এবং টেবিলটি ব্যবহার করতে যাচ্ছি:

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


1
দুর্দান্ত, সাবাস্তিয়ান! সবেমাত্র দুর্দান্ত ফ্ল্যাট! কেবল উপরের # 3 তে যুক্ত করতে ... আপনি যদি সুইচটি ইন বা আউট ব্যবহার করতে চান তবে সমস্ত সূচী অবশ্যই প্রান্তিককরণ করতে হবে। একটি ক্লাস্টারবিহীন, অ-বিন্যস্ত পিকে তৈরি করা আপনাকে প্রথমে সূচকটি নামানোর পদক্ষেপ না নিলে, সুইচ (এটি যেদিকেই থাকুক না কেন) না করে এবং সূচকটি পুনর্নির্মাণ না করে আপনাকে সুইচ করতে দেবে না। এটি প্রায়শই মুছে ফেলা সমতুল্য করার চেয়ে আরও দ্রুত এবং অবশ্যই, যদি আপনার সুইচ ব্যবহার করার প্রয়োজন না হয় তবে সমস্যা হবে না।
জেফ মোডেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.