নিম্নলিখিত কোয়েরিটি বিবেচনা করুন যা কেবলমাত্র যদি তারা ইতিমধ্যে লক্ষ্য সারণীতে না থাকে তবে উত্স টেবিল থেকে সারি সন্নিবেশ করান:
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;