আমি বুঝতে চেষ্টা করছি যে টেবিলের ভেরিয়েবলটি কেন অপ্টিমাইজারটিকে একটি সূচক সন্ধান এবং তারপরে বুকমার্ক অনুসন্ধান বনাম একটি সূচক স্ক্যান ব্যবহার করে বাধা দিচ্ছে।
টেবিলটি পপুলেট করা:
CREATE TABLE dbo.Test
(
RowKey INT NOT NULL PRIMARY KEY,
SecondColumn CHAR(1) NOT NULL DEFAULT 'x',
ForeignKey INT NOT NULL
)
INSERT dbo.Test
(
RowKey,
ForeignKey
)
SELECT TOP 1000000
ROW_NUMBER() OVER (ORDER BY (SELECT 0)),
ABS(CHECKSUM(NEWID()) % 10)
FROM sys.all_objects s1
CROSS JOIN sys.all_objects s2
CREATE INDEX ix_Test_1 ON dbo.Test (ForeignKey)
একটি একক রেকর্ডের সাহায্যে একটি সারণী ভেরিয়েবলকে পপুলেট করুন এবং বিদেশী কী কলামে অনুসন্ধান করে প্রাথমিক কী এবং দ্বিতীয় কলামটি দেখার চেষ্টা করুন:
DECLARE @Keys TABLE (RowKey INT NOT NULL)
INSERT @Keys (RowKey) VALUES (10)
SELECT
t.RowKey,
t.SecondColumn
FROM
dbo.Test t
INNER JOIN
@Keys k
ON
t.ForeignKey = k.RowKey
নীচে কার্যকর করার পরিকল্পনা রয়েছে:
পরিবর্তে একটি টেম্প টেবিল ব্যবহার করে এখন একই ক্যোয়ারী:
CREATE TABLE #Keys (RowKey INT NOT NULL)
INSERT #Keys (RowKey) VALUES (10)
SELECT
t.RowKey,
t.SecondColumn
FROM
dbo.Test t
INNER JOIN
#Keys k
ON
t.ForeignKey = k.RowKey
এই ক্যোয়ারী প্ল্যানটি সিক এবং বুকমার্ক লুপ ব্যবহার করেছে:
অপ্টিমাইজার কেন টেম্পল টেবিলের সাথে বুকমার্ক অনুসন্ধান করতে ইচ্ছুক, তবে টেবিলের পরিবর্তনশীল নয়?
সারণী ভেরিয়েবলটি উদাহরণস্বরূপ সঞ্চিত পদ্ধতিতে কোনও ব্যবহারকারী-সংজ্ঞায়িত টেবিল প্রকারের মাধ্যমে আসা ডেটা প্রতিনিধিত্ব করতে ব্যবহৃত হয়।
আমি বুঝতে পেরেছি যে বিদেশী কী মান কয়েক হাজার বার দেখা গেলে সূচকের সন্ধানটি উপযুক্ত নাও হতে পারে। সেক্ষেত্রে একটি স্ক্যান সম্ভবত আরও ভাল পছন্দ হতে পারে। আমি যে দৃশ্যের সৃষ্টি করেছি তার জন্য, 10 এর মান সহ কোনও সারি ছিল না আমি এখনও মনে করি আচরণটি আকর্ষণীয় এবং এর কারণ আছে কিনা তা জানতে চাই।
যোগ করার OPTION (RECOMPILE)
ফলে আচরণের কোনও পরিবর্তন হয়নি। ইউডিডিটির একটি প্রাথমিক কী রয়েছে।
@@VERSION
এসকিউএল সার্ভার 2008 আর 2 (এসপি 2) - 10.50.4042.0 (এক্স 64) (বিল্ড 7601: সার্ভিস প্যাক 1) (হাইপারভাইসর)