জো জোনে ক্লাউজে OR ব্যবহার করার সময় অদ্ভুত ক্যোয়ারী পরিকল্পনা - সারণীতে প্রতিটি সারির জন্য নিয়মিত স্ক্যান


10

আমি ইউএনইউনিংয়ের দুটি ফলাফল-সেট কেন জোনের শৃঙ্খলে বা ব্যবহারের চেয়ে আরও ভাল হতে পারে তা বোঝানোর জন্য আমি একটি নমুনা ক্যোয়ারী প্ল্যান তৈরির চেষ্টা করছি। আমার লেখা একটি ক্যোয়ারী পরিকল্পনা আমাকে আটকে দিয়েছে। আমি স্ট্যাকওভারফ্লো ডাটাবেস ব্যবহারকারীর উপর একটি নন-ক্লাস্টারড ইনডেক্স ব্যবহার করছি 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 = Posts.OwnerUserId) OR EXISTS (SELECT 1 FROM dbo.Posts WHERE Users.Id = Posts.LastEditorUserId) ) ;
ypercubeᵀᴹ

একটি উপকণিকা: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) ) ;
ypercubeᵀᴹ

উত্তর:


10

আমি এখানে আরও বিস্তারিতভাবে যাচ্ছি পরিকল্পনার অনুরূপ ।

Postsটেবিল স্ক্যান করা হয়।

প্রতিটি সারির জন্য এটি এক্সট্রাক্ট করে OwnerUserIdএবং LastEditorUserId। এটি একইভাবে UNPIVOTকাজ করার পথে । আপনি প্রতিটি ইনপুট সারির জন্য দুটি আউটপুট সারি তৈরি করার জন্য নীচে পরিকল্পনায় একটি একক ধ্রুব স্ক্যান অপারেটর দেখতে পান।

SELECT *
FROM dbo.Posts
UNPIVOT (X FOR U IN (OwnerUserId,LastEditorUserId)) Unpvt

এক্ষেত্রে পরিকল্পনাটি কিছুটা জটিল কারণ এর শব্দার্থক শব্দগুলির জন্য হ'ল orউভয় কলামের মান একই হয় তবে যোগ Usersদুটি (এক নয়) থেকে কেবল একটি সারি নির্গত করা উচিত

এরপরে এগুলি মার্জ ব্যবধানের মধ্য দিয়ে রাখা হয় যাতে মানগুলি একই রকম হয় তবে রেঞ্জটি ভেঙে যায় এবং কেবলমাত্র একটি অনুসন্ধানের বিরুদ্ধে মৃত্যুদন্ড কার্যকর করা হয় Users- অন্যথায় দুটি সিক্স এর বিরুদ্ধে মৃত্যুদন্ড কার্যকর করা হয়।

মানটি 62একটি পতাকা যার অর্থ সন্ধানটি একটি সমতা সন্ধান হওয়া উচিত।

সংক্রান্ত

IX_NC_REPUTATION থেকে Expr1010 এবং Expr1011 সহ সাবট্রিটিতে নেস্টেড লুপ যোগদান না করে এটি কীভাবে এগুলিতে অ্যাক্সেস পায় তা আমি বুঝতে পারি না

এগুলি হলুদ হাইলাইটেড কনটেন্টেশন অপারেটরে সংজ্ঞায়িত করা হয়। এটি হলুদ হাইলাইটেড নেস্টেড লুপগুলির বাইরের দিকে। সুতরাং এটি নেস্টেড লুপগুলির অভ্যন্তরে হলুদ হাইলাইট অনুসন্ধানের আগে চলে।

এখানে চিত্র বর্ণনা লিখুন

একটি পুনর্লিখন যা অনুরূপ পরিকল্পনা দেয় (যদিও মার্জ ইউনিয়ন দ্বারা প্রতিস্থাপিত মার্জ বিরতি সহ) এই ক্ষেত্রে সহায়তা করে সে ক্ষেত্রে নীচে।

SELECT DISTINCT D2.UserId
FROM   dbo.Posts p
       CROSS APPLY (SELECT Users.Id AS UserId
                    FROM   (SELECT p.OwnerUserId
                            UNION /*collapse duplicate to single row*/
                            SELECT p.LastEditorUserId) D1(UserId)
                           JOIN Users
                             ON Users.Id = D1.UserId) D2
OPTION (FORCE ORDER) 

এখানে চিত্র বর্ণনা লিখুন

Postsটেবিলটিতে কী সূচিগুলি উপলভ্য রয়েছে তার উপর নির্ভরশীল আপনার প্রস্তাবিত UNION ALLসমাধানের চেয়ে এই কোয়েরির একটি বৈকল্পিক আরও কার্যকর হতে পারে । (আমার কাছে ডাটাবেসের অনুলিপিটির কোনও কার্যকর সূচক নেই এবং প্রস্তাবিত সমাধানটি দুটি পূর্ণ স্ক্যান Postsকরে The নীচে এটি একটি স্ক্যানে করে)

WITH Unpivoted AS
(
SELECT UserId
FROM dbo.Posts
UNPIVOT (UserId FOR U IN (OwnerUserId,LastEditorUserId)) Unpivoted
)
SELECT DISTINCT Users.Id
FROM dbo.Users INNER HASH JOIN Unpivoted
       ON  Users.Id = Unpivoted.UserId
WHERE Users.Reputation = 5

এখানে চিত্র বর্ণনা লিখুন

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