আমি ইউএনইউনিংয়ের দুটি ফলাফল-সেট কেন জোনের শৃঙ্খলে বা ব্যবহারের চেয়ে আরও ভাল হতে পারে তা বোঝানোর জন্য আমি একটি নমুনা ক্যোয়ারী প্ল্যান তৈরির চেষ্টা করছি। আমার লেখা একটি ক্যোয়ারী পরিকল্পনা আমাকে আটকে দিয়েছে। আমি স্ট্যাকওভারফ্লো ডাটাবেস ব্যবহারকারীর উপর একটি নন-ক্লাস্টারড ইনডেক্স ব্যবহার করছি ep
CREATE NONCLUSTERED INDEX IX_NC_REPUTATION ON dbo.USERS(Reputation)
SELECT DISTINCT Users.Id
FROM dbo.Users
INNER JOIN dbo.Posts
ON Users.Id = Posts.OwnerUserId
OR Users.Id = Posts.LastEditorUserId
WHERE Users.Reputation = 5
ক্যোয়ারী প্ল্যানটি https://www.brentozar.com/pastetheplan/?id=BkpZU1MZE এ রয়েছে , আমার জন্য ক্যোয়ারির সময়কাল 4:37 মিনিট, 26612 সারি ফিরে এসেছে।
আমি এই ধরণের ধ্রুবক-স্ক্যানটি কোনও বিদ্যমান টেবিল থেকে তৈরি হওয়ার আগে দেখিনি - আমি প্রতি একক সারিতে কেন ধ্রুব স্ক্যান চালায় তা সম্পর্কে আমি অপরিচিত, যখন ব্যবহারকারী যখন একটি একক সারির জন্য ধ্রুব স্ক্যান ব্যবহার করেন তখন উদাহরণস্বরূপ নির্বাচন করুন ()। কেন এটি এখানে ব্যবহার করা হয়? আমি এই ক্যোয়ারী পরিকল্পনাটি পড়ার ক্ষেত্রে সত্যই কিছু নির্দেশনার প্রশংসা করব।
যদি আমি সেই ওআরটিকে একটি ইউনিয়নের মধ্যে বিভক্ত করি, তবে এটি একই স্ট্যান্ডার্ড 26612 সারি দিয়ে 12 সেকেন্ডে চলমান একটি স্ট্যান্ডার্ড প্ল্যান তৈরি করে।
SELECT Users.Id
FROM dbo.Users
INNER JOIN dbo.Posts
ON Users.Id = Posts.OwnerUserId
WHERE Users.Reputation = 5
UNION
SELECT Users.Id
FROM dbo.Users
INNER JOIN dbo.Posts
ON Users.Id = Posts.LastEditorUserId
WHERE Users.Reputation = 5
আমি এই পরিকল্পনাটি এটি করণ হিসাবে ব্যাখ্যা করি:
- পোস্টগুলি থেকে সমস্ত 41782500 সারি পান (সারিগুলির আসল সংখ্যা পোস্টে সিআই স্ক্যানের সাথে মেলে)
- পোস্টগুলিতে প্রতিটি 41782500 সারিগুলির জন্য:
- স্কেলার উত্পাদন করুন:
- Expr1005: OwnerUserId
- Expr1006: OwnerUserId
- Expr1004: স্থির মান 62
- এক্সপ্রেস 1008: লাস্টএডিটর ইউজারআইডি
- এক্সপ্রেস 1009: লাস্টএডিটর ইউজারআইডি
- Expr1007: স্থির মান 62
- একযোগে:
- Exp1010: যদি Expr1005 (OwnerUserId) নাল না থাকে তবে অন্যটি Expr1008 (লাস্টএডিটর ব্যবহারকারী) ব্যবহার করুন
- Expr1011: যদি Expr1006 (OwnerUserId) নাল না থাকে তবে এটি ব্যবহার করুন, অন্যথায় Expr1009 (সর্বশেষএডিটর ব্যবহারকারী) ব্যবহার করুন
- Expr1012: যদি Expr1004 (62) নালাগুলি ব্যবহার করে, অন্যথায় Expr1007 (62) ব্যবহার করুন
- কম্পিউট স্কেলারে: আমি জানি না একটি এম্পারস্যান্ড কী করে।
- Expr1013: 4 [এবং?] 62 (Expr1012) = 4 এবং OwnerUserId নাল হয়েছে (NULL = Expr1010)
- Expr1014: 4 [এবং?] 62 (Expr1012)
- Expr1015: 16 এবং 62 (Expr1012)
- অর্ডার অনুসারে বাছাই অনুসারে:
- Expr1013 ডেস্ক
- Expr1014 Asc
- Expr1010 Asc
- Expr1015 ডেস্ক
- মার্জ বিরতিতে এটি Expr1013 এবং Expr1015 সরিয়ে ফেলে (এগুলি ইনপুট তবে আউটপুট নয়)
- সূচীতে নীচে নেস্ট করা লুপগুলিতে যোগ দিন এটি Expr1010 এবং Expr1011 ব্যবহার করে পূর্বাভাস হিসাবে ব্যবহার করছে, তবে আমি বুঝতে পারি না যখন এটি নেস্টেড লুপটি IX_NC_REPUTATION থেকে Expr1010 এবং Expr1011 সহ সাবট্রিতে যোগদান করে না তখন কীভাবে এগুলিতে অ্যাক্সেস থাকবে? ।
- নেস্টেড লুপগুলি যোগদান করে কেবল পূর্ববর্তী সাবট্রির সাথে মিল রয়েছে এমন ব্যবহারকারীদের। ভবিষ্যদ্বাণীপূর্ণ ধাক্কা দেওয়ার কারণে, IX_NC_REPUTATION- র অনুসন্ধান সূচী থেকে সমস্ত সারি ফিরে এসেছে are
- সর্বশেষ নেস্টেড লুপগুলি যোগদান করুন: প্রতিটি পোস্টের রেকর্ডের জন্য, আউটপুট ব্যবহারকারীগণ I যেখানে নীচের ডাটাবেসে কোনও মিল খুঁজে পাওয়া যায় d
SELECT Users.Id FROM dbo.Users WHERE Users.Reputation = 5 AND EXISTS (SELECT 1 FROM dbo.Posts WHERE Users.Id IN (Posts.OwnerUserId, Posts.LastEditorUserId) ) ;
SELECT Users.Id FROM dbo.Users WHERE Users.Reputation = 5 AND ( EXISTS (SELECT 1 FROM dbo.Posts WHERE Users.Id = Posts.OwnerUserId) OR EXISTS (SELECT 1 FROM dbo.Posts WHERE Users.Id = Posts.LastEditorUserId) ) ;