আমি এখানে নিবন্ধটি দেখছিলাম অস্থায়ী টেবিল বনাম টেবিল ভেরিয়েবল এবং এসকিউএল সার্ভারের পারফরম্যান্স এবং এসকিউএল সার্ভার ২০০ 2008 এ তাদের প্রভাব 2005 এর জন্য সেখানে প্রদর্শিত ফলাফলগুলির অনুরূপ ফলাফল পুনরুত্পাদন করতে সক্ষম হয়েছিল।
কেবলমাত্র 10 টি সারি দিয়ে সঞ্চিত প্রক্রিয়াগুলি (নীচে সংজ্ঞাগুলি) সম্পাদন করার সময় টেবিলের ভেরিয়েবল সংস্করণটি অস্থায়ী টেবিল সংস্করণটিকে দুইবারের বেশি সম্পাদন করে।
আমি পদ্ধতিটি ক্যাশে সাফ করে দিয়েছি এবং উভয় সঞ্চিত পদ্ধতি 10,000 বার চালিয়েছি এবং আরও 4 রানের জন্য প্রক্রিয়াটি পুনরাবৃত্তি করেছি। নীচে ফলাফল (প্রতি ব্যাচে এমএসে সময়)
T2_Time V2_Time
----------- -----------
8578 2718
6641 2781
6469 2813
6766 2797
6156 2719
আমার প্রশ্ন: টেবিলের পরিবর্তনশীল সংস্করণটির আরও ভাল পারফরম্যান্সের কারণ কী?
আমি কিছু তদন্ত করেছি। উদাহরণস্বরূপ পারফরম্যান্স কাউন্টারগুলির সাথে তাকানো
SELECT cntr_value
from sys.dm_os_performance_counters
where counter_name = 'Temp Tables Creation Rate';
নিশ্চিত করে যে উভয় ক্ষেত্রেই অস্থায়ী বস্তুগুলি প্রথম রান করার পরে ক্যাশে হচ্ছে জন্য পুনরায় স্ক্র্যাচ থেকে তৈরি না করে প্রত্যাশা অনুযায়ী ।
একইভাবে ট্রেসিং Auto Stats
, SP:Recompile
, SQL:StmtRecompile
প্রোফাইলার ঘটনা (নীচে স্ক্রীনশট) শো যে এই ঘটনা শুধুমাত্র এক বার (প্রথম আবাহন উপর ঘটতে #temp
টেবিল সঞ্চিত পদ্ধতি) এবং অন্যান্য 9,999 মৃত্যুদণ্ড কার্যকর এই ঘটনা কোনো বাড়াতে না। (টেবিলের পরিবর্তনশীল সংস্করণ এই ইভেন্টগুলির কোনওটি পায় না)
সঞ্চিত পদ্ধতির প্রথম রানের সামান্য বৃহত্তর ওভারহেড কোনওভাবেই বড় সামগ্রিক পার্থক্যের জন্য অ্যাকাউন্ট করতে পারে না তবে পদ্ধতি ক্যাশেটি পরিষ্কার করতে এবং উভয় পদ্ধতি একবার চালাতে কেবল কয়েক এমএস লাগবে তাই আমি বিশ্বাস করি না কোনও পরিসংখ্যান বা recompiles কারণ হতে পারে।
প্রয়োজনীয় ডেটাবেস অবজেক্ট তৈরি করুন
CREATE DATABASE TESTDB_18Feb2012;
GO
USE TESTDB_18Feb2012;
CREATE TABLE NUM
(
n INT PRIMARY KEY,
s VARCHAR(128)
);
WITH NUMS(N)
AS (SELECT TOP 1000000 ROW_NUMBER() OVER (ORDER BY $/0)
FROM master..spt_values v1,
master..spt_values v2)
INSERT INTO NUM
SELECT N,
'Value: ' + CONVERT(VARCHAR, N)
FROM NUMS
GO
CREATE PROCEDURE [dbo].[T2] @total INT
AS
CREATE TABLE #T
(
n INT PRIMARY KEY,
s VARCHAR(128)
)
INSERT INTO #T
SELECT n,
s
FROM NUM
WHERE n%100 > 0
AND n <= @total
DECLARE @res VARCHAR(128)
SELECT @res = MAX(s)
FROM NUM
WHERE n <= @total
AND NOT EXISTS(SELECT *
FROM #T
WHERE #T.n = NUM.n)
GO
CREATE PROCEDURE [dbo].[V2] @total INT
AS
DECLARE @V TABLE (
n INT PRIMARY KEY,
s VARCHAR(128))
INSERT INTO @V
SELECT n,
s
FROM NUM
WHERE n%100 > 0
AND n <= @total
DECLARE @res VARCHAR(128)
SELECT @res = MAX(s)
FROM NUM
WHERE n <= @total
AND NOT EXISTS(SELECT *
FROM @V V
WHERE V.n = NUM.n)
GO
পরীক্ষা স্ক্রিপ্ট
SET NOCOUNT ON;
DECLARE @T1 DATETIME2,
@T2 DATETIME2,
@T3 DATETIME2,
@Counter INT = 0
SET @T1 = SYSDATETIME()
WHILE ( @Counter < 10000)
BEGIN
EXEC dbo.T2 10
SET @Counter += 1
END
SET @T2 = SYSDATETIME()
SET @Counter = 0
WHILE ( @Counter < 10000)
BEGIN
EXEC dbo.V2 10
SET @Counter += 1
END
SET @T3 = SYSDATETIME()
SELECT DATEDIFF(MILLISECOND,@T1,@T2) AS T2_Time,
DATEDIFF(MILLISECOND,@T2,@T3) AS V2_Time
#temp
টেবিলে একবার তৈরি হয়ে যায় এবং এরপরে আরও 9,999 বার পুনরায় জনবসতি ঘটে ।