অস্থায়ী টেবিলটি সন্ধান এবং বুকমার্ক অনুসন্ধানের জন্য টেবিল ভেরিয়েবল কেন একটি সূচক স্ক্যানকে বাধ্য করে?


18

আমি বুঝতে চেষ্টা করছি যে টেবিলের ভেরিয়েবলটি কেন অপ্টিমাইজারটিকে একটি সূচক সন্ধান এবং তারপরে বুকমার্ক অনুসন্ধান বনাম একটি সূচক স্ক্যান ব্যবহার করে বাধা দিচ্ছে।

টেবিলটি পপুলেট করা:

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) (হাইপারভাইসর)

উত্তর:


15

আচরণের কারণটি হ'ল এসকিউএল সার্ভার ফোরানকির সাথে কতগুলি সারি মেলে তা নির্ধারণ করতে পারে না, যেহেতু শীর্ষ কলাম হিসাবে রাউকির সাথে কোনও সূচি নেই (এটি এটি # টেম্প টেবিলের পরিসংখ্যানগুলি থেকে কমিয়ে আনতে পারে, তবে এটিগুলি নয়) সারণী ভেরিয়েবল / ইউডিটিটিগুলির জন্য উপস্থিত রয়েছে) সুতরাং এটি 100,000 সারিগুলির একটি অনুমান করে, যা সিক + লুকোচুরির চেয়ে স্ক্যানের সাহায্যে আরও ভাল পরিচালনা করা হয়। এসকিউএল সার্ভার বুঝতে পারে যে এখানে কেবল একটি সারি রয়েছে, এটি অনেক দেরিতে।

আপনি আপনার ইউডিটিটি আলাদাভাবে তৈরি করতে সক্ষম হতে পারেন; এসকিউএল সার্ভারের আরও আধুনিক সংস্করণে আপনি টেবিলের ভেরিয়েবলগুলিতে গৌণ সূচক তৈরি করতে পারেন, তবে এই বাক্য গঠনটি ২০০৮ আর 2 এ উপলব্ধ নয়।

বিটিডাব্লু আপনি নেস্ট লুপগুলি যোগ দেওয়ার ইঙ্গিত দিয়ে বিটম্যাপ / তদন্তটি এড়াতে চাইলে আপনি সন্ধানের আচরণটি পেতে পারেন (কমপক্ষে আমার সীমিত পরীক্ষায়)

DECLARE @Keys TABLE (RowKey INT PRIMARY KEY); -- can't hurt

INSERT @Keys (RowKey) VALUES (10);

SELECT 
     t.RowKey
    ,t.SecondColumn
FROM
    dbo.Test t 
INNER JOIN 
    @Keys k
ON
    t.ForeignKey = k.RowKey
    OPTION (LOOP JOIN);

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

আরও জটিল প্রশ্নের জন্য, এবং আপনি যখন এসকিউএল সার্ভার 2012 বা তারপরের দিকে চলে যান, তখন এটি সম্ভবত 2453 পতাকা চিহ্নিত করতে পারে। যদিও এই পতাকাটি এই সাধারণ যোগদানের সাথে সহায়তা করে না। এবং একই দাবি অস্বীকারকারীরা প্রয়োগ করতে পারে - এটি কেবলমাত্র একটি বিকল্প জিনিস যা আপনি সাধারণত এক টন ডকুমেন্টেশন এবং কঠোর রিগ্রেশন টেস্টিং পদ্ধতিটি না করে না করা উচিত।

এছাড়াও, সার্ভিস প্যাক 1টির সমর্থন অনেক দীর্ঘ, আপনার সার্ভিস প্যাক 3 + এমএস 15-058 পাওয়া উচিত


3

সারণী ভেরিয়েবল এবং টেম্প টেবিলগুলি বিভিন্ন উপায়ে বিভিন্নভাবে পরিচালনা করা হয়। তারা আলাদা যেখানে এখানে প্রচুর সুনির্দিষ্ট সাথে একটি দুর্দান্ত উত্তর রয়েছে।

বিশেষত আপনার ক্ষেত্রে আমি অনুমান করব যে টেম্প টেবিলগুলির অতিরিক্ত পরিসংখ্যান উত্পন্ন এবং সমান্তরাল পরিকল্পনা থাকতে পারে যখন টেবিলের ভেরিয়েবলগুলিতে আরও সীমিত পরিসংখ্যান থাকে (কোনও কলাম স্তরের পরিসংখ্যান নেই) এবং কোনও সমান্তরাল পরিকল্পনা আপনার অপরাধী না।

সঞ্চিত প্রক্রিয়াটির সময়কালের জন্য আপনি টেম্প ভেরিয়েবলটি অস্থায়ী টেবিলের মধ্যে ফেলে দেওয়াই ভাল।

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