একক সারি অন্তর্ভুক্ত… পৃথক নির্বাচনের চেয়ে অনেক ধীর গতি নির্বাচন করুন


18

1 থেকে 400 পর্যন্ত 400 সারি সহ নিম্নলিখিত হিপ টেবিলটি দেওয়া:

DROP TABLE IF EXISTS dbo.N;
GO
SELECT 
    SV.number
INTO dbo.N 
FROM master.dbo.spt_values AS SV
WHERE 
    SV.[type] = N'P'
    AND SV.number BETWEEN 1 AND 400;

এবং নিম্নলিখিত সেটিংস:

SET NOCOUNT ON;
SET STATISTICS IO, TIME OFF;
SET STATISTICS XML OFF;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

নিম্নলিখিত SELECTবিবৃতিটি প্রায় 6 সেকেন্ডে পূর্ণ হয় ( ডেমো , পরিকল্পনা ):

DECLARE @n integer = 400;

SELECT
    c = COUNT_BIG(*) 
FROM dbo.N AS N
CROSS JOIN dbo.N AS N2
CROSS JOIN dbo.N AS N3
WHERE 
    N.number <= @n
    AND N2.number <= @n
    AND N3.number <= @n
OPTION
    (OPTIMIZE FOR (@n = 1));

দ্রষ্টব্য: @ দফাটি OPTIMIZE FORকেবলমাত্র একটি সংবেদনশীল আকারের রেপ্রো প্রোডাক্ট করার জন্য যা বিভিন্ন কারণে বিভিন্ন কারণে উদ্ভুত হতে পারে এমন একটি কার্ডিনালিটি দুর্লভতা সহ আসল সমস্যার প্রয়োজনীয় বিবরণ ক্যাপচার করে।

যখন একক-সারি আউটপুট কোনও টেবিলে লেখা হয়, তখন এটি 19 সেকেন্ডে লাগে ( ডেমো , পরিকল্পনা ):

DECLARE @T table (c bigint NOT NULL);

DECLARE @n integer = 400;

INSERT @T
    (c)
SELECT
    c = COUNT_BIG(*) 
FROM dbo.N AS N
CROSS JOIN dbo.N AS N2
CROSS JOIN dbo.N AS N3
WHERE 
    N.number <= @n
    AND N2.number <= @n
    AND N3.number <= @n
OPTION
    (OPTIMIZE FOR (@n = 1));

মৃত্যুদন্ড কার্যকর করার পরিকল্পনাগুলি এক সারি সন্নিবেশ করা বাদ দিয়ে একইরকম প্রদর্শিত হবে।

সমস্ত অতিরিক্ত সময় সিপিইউ ব্যবহারের দ্বারা গ্রাস করা হবে বলে মনে হয়।

INSERTবিবৃতি এত ধীর কেন ?

উত্তর:


21

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

কার্ডিনিলিটি মিথ্যাচারটি ইচ্ছাকৃতভাবে এর মাধ্যমে প্রবর্তন করা হয়েছিল OPTIMIZE FORযে অপেক্ষাকৃত অপেক্ষাকৃত প্রত্যাশার চেয়ে অনেক বেশি বার গাদা স্ক্যান করা হয় , এবং এটি স্পুলটিকে সাধারণত এটি যেমন পরিচয় করে না তা প্রবর্তন করে না।

এই উপাদানগুলির সংমিশ্রণের অর্থ পারফরম্যান্স রানটাইমের সময় প্রয়োজনীয় লকের সংখ্যার প্রতি খুব সংবেদনশীল।

SELECTএকটি অপ্টিমাইজেশান অনুমতি দেয় থেকে বিবৃতি সুবিধা সারি পর্যায়ের ভাগ কেশ এড়াতে হবে (শুধুমাত্র অভিপ্রায় ভাগ করা পৃষ্ঠা-স্তর কেশ গ্রহণ) যখন স্বাধীন তথ্য পড়া কোন বিপদ আছে, আর কেহ অফ-সারি তথ্য।

INSERT...SELECTবিবৃতিটি এই অপ্টিমাইজেশনের দ্বারা কোনও উপকার করে না, সুতরাং লক্ষ লক্ষ আরআইডি লক নেওয়া হয় এবং দ্বিতীয় ক্ষেত্রে প্রতিটি সেকেন্ডে ইন্টেন্ট-ভাগ করে নেওয়া পৃষ্ঠা-স্তরের লকগুলি সহ নেওয়া হয়।

অতিরিক্ত সিপিইউ এবং অতিবাহিত সময়ের জন্য লকিং ক্রিয়াকলাপের প্রচুর পরিমাণ।

সর্বাধিক প্রাকৃতিক কাজটি হ'ল অপটিমাইজার (এবং স্টোরেজ ইঞ্জিন) শালীন কার্ডিনালিটির প্রাক্কলন নিশ্চিত করা যাতে তারা ভাল পছন্দ করতে পারে।

যদি আসল ব্যবহারের ক্ষেত্রে এটি ব্যবহারিক না হয় তবে একটি ভেরিয়েবলের ফলস্বরূপ INSERTএবং SELECTস্টেটমেন্টগুলি পৃথক করা যায় SELECT। এটি SELECTবিবৃতিটিকে লক-স্কিপিং অপ্টিমাইজেশান থেকে উপকৃত করার অনুমতি দেবে ।

বিচ্ছিন্নতা স্তর পরিবর্তন করা ভাগ করে নেওয়া লক না নিয়ে বা লক সজ্জায় দ্রুত স্থান গ্রহণ করে তা নিশ্চিত করেও কাজ করা যায়।

আগ্রহের একটি চূড়ান্ত পয়েন্ট হিসাবে, SELECTঅনুলিপিযুক্ত ট্রেস পতাকা 8691 ব্যবহার করে স্পুলগুলি ব্যবহার করতে বাধ্য করে কোয়েরিটি অনুকূলিত মামলার চেয়ে আরও দ্রুত চালানো যেতে পারে ।

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