এটি একেবারে কোনও প্রাসঙ্গিক উত্তর নয় তবে আমি লক্ষ্য করেছি যে এসকিউএল ফিডলে দেখানো নেস্টেড লুপগুলি অনুসন্ধানের পরিকল্পনাগুলির জন্য USE PLAN
ইঙ্গিতটি ব্যবহার করে কোয়েরি 2 থেকে ক্যোয়ারি 1 তে পরিকল্পনাটি প্রয়োগ করা সম্ভব হয়েছিল তবে বিপরীত ক্রিয়াকলাপের চেষ্টা ব্যর্থ হয়ে ব্যর্থ হয়েছে with
ক্যোয়ারী প্রসেসর ক্যোয়ারী প্ল্যান তৈরি করতে পারেনি কারণ ইউএসই প্ল্যান ইঙ্গিতটিতে এমন পরিকল্পনা রয়েছে যা কোয়েরির জন্য বৈধ হওয়ার জন্য যাচাই করা যায়নি। ব্যবহারের পরিকল্পনা ইঙ্গিতটি সরান বা প্রতিস্থাপন করুন। সফল পরিকল্পনার জোর সম্ভাবনার সর্বোত্তম সম্ভাবনার জন্য, যাচাই করুন যে ইউএসই প্ল্যান ইঙ্গিততে সরবরাহ করা পরিকল্পনাটি একই প্রশ্নের জন্য এসকিউএল সার্ভার দ্বারা স্বয়ংক্রিয়ভাবে উত্পন্ন হয়েছে।
অপ্টিমাইজার রূপান্তর নিয়ম অক্ষম করা ReorderLOJN
আগের সফল পরিকল্পনার ইঙ্গিতটিকে সফল হতে বাধা দেয়।
আরও বেশি পরিমাণে ডেটা নিয়ে পরীক্ষা করে দেখা যায় যে এসকিউএল সার্ভার অবশ্যই প্রাকৃতিকভাবে রূপান্তর (A LOJ B) LOJ C
করতে সক্ষম A LOJ (B LOJ C)
তবে এটির বিপরীতটি সত্য বলে আমি কোনও প্রমাণ পাইনি।
একটি খুব সঙ্কল্পিত কেস যেখানে প্রথম ক্যোয়ারী দ্বিতীয়টির চেয়ে ভাল সম্পাদন করে
DROP TABLE MyGrandChild , MyChild, MyParent
CREATE TABLE MyParent
(Id int)
CREATE TABLE MyChild
(Id int PRIMARY KEY
,ParentId int,
Filler char(8000) NULL)
CREATE TABLE MyGrandChild
(Id int
,ParentId int)
INSERT INTO MyChild
(Id, ParentId)
SELECT TOP (100000) ROW_NUMBER() OVER (ORDER BY @@SPID),
ROW_NUMBER() OVER (ORDER BY @@SPID)
FROM master..spt_values v1, master..spt_values
INSERT INTO MyGrandChild
(Id, ParentId)
OUTPUT INSERTED.Id INTO MyParent
SELECT TOP (3000) Id, Id AS ParentId
FROM MyChild
ORDER BY Id
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
SELECT gc.Id AS gcId,
gc.ParentId AS gcpId,
c.Id AS cId,
c.ParentId AS cpId,
p.Id AS pId
FROM MyGrandChild AS gc
LEFT OUTER JOIN MyChild AS c
ON c.[Id] = gc.[ParentId]
LEFT OUTER JOIN MyParent AS p
ON p.[Id] = c.[ParentId]
SELECT gc.Id AS gcId,
gc.ParentId AS gcpId,
c.Id AS cId,
c.ParentId AS cpId,
p.Id AS pId
FROM MyGrandChild AS gc
LEFT OUTER JOIN( MyChild AS c
LEFT OUTER JOIN MyParent AS p
ON p.[Id] = c.[ParentId])
ON c.[Id] = gc.[ParentId]
যা পরিকল্পনা দেয়
আমার জন্য ক্যোয়ারি 1 এর ক্যোয়ারি 2 এর জন্য 108 এমএস বনাম 1,163 এমএসের একটি অতিবাহিত সময় ছিল।
প্রশ্ন ঘ
Table 'Worktable'. Scan count 0, logical reads 0
Table 'MyChild'. Scan count 0, logical reads 9196
Table 'MyGrandChild'. Scan count 1, logical reads 7
Table 'MyParent'. Scan count 1, logical reads 5
প্রশ্ন 2
Table 'MyParent'. Scan count 1, logical reads 15000
Table 'MyChild'. Scan count 0, logical reads 9000
Table 'MyGrandChild'. Scan count 1, logical reads 7
সুতরাং এটি অস্থায়ীভাবে ধরে নেওয়া যেতে পারে যে প্রথম ("অবিযুক্ত") বাক্য গঠনটি সম্ভাব্যভাবে উপকারী কারণ এটি আরও বেশি সম্ভাব্য জয়েন অর্ডার বিবেচনা করার অনুমতি দেয় তবে সাধারণ নিয়ম হিসাবে এটির উপর বেশি আস্থা রাখার জন্য আমি পর্যাপ্ত পর্যাপ্ত পরীক্ষা করিনি।
ক্যোরি 2 আরও ভাল সঞ্চালন করে এমন পাল্টা উদাহরণ দিয়ে আসা সম্পূর্ণভাবে সম্ভব। উভয়ই চেষ্টা করে দেখুন এবং কার্যকর করার পরিকল্পনাগুলি দেখুন।