আপনি অনুমান করতে পারে কি আপনার জন্য পারফরমেন্স মনিটর এবং কার্যকলাপ মনিটর মধ্যে দেখতে SQL Compilations/secএবং Batch Requests/secএকটি পরীক্ষা হিসেবে পৃথক ক্যোয়ারী উইন্ডোতে কিছু ব্যাচ চালানোর সময়, নিচের বিস্তারিত।
প্রশ্ন উইন্ডো 1:
DECLARE @t1 datetime;
DECLARE @t2 datetime;
DECLARE @CompVal1 int;
DECLARE @CompVal2 int;
DECLARE @ReCompVal1 int;
DECLARE @ReCompVal2 int;
DECLARE @BatchVal1 int;
DECLARE @BatchVal2 int;
DECLARE @ElapsedMS decimal(10,2);
SELECT @t1 = GETDATE()
, @CompVal1 = (
SELECT spi.cntr_value
FROM sys.sysperfinfo spi
WHERE spi.counter_name = 'SQL Compilations/sec '
)
, @ReCompVal1 = (
SELECT spi.cntr_value
FROM sys.sysperfinfo spi
WHERE spi.counter_name = 'SQL Re-Compilations/sec '
)
, @BatchVal1 = (
SELECT spi.cntr_value
FROM sys.sysperfinfo spi
WHERE spi.counter_name = 'Batch Requests/sec '
);
WAITFOR DELAY '00:00:10.000';
SELECT @t2 = GETDATE()
, @CompVal2 = (
SELECT spi.cntr_value
FROM sys.sysperfinfo spi
WHERE spi.counter_name = 'SQL Compilations/sec '
)
, @ReCompVal2 = (
SELECT spi.cntr_value
FROM sys.sysperfinfo spi
WHERE spi.counter_name = 'SQL Re-Compilations/sec '
)
, @BatchVal2 = (
SELECT spi.cntr_value
FROM sys.sysperfinfo spi
WHERE spi.counter_name = 'Batch Requests/sec '
);
SET @ElapsedMS = DATEDIFF(MILLISECOND, @t1, @t2);
SELECT ElapsedTimeMS = @ElapsedMS
, [SQL Compilations/sec] = (@CompVal2 - @CompVal1) / @ElapsedMS * 1000
, [SQL Recompilations/sec] = (@ReCompVal2 - @ReCompVal1) / @ElapsedMS * 1000
, [Batch Requests/sec] = (@BatchVal2 - @BatchVal1) / @ElapsedMS * 1000;
প্রশ্নের উইন্ডো 2-তে, উপরের কোডটি চলমান অবস্থায় নিম্নলিখিতটি চালান। কোডটি কেবল 100 টি-এসকিউএল ব্যাচ চালায়:
EXEC sys.sp_executesql N'SELECT TOP(1) o.name FROM sys.objects o;';
GO 100
আপনি যদি ক্যোরি উইন্ডো 1 এ ফিরে যান তবে আপনি এরকম কিছু দেখতে পাবেন:
╔═══════════════╦══════════════════════╦══════════ ══════════════╦════════════════════╗
La বিভক্ত সময়সীমা ║ এসকিউএল সংকলন / সেকেন্ড ║ এসকিউএল পুনঃসংকলন / সেকেন্ড ║ ব্যাচের অনুরোধ / সেকেন্ড ║
╠═══════════════╬══════════════════════╬══════════ ══════════════╬════════════════════╣
20 10020.00 ║ 10.07984031000 ║ 0.00000000000 ║ 10.07984031000 ║
╚═══════════════╩══════════════════════╩══════════ ══════════════╩════════════════════╝
আমরা যদি এই কোয়েরিটি তাকান:
SELECT dest.text
, deqs.execution_count
FROM sys.dm_exec_query_stats deqs
CROSS APPLY sys.dm_exec_sql_text(deqs.plan_handle) dest
WHERE dest.text LIKE 'SELECT TOP(1)%'
আমরা নিশ্চিত করতে পারি যে পরীক্ষার ক্যোয়ারির 100 টি মৃত্যুদণ্ড কার্যকর হয়েছিল।
উপরে ফলাফল, আপনি আমরা সংকলন পেয়ে থাকেন দেখতে পারেন প্রতিটি সময়sp_executesql বিবৃতি সঞ্চালন করে। এর জন্য পরিকল্পনা অবশ্যই ক্যাশে হচ্ছে, তবুও আমরা এর জন্য একটি সংকলন দেখছি; কি দেয়?
মাইক্রোসফট ডক্স বিষয়ে এই কথা sp_executesql:
sp_executesql এর ব্যাচ, নামগুলির ক্ষেত্র এবং ডেটাবেস প্রসঙ্গে প্রসঙ্গে EXECUTE এর মতোই আচরণ রয়েছে। Sp_executesql @stmt প্যারামিটারে লেনদেন-এসকিউএল স্টেটমেন্ট বা ব্যাচটি sp_executesql স্টেটমেন্ট কার্যকর না হওয়া পর্যন্ত সংকলিত হয় না। @Stmt এর বিষয়বস্তুগুলি তখন sp_executesql নামক ব্যাচের এক্সিকিউশন পরিকল্পনার থেকে পৃথক করে একটি এক্সিকিউশন প্ল্যান হিসাবে নির্বাহ করা হয় এবং কার্যকর করা হয়।
সুতরাং, কমান্ড পাঠ্যের জন্য পরিকল্পনা ইতিমধ্যে পরিকল্পনা ক্যাশে থাকা সত্ত্বেও প্রতিটি সময় এটি চালিত হওয়ার সাথে সাথে sp_executesql নিজেই সংকলন করা হচ্ছে। @ পালওহাইট তার উত্তরে দেখায় যে sp_executesql- এ সর্বাধিক কলগুলি বাস্তবে ক্যাশে হয় না।