এমএসজি 666 80 এম-সারি ইনডেক্সড টেবিলটিতে সন্নিবেশ ক্যোয়ারী চালানোর সময় running


10

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

সজ্জিত পদ্ধতিটি শেষ ধাপে ব্যর্থ হয় যখন এটি নীচের কাঠামোর সাহায্যে একটি টেবিলের মধ্যে একটি সারি সন্নিবেশ করানোর চেষ্টা করে:

Columns:
A_Id: PK, int
B_Id: PK, FK, int
C_Id: PK, FK, int
D_Id: PK, smallint 

এটি মূলত একটি টেবিল যা সমস্ত রেফারেন্সড সত্তাকে এক সাথে সংযুক্ত করে।

Indexes:
IX_TableName_D_id - Clustered index on D_id column
PK_TableName - Unique non-clustered index on all columns (A_Id, B_Id, C_Id, D_Id)

উভয় সূচকের জন্য খণ্ডন কম (<25%)। তবে টেবিলটিতে অপারেশন করার পরিমাণটি তীব্র হওয়ায় পিকে_টেবলনেম টুকরোগুলি দ্রুত বৃদ্ধি পায়।

টেবিলের আকার:

Row count: ~80,000,000 rows

সুতরাং, যখন আমি কোনও ভীরি সহজ জিজ্ঞাসা চালানোর চেষ্টা করি তখন ডি_আইডি-র কিছুগুলির জন্য আমি নিম্নলিখিত বার্তাটি পাই:

এমএসজি 6 666. পার্টিশনের আইডি 422223771074560 সহ সূচকের জন্য সদৃশ দলের জন্য সুনির্দিষ্ট সিস্টেম-উত্পন্ন অনন্য মানকে ছাড়িয়ে গেছে the অন্যথায়, অন্য একটি ক্লাস্টারিং কী ব্যবহার করুন।

প্রশ্নের উদাহরণ:

INSERT INTO TableName
(A_Id,B_Id,C_Id,D_id)
VALUES (1,1,1,14)

উদাহরণস্বরূপ, যখন আমি কিছু মানগুলিতে ডি_আইডি সেট করি - এটি ব্যর্থ হয়, উদাহরণস্বরূপ '14'। যদি আমি ডি_আইডি অন্যান্য মানগুলিতে (1,2,3, ... 13, 15,16, ...) সেট করে রাখি, তবে ক্যোয়ারীটি ঠিক আছে।

আমার সন্দেহ হয় সূচকের সাথে সত্যিই খারাপ কিছু হচ্ছে ... তবে আমি এর নীচে পৌঁছতে পারি না ... :( কেন এটি ব্যর্থ হয়?

উত্তর:


16

সাইজের টেবিলে সমস্যা দেখা দেওয়ার জন্য রেমাস দ্বারা উল্লিখিত লো-সিলেক্টিভিটি ইস্যুটি নিজে থেকে পর্যাপ্ত নয়।

ইউনিকফায়ার শুরু হয় 1এবং 2,147,483,646প্রকৃতপক্ষে সীমার উপচে পড়ার আগে পর্যন্ত যেতে পারে ।

সমস্যাটি দেখতে বারবার মুছে ফেলার এবং সন্নিবেশ করার সঠিক প্যাটার্নও এটি দরকার।

CREATE TABLE T
(
X SMALLINT,
Y INT IDENTITY PRIMARY KEY NONCLUSTERED
)

CREATE CLUSTERED INDEX IX ON T(X)

INSERT INTO T VALUES (1),(1),(1),(2),(2)

দেয়

+---+---+-------------+
| X | Y | Uniqueifier |
+---+---+-------------+
| 1 | 1 |             |
| 1 | 2 |           1 |
| 1 | 3 |           2 |
| 2 | 4 |             |
| 2 | 5 |           1 |
+---+---+-------------+

তারপরে চলছে

DELETE FROM T 
WHERE Y IN (2,3)

INSERT INTO T VALUES (1),(1)

দেয়

+---+---+-------------+
| X | Y | Uniqueifier |
+---+---+-------------+
| 1 | 1 |             |
| 1 | 6 |           3 |
| 1 | 7 |           4 |
| 2 | 4 |             |
| 2 | 5 |           1 |
+---+---+-------------+

সেক্ষেত্রে ইউনিকফায়ারারটি মুছে ফেলা সারিগুলি থেকে মানগুলি পুনরায় ব্যবহার করে নি।

তবে তারপর চলছে

DELETE FROM T 
WHERE Y IN (6,7)
WAITFOR DELAY '00:00:10'
INSERT INTO T VALUES (1),(1)

দেয়

+---+---+-------------+
| X | Y | Uniqueifier |
+---+---+-------------+
| 1 | 1 |             |
| 1 | 8 |           1 |
| 1 | 9 |           2 |
| 2 | 4 |             |
| 2 | 5 |           1 |
+---+---+-------------+

দেখানো হচ্ছে যে উচ্চতর জলের চিহ্নটি সর্বাধিক স্বতন্ত্রকরণ মূল্যের সাথে সদৃশ মুছার পরে পুনরায় সেট করা যেতে পারে। বিলম্বটি ছিল ঘোস্ট রেকর্ড ক্লিনআপ প্রক্রিয়াটি চালানোর অনুমতি দেওয়া।

2 বিলিয়ন ডুপ্লিকেট সন্নিবেশ করানোর জন্য জীবনটি খুব সংক্ষিপ্ত বলে আমি তখন DBCC WRITEPAGEম্যানুয়ালি সর্বোচ্চ uniqueifier২,১77,৪83,,64৪৪ এ সর্বোচ্চটি সামঞ্জস্য করতাম

এখানে চিত্র বর্ণনা লিখুন

আমি তখন দৌড়ে গেলাম

INSERT INTO T VALUES (1)

একাধিক বার. এটি দু'বার সাফল্য পেয়েছে এবং error 66 attempt ত্রুটি সহ তৃতীয় প্রচেষ্টাটিতে ব্যর্থ হয়েছিল।

এটি আসলে আমি অনুমান করা চেয়ে কম ছিল। এর অর্থ যে সর্বাধিক স্বতন্ত্রকরণ inোকানো হয়েছে 2,147,483,646 সর্বাধিক অন্তর্নির্মিত আকারের চেয়ে 2,147,483,647


তথ্যমূলক উদ্দেশ্যে, আপনি যদি TRUNCATE TABLEইউনিকফায়ারটিকে পুনরায় সেট করেন তবে পরীক্ষা করতে পারেন ?
জন সেগেল

@ জোনসিগেল - হ্যাঁ, মনে হচ্ছে। চলার INSERT INTO T VALUES (1),(1),(1),(2),(2);TRUNCATE TABLE T;INSERT INTO T VALUES (1),(1),(1),(2),(2)পরে সর্বোচ্চ ইউনিকফায়ার হ'ল 2 আমি অনুমান করি যে এটি ইতিমধ্যে সেই কীটির (ভূতের রেকর্ড সহ) উপস্থিত রয়েছে এমন সর্বোচ্চ ইউনিকফায়ারটির দিকে তাকিয়ে আছে
মার্টিন স্মিথ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.