কেন কোনও টেম্প টেবিল হ্যালোইন সমস্যার উত্সাহী স্পুলের চেয়ে আরও কার্যকর সমাধান?


14

নিম্নলিখিত কোয়েরিটি বিবেচনা করুন যা কেবলমাত্র যদি তারা ইতিমধ্যে লক্ষ্য সারণীতে না থাকে তবে উত্স টেবিল থেকে সারি সন্নিবেশ করান:

INSERT INTO dbo.HALLOWEEN_IS_COMING_EARLY_THIS_YEAR WITH (TABLOCK)
SELECT maybe_new_rows.ID
FROM dbo.A_HEAP_OF_MOSTLY_NEW_ROWS maybe_new_rows
WHERE NOT EXISTS (
    SELECT 1
    FROM dbo.HALLOWEEN_IS_COMING_EARLY_THIS_YEAR halloween
    WHERE maybe_new_rows.ID = halloween.ID
)
OPTION (MAXDOP 1, QUERYTRACEON 7470);

একটি সম্ভাব্য পরিকল্পনার আকারের মধ্যে একটি মার্জ জয় এবং একটি উত্সাহী স্পুল অন্তর্ভুক্ত। হ্যালোইন সমস্যা সমাধানের জন্য উত্সাহী স্পুল অপারেটর উপস্থিত আছেন :

প্রথম পরিকল্পনা

আমার মেশিনে উপরের কোডটি প্রায় 6900 এমএসে কার্যকর করে। টেবিলগুলি তৈরি করতে রেপ্রো কোডটি প্রশ্নের নীচে অন্তর্ভুক্ত করা হয়েছে। আমি যদি পারফরম্যান্সে অসন্তুষ্ট হয়ে থাকি তবে আমি উত্সাহী স্পুলের উপর নির্ভর না করে টেম্প টেবিলের মধ্যে সন্নিবেশ করানোর জন্য সারিগুলি লোড করার চেষ্টা করতে পারি। এখানে একটি সম্ভাব্য বাস্তবায়ন:

DROP TABLE IF EXISTS #CONSULTANT_RECOMMENDED_TEMP_TABLE;
CREATE TABLE #CONSULTANT_RECOMMENDED_TEMP_TABLE (
    ID BIGINT,
    PRIMARY KEY (ID)
);

INSERT INTO #CONSULTANT_RECOMMENDED_TEMP_TABLE WITH (TABLOCK)
SELECT maybe_new_rows.ID
FROM dbo.A_HEAP_OF_MOSTLY_NEW_ROWS maybe_new_rows
WHERE NOT EXISTS (
    SELECT 1
    FROM dbo.HALLOWEEN_IS_COMING_EARLY_THIS_YEAR halloween
    WHERE maybe_new_rows.ID = halloween.ID
)
OPTION (MAXDOP 1, QUERYTRACEON 7470);

INSERT INTO dbo.HALLOWEEN_IS_COMING_EARLY_THIS_YEAR WITH (TABLOCK)
SELECT new_rows.ID
FROM #CONSULTANT_RECOMMENDED_TEMP_TABLE new_rows
OPTION (MAXDOP 1);

নতুন কোড প্রায় 4400 এমএসে কার্যকর করে। অপারেটর স্তরে কোথায় সময় ব্যয় করা হয় তা পরীক্ষা করতে আমি প্রকৃত পরিকল্পনা পেতে পারি এবং আসল সময় পরিসংখ্যান ব্যবহার করতে পারি। নোট করুন যে প্রকৃত পরিকল্পনা চেয়ে জিজ্ঞাসা করা এই প্রশ্নের জন্য উল্লেখযোগ্য ওভারহেড যুক্ত করে যাতে মোটের ফলাফলগুলি আগের ফলাফলগুলির সাথে মেলে না।

╔═════════════╦═════════════╦══════════════╗
  operator    first query  second query 
╠═════════════╬═════════════╬══════════════╣
 big scan     1771         1744         
 little scan  163          166          
 sort         531          530          
 merge join   709          669          
 spool        3202         N/A          
 temp insert  N/A          422          
 temp scan    N/A          187          
 insert       3122         1545         
╚═════════════╩═════════════╩══════════════╝

উত্সাহী স্পুলের সাথে ক্যোয়ারী পরিকল্পনাটি টেম্প টেবিলটি ব্যবহার করে এমন পরিকল্পনার তুলনায় সন্নিবেশ এবং স্পুল অপারেটরগুলিতে উল্লেখযোগ্যভাবে আরও বেশি সময় ব্যয় করবে বলে মনে হচ্ছে।

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

কেউ যদি জানতে চায় তবে আমি এসকিউএল সার্ভার 2017 সিইউ 11 এ আছি। উপরের প্রশ্নগুলিতে ব্যবহৃত টেবিলগুলি পপুলেট করার জন্য এখানে কোড রয়েছে:

DROP TABLE IF EXISTS dbo.HALLOWEEN_IS_COMING_EARLY_THIS_YEAR;

CREATE TABLE dbo.HALLOWEEN_IS_COMING_EARLY_THIS_YEAR (
ID BIGINT NOT NULL,
PRIMARY KEY (ID)
);

INSERT INTO dbo.HALLOWEEN_IS_COMING_EARLY_THIS_YEAR WITH (TABLOCK)
SELECT TOP (20000000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM master..spt_values t1
CROSS JOIN master..spt_values t2
CROSS JOIN master..spt_values t3
OPTION (MAXDOP 1);


DROP TABLE IF EXISTS dbo.A_HEAP_OF_MOSTLY_NEW_ROWS;

CREATE TABLE dbo.A_HEAP_OF_MOSTLY_NEW_ROWS (
ID BIGINT NOT NULL
);

INSERT INTO dbo.A_HEAP_OF_MOSTLY_NEW_ROWS WITH (TABLOCK)
SELECT TOP (1900000) 19999999 + ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;

উত্তর:


14

এটিকে আমি ম্যানুয়াল হ্যালোইন সুরক্ষা বলি ।

আমার নিবন্ধে একটি আপডেট স্টেটমেন্টের সাথে এটি ব্যবহারের একটি উদাহরণ খুঁজে পেতে পারে আপডেট কোয়েরিগুলি অনুকূলিত করা । একই শব্দার্থক সংরক্ষণের জন্য একজনকে কিছুটা সতর্কতা অবলম্বন করতে হবে, উদাহরণস্বরূপ, সমস্ত সমবর্তী পরিবর্তনের বিরুদ্ধে লক্ষ্য টেবিলটি লক করে পৃথক অনুসন্ধানগুলি কার্যকর করা হয়, যদি এটি আপনার পরিস্থিতিতে প্রাসঙ্গিক হয়।

টেম্প টেবিল সহ পরিকল্পনাটি আরও দক্ষ কেন? একটি উত্সাহী স্পুল কি বেশিরভাগ ক্ষেত্রে কেবল একটি অভ্যন্তরীণ টেম্প টেবিল নয়?

একটি স্পুলে অস্থায়ী টেবিলের কিছু বৈশিষ্ট্য রয়েছে তবে দুটি সঠিক সমতুল্য নয়। বিশেষত, একটি স্পুলটি মূলত একটি বি-গাছের কাঠামোতে সারি-সারি অ-বিন্যাসিত সন্নিবেশ । এটি লকিং এবং লগিং অপ্টিমাইজেশান থেকে উপকৃত হয় তবে বাল্ক লোড অপটিমাইজেশন সমর্থন করে না ।

ফলস্বরূপ, কেউ প্রায়শই প্রাকৃতিক উপায়ে ক্যোয়ারীটিকে বিভক্ত করে আরও ভাল পারফরম্যান্স পেতে পারে: নতুন সারিগুলি একটি অস্থায়ী টেবিল বা ভেরিয়েবলের মধ্যে লোড করা, তারপরে অস্থায়ী অবজেক্ট থেকে একটি অপ্টিমাইজড সন্নিবেশ (সুস্পষ্ট হ্যালোইন সুরক্ষা ব্যতীত) সম্পাদন করে।

এই বিভাজনটি তৈরি করা আপনাকে মূল বক্তব্যটির অংশগুলি পৃথকভাবে পড়ার এবং লেখার জন্য অতিরিক্ত স্বাধীনতার অনুমতি দেয় freedom

পার্শ্ব নোট হিসাবে, হ্যালোইন সমস্যাটি সারি সংস্করণ ব্যবহার করে কীভাবে মোকাবেলা করা যেতে পারে তা চিন্তা করা আকর্ষণীয়। সম্ভবত এসকিউএল সার্ভারের ভবিষ্যতের সংস্করণ উপযুক্ত পরিস্থিতিতে সেই বৈশিষ্ট্যটি সরবরাহ করবে।


মাইকেল কুটজ যেভাবে একটি মন্তব্যে ইঙ্গিত করেছেন, আপনি স্পষ্ট এইচপি এড়াতে গর্ত পূরণের অপ্টিমাইজেশনকে কাজে লাগানোর সম্ভাবনাটিও আবিষ্কার করতে পারেন । ডেমোটির জন্য এটি অর্জনের একটি উপায় হ'ল এর IDকলামে একটি অনন্য সূচক (যদি আপনি চান তবে ক্লাস্টারড) তৈরি করা A_HEAP_OF_MOSTLY_NEW_ROWS

CREATE UNIQUE INDEX i ON dbo.A_HEAP_OF_MOSTLY_NEW_ROWS (ID);

সেই গ্যারান্টিটি জায়গায় রেখে অপ্টিমাইজারটি হোল-ফিলিং এবং রোসেট শেয়ারিং ব্যবহার করতে পারে:

MERGE dbo.HALLOWEEN_IS_COMING_EARLY_THIS_YEAR WITH (SERIALIZABLE) AS HICETY
USING dbo.A_HEAP_OF_MOSTLY_NEW_ROWS AS AHOMNR
    ON AHOMNR.ID = HICETY.ID
WHEN NOT MATCHED BY TARGET
THEN INSERT (ID) VALUES (AHOMNR.ID);

মার্জ পরিকল্পনা

আকর্ষণীয় হলেও, আপনি এখনও যত্ন সহকারে প্রয়োগ করা ম্যানুয়াল হ্যালোইন সুরক্ষা নিয়োগের মাধ্যমে অনেক ক্ষেত্রে আরও ভাল পারফরম্যান্স অর্জন করতে সক্ষম হবেন।


5

পলের উত্তরটি কিছুটা প্রসারিত করার জন্য, স্পুল এবং টেম্প টেবিলের পদ্ধতির মধ্যে অতিবাহিত সময়ের মধ্যে পার্থক্যের একটি অংশ DML Request Sortস্পুল পরিকল্পনায় বিকল্পটির পক্ষে সমর্থন অভাবের দিকে চলে আসে বলে মনে হচ্ছে । অনির্ধারিত ট্রেস পতাকা 8795 সহ, টেম্প টেবিলের পদ্ধতির জন্য অতিবাহিত সময়টি 4400 এমএস থেকে 5600 এমএসে লাফিয়ে যায়।

INSERT INTO dbo.HALLOWEEN_IS_COMING_EARLY_THIS_YEAR WITH (TABLOCK)
SELECT new_rows.ID
FROM #CONSULTANT_RECOMMENDED_TEMP_TABLE new_rows
OPTION (MAXDOP 1, QUERYTRACEON 8795);

মনে রাখবেন যে এটি স্পুল প্ল্যান দ্বারা সম্পাদিত সন্নিবেশটির ঠিক সমান নয়। এই ক্যোয়ারী লেনদেন লগের উল্লেখযোগ্যভাবে আরও ডেটা লিখে।

একই কৌশল কিছু কৌশল সঙ্গে বিপরীতে দেখা যেতে পারে। এসকিউএল সার্ভারকে হ্যালোইন সুরক্ষার জন্য স্পুলের পরিবর্তে বাছাই করতে উত্সাহ দেওয়া সম্ভব। একটি বাস্তবায়ন:

INSERT INTO dbo.HALLOWEEN_IS_COMING_EARLY_THIS_YEAR WITH (TABLOCK)
SELECT TOP (987654321) 
maybe_new_rows.ID
FROM dbo.A_HEAP_OF_MOSTLY_NEW_ROWS maybe_new_rows
WHERE NOT EXISTS (
    SELECT 1
    FROM dbo.HALLOWEEN_IS_COMING_EARLY_THIS_YEAR halloween
    WHERE maybe_new_rows.ID = halloween.ID
)
ORDER BY maybe_new_rows.ID, maybe_new_rows.ID + 1
OPTION (MAXDOP 1, QUERYTRACEON 7470, MERGE JOIN);

এখন পরিকল্পনার স্পুলের জায়গায় একটি শীর্ষ এন বাছাই করা অপারেটর রয়েছে। বাছাই একটি ব্লকিং অপারেটর তাই স্পুল আর প্রয়োজন হয় না:

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

আরও গুরুত্বপূর্ণ, এখন আমাদের DML Request Sortবিকল্পটির জন্য সমর্থন রয়েছে । প্রকৃত সময় সংক্রান্ত পরিসংখ্যানগুলির দিকে আবার তাকানো, সন্নিবেশকারী অপারেটরটি এখন কেবল 1623 এমএস লাগে। একটি বাস্তব পরিকল্পনা অনুরোধ না করে পুরো পরিকল্পনাটি কার্যকর করতে প্রায় 5400 এমএস লাগে।

হুগো যেমন ব্যাখ্যা করেছেন , ইজিগার স্পুল অপারেটর অর্ডার সংরক্ষণ করে। এটি সবচেয়ে সহজেই কোনও TOP PERCENTপরিকল্পনার সাথে দেখা যায় । এটি দুর্ভাগ্যজনক যে স্পুল সহ মূল ক্যোয়ারী স্পুলের ডেটার সাজানো প্রকৃতির আরও ভাল সুবিধা নিতে পারে না।

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