আমি কি পার্টিশন কী আপডেট করে পার্টিশনের মধ্যে সারি সরাতে পারি?


17

আমি ভাবব যে এটি মোটামুটি সহজ প্রশ্ন হবে, তবে আসলে এর উত্তর খুঁজে পেতে আমার খুব সমস্যা হয়েছিল।

প্রশ্ন: আপনি কি পার্টিশন সারণিটি পার্টিশন সীমাটি অতিক্রম করে কেবল পার্টিশন কলামটি আপডেট করে একটি পার্টিশনযুক্ত টেবিলের মধ্যে এক পার্টিশন থেকে অন্য অংশে সরিয়ে নিতে পারেন?

উদাহরণস্বরূপ, যদি আমার কাছে একটি টেবিল থাকে যাতে একটি পার্টিশন কী থাকে:

CREATE TABLE SampleTable
(
    SampleID INT PRIMARY KEY,
    SampleResults VARCHAR(100) NOT NULL,
)

পার্টিশন ফাংশন সহ যা প্রাথমিক কীতে মানচিত্র করে:

CREATE PARTITION FUNCTION MyPartitionFunc (INT) AS
RANGE LEFT FOR VALUES (10000, 20000);

আমি কি স্যাম্পলআইডি 1 থেকে 500,000 এ পরিবর্তন করে প্রথম পার্টিশন থেকে তৃতীয় বিভাজনে একটি সারি সরাতে পারি?

দ্রষ্টব্য: আমি এটিকে দু'একটি এসএলএল সার্ভার 2005 এবং 2008 হিসাবে ট্যাগ করছি, যেহেতু তারা উভয়ই বিভাজনকে সমর্থন করে। তারা কি এটি অন্যভাবে পরিচালনা করে?

উত্তর:


14

পরীক্ষার জন্য আমার কাছে 2005 এর সার্ভার নেই। ২০০৮ তবে প্রত্যাশার মতো এটি পরিচালনা করছে:

USE [Test]
GO
CREATE TABLE [IDRanges](
    [ID] [int] NOT NULL
)
GO

CREATE PARTITION FUNCTION IDRange1 (int)
AS RANGE LEFT FOR VALUES (10) ;
GO
--Add one record to each partition
INSERT INTO IDRanges ([ID]) VALUES (17)
INSERT INTO IDRanges ([ID]) VALUES (7)
GO
--Verify records in partition
SELECT $PARTITION.IDRange1([ID]) AS Partition, COUNT(*) AS [COUNT] 
FROM IDRanges
GROUP BY $PARTITION.IDRange1([ID]) 
ORDER BY Partition ;
GO
--Move row between partitions
UPDATE IDRanges
SET [ID] = 8 WHERE [ID] = 17
GO
--Verify records in partition
SELECT $PARTITION.IDRange1([ID]) AS Partition, COUNT(*) AS [COUNT] 
FROM IDRanges
GROUP BY $PARTITION.IDRange1([ID]) 
ORDER BY Partition ;

আপডেটের আগে আপনার প্রতিটি পার্টিশনে একটি করে রেকর্ড এবং তার পরে প্রথম বিভাগে উভয় রেকর্ড দেখতে হবে।


1
এটি উত্তরের একটি সুন্দর কাজ!
মারিয়ান

আপনি এসকিউএল সার্ভার 2005-এ বর্ণনা করার সাথে সাথে এটি কার্যকর করে
বেন ব্রোকা 21

-1 এটি দৃশ্যের পরীক্ষা করে না। $PARTITIONকেবলমাত্র ইনপুটটির ভিত্তিতে পার্টিশন নম্বর গণনা করে; এটি আসলে পরীক্ষা করে না যে সারিটি শারীরিকভাবে কোথায় থাকে।
জন সেগেল

9

এটি পরীক্ষা করার জন্য, পরীক্ষার আসলে টেবিলটি বিভাজন করা দরকার। Http://www.kodyaz.com/articles/how-to-partition-table-non-partitioned-table-sql-server-2008.aspx দেখুন

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

টেবিলটি বিভক্ত করার জন্য আপনাকে ফাইল গ্রুপ এবং একটি বিভাজন স্কিম তৈরি করতে হবে যা ফাইল গ্রুপগুলিতে ফাংশন ফলাফল নির্ধারণের জন্য পার্টিশন ফাংশন ব্যবহার করে। তারপরে আপনাকে টেবিলে একটি ক্লাস্টার্ড কী লাগাতে হবে যা সেই বিভাজন স্কিমটি ব্যবহার করে।

পার্টিশন সেট আপ করুন

আমি কমান্ড লাইন এসকিউএল বিশেষজ্ঞ নই। আমি পিএসজি ফাইল ফাইল (পিএফ 1 ফাইল সহ) এবং পিএফজি 2 (পিএফ 2 ফাইল সহ) ফাইল সেটআপ করতে এসএসএমএস ইন্টারফেস ব্যবহার করেছি। তারপরে আমি পার্টিশন কার্যক্রম এবং স্কিম ঘোষণা করেছি:

CREATE PARTITION FUNCTION IDRange1 (int)
AS RANGE LEFT FOR VALUES (10) ;
GO

CREATE PARTITION SCHEME ps_IDRange1
AS PARTITION IDRange1
TO (pfg1, pfg2)
GO

সারণী এবং গোষ্ঠী সূচক তৈরি করুন

CREATE TABLE [IDRanges](
    [ID] [int] NOT NULL
)
GO

CREATE CLUSTERED INDEX PK_IDRanges
ON dbo.IDRanges(id) ON ps_IDRange1 (ID)
GO

আপনি এটি করার পরে, যখন আপনি sys.partitions (আমার 2005) রয়েছে ক্যোয়ারী করুন, আপনি দেখতে পাবেন যে টেবিলটিতে এখন টেবিলের জন্য একটির পরিবর্তে দুটি পার্টিশন রয়েছে। এটি ইঙ্গিত করে যে আমরা এই টেবিলের জন্য পার্টিশন সম্পূর্ণরূপে প্রয়োগ করেছি।

select * from sys.partitions where object_id = object_id('IDRanges')
পার্টিশন_আইড অবজেক্ট_আইড ইনডেক্স_আইডি পার্টিশন_সংখ্যার হোবিট_আইডি সারি
-------------------- ----------- ----------- -------- -------- -------------------- --------------------
72057597780295680 770674389 1 1 72057597780295680 0
72057597780361216 770674389 1 2 72057597780361216 0

এখন আমাদের দুটি পার্টিশন রয়েছে (প্রত্যেকটির জন্য একটি সারি গণনা রয়েছে), আমরা একটি পরীক্ষা চালাতে পারি।

সারি Inোকান

INSERT INTO IDRanges ([ID]) VALUES (17)
INSERT INTO IDRanges ([ID]) VALUES (7)

কি হয়েছে তা দেখতে সিস্টেমে পার্টিশনগুলি দেখুন।

select * from sys.partitions where object_id = object_id('IDRanges')
পার্টিশন_আইড অবজেক্ট_আইড ইনডেক্স_আইডি পার্টিশন_সংখ্যার হোবিট_আইডি সারি
-------------------- ----------- ----------- -------- -------- -------------------- --------------------
72057597780295680 770674389 1 1 72057597780295680 1
72057597780361216 770674389 1 2 72057597780361216 1

হাঁ। প্রতিটি পার্টিশনে একটি সারি।

একটি সারি সরানো।

UPDATE IDRanges
SET [ID] = 8 WHERE [ID] = 17

পার্টিশন পরীক্ষা করুন

select * from sys.partitions where object_id = object_id('IDRanges')
পার্টিশন_আইড অবজেক্ট_আইড ইনডেক্স_আইডি পার্টিশন_সংখ্যার হোবিট_আইডি সারি
-------------------- ----------- ----------- -------- -------- -------------------- --------------------
72057597780295680 770674389 1 1 72057597780295680 2
72057597780361216 770674389 1 2 72057597780361216 0

প্রথম পার্টিশনে এখন 1 এর পরিবর্তে দুটি সারি রয়েছে এবং দ্বিতীয় পার্টিশনে দুটিটির পরিবর্তে শূন্য সারি রয়েছে।

আমি মনে করি এটি নিশ্চিত করে যে পার্টিশনযুক্ত টেবিলের ক্লাস্টার কীটি সংশোধন করার ফলে সারিটি স্বয়ংক্রিয়ভাবে সরানো হয়েছিল।


1
এই প্রশ্নের প্রথম উত্তরের জন্য +1 যা বাস্তবে দৃশ্যের পরীক্ষা করে। ডিবিএ.এসই তে স্বাগতম!
জন সেগেল

-1 আপনি কি আমাকে এমএসডিএন ডকুমেন্টগুলিতে ইঙ্গিত করতে পারেন যা আপনার প্রয়োজনীয়তাগুলিকে কোনও টেবিল 'সম্পূর্ণ' বিভাজনে সমর্থন করে? বিশেষত পৃথক ফাইল-গোষ্ঠী এবং একটি ক্লাস্টার ইনডেক্সের প্রয়োজনীয়তা?
কেনেথ

-2

আমি উত্তরটি সঠিক বলে মনে করি না। আপনি যখন মান ব্যবহার করবেন

 $PARTITION.IDRange1([ID]) AS Partition

পার্টিশনটি কী হওয়া উচিত তা আপনি পুনরায় গণনা করছেন, বর্তমানে রেকর্ডটি কোথায় নেই।

আপনার ব্যবহার করা উচিত:

select * from sys.partitions where object_id = object_id('IDRanges')

২০০q সালে এসকিএল-তে আমার পরীক্ষাগুলিতে মান পরিবর্তন হয় তবে রেকর্ডটি একই পার্টিশনে থাকে। এটি সম্ভবত পরিসংখ্যান এবং অপ্টিমাইজারের সাথে জগাখিচুড়ি করবে কারণ এটি একটি মাল্টি থ্রেড মোডে চলবে যা আশা করে একটি পার্টিশনটি একটি নির্দিষ্ট পরিসরে থাকবে। এটি কেবলমাত্র প্রাসঙ্গিক পার্টিশনের অনুসন্ধানের জন্য পার্টিশন নির্মূলের ব্যবহার করার চেষ্টা করলে এটি সম্পূর্ণরূপে ভুল হবে। আমি মনে করি আপনার প্রতিটি রেকর্ড মুভ করার জন্য মুছতে এবং পুনরায় সন্নিবেশ করা দরকার।


2
$partition এখানে জন্য অনুসন্ধান পরামর্শ দেয় যে গৃহীত উত্তর সঠিক। আপনি কীভাবে নিশ্চিত করছেন যে রেকর্ডটি আপডেট হওয়ার পরে একই পার্টিশনে থাকবে?
নিক চ্যামাস

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