কলামটি সূচিবদ্ধ বলে ধরে নিলে যুক্তিসঙ্গতভাবে দক্ষ হওয়া উচিত।
10 টি সারি দুটি সন্ধান এবং তারপরে এক ধরণের (অবধি) 20 ফিরে আসল।
WITH CTE
AS ((SELECT TOP 10 *
FROM YourTable
WHERE YourCol > 32
ORDER BY YourCol ASC)
UNION ALL
(SELECT TOP 10 *
FROM YourTable
WHERE YourCol <= 32
ORDER BY YourCol DESC))
SELECT TOP 10 *
FROM CTE
ORDER BY ABS(YourCol - 32) ASC
(যেমন নীচের মতো সম্ভাব্য কিছু)
অথবা অন্য সম্ভাবনা (এটি সর্বাধিক 10 এ সাজানো সারিগুলির সংখ্যা হ্রাস করে)
WITH A
AS (SELECT TOP 10 *,
YourCol - 32 AS Diff
FROM YourTable
WHERE YourCol > 32
ORDER BY Diff ASC, YourCol ASC),
B
AS (SELECT TOP 10 *,
32 - YourCol AS Diff
FROM YourTable
WHERE YourCol <= 32
ORDER BY YourCol DESC),
AB
AS (SELECT *
FROM A
UNION ALL
SELECT *
FROM B)
SELECT TOP 10 *
FROM AB
ORDER BY Diff ASC
নোট: উপরের এক্সিকিউশন পরিকল্পনাটি ছিল সাধারণ টেবিল সংজ্ঞার জন্য
CREATE TABLE [dbo].[YourTable](
[YourCol] [int] NOT NULL CONSTRAINT [SomeIndex] PRIMARY KEY CLUSTERED
)
প্রযুক্তিগতভাবে, নীচের শাখায় বাছাই করার দরকার নেই যেহেতু এটি ডিফ দ্বারা আদেশ করা হয়েছিল, এবং দুটি আদেশযুক্ত ফলাফলকে মার্জ করা সম্ভব হবে। তবে আমি সেই পরিকল্পনাটি পেতে পারি নি।
ক্যোয়ারীটি কেবলমাত্র ORDER BY Diff ASC, YourCol ASC
নয় ORDER BY YourCol ASC
, কারণ পরিকল্পনার শীর্ষ শাখায় বাছাই থেকে মুক্তি পাওয়ার জন্য এটি কাজ শেষ করেছিল। আমার দ্বিতীয় গৌণ কলামটি যুক্ত করা দরকার (যদিও এটি ফলাফল হিসাবে কখনই পরিবর্তন করে নাYourCol
একই ডিফের সাথে সমস্ত মানের জন্য একই হবে) সুতরাং এটি কোনও বাছাই না করেই মার্জ জয় (কনটেস্টেশন) এর মধ্য দিয়ে যায়।
এসকিউএল সার্ভারটি অনুমান করতে সক্ষম বলে মনে হয় যে এক্সে সূচকগুলি আরোহী ক্রমে সন্ধান করা X + Y দ্বারা অর্ডার করা সারি সরবরাহ করবে এবং কোনও সাজানোর প্রয়োজন নেই। তবে এটি অনুমান করতে সক্ষম হয় না যে উত্স অনুসারে সূচককে ভ্রমণ করা ওয়াইএক্স (বা এমনকি কেবল অ্যানারি বিয়োগ এক্স) এর মতো একই ক্রমে সারিগুলি সরবরাহ করবে। পরিকল্পনার উভয় শাখা একটি বাছাই এড়াতে একটি সূচক ব্যবহার করে TOP 10
তবে নীচের শাখায় এর পরে বাছাই করা হয়Diff
(যদিও তারা ইতিমধ্যে সেই ক্রমে রয়েছে) একত্রিত হওয়ার জন্য পছন্দসই ক্রমে এগুলি পেতে।
অন্যান্য প্রশ্ন / সারণী সংজ্ঞাগুলির জন্য কেবল একটি শাখার এক প্রকারের সাথে একত্রীকরণ পরিকল্পনাটি পাওয়া সম্ভব বা জটিল নয় - কারণ এটি এসকিউএল সার্ভারের অর্ডারিং এক্সপ্রেশনটি খুঁজে পাওয়ার উপর নির্ভর করে:
- সূচক সন্ধানকারী নির্দিষ্ট অর্ডার সরবরাহ করবে তাই গ্রহণ করে তাই শীর্ষের আগে কোনও সাজানোর প্রয়োজন নেই ।
- মার্জ অপারেশনে ব্যবহার করে খুশি তাই এর পরে কোনও সাজানোর দরকার নেই requires
TOP
SELECT TOP 10 * FROM YourTable ORDER BY ABS(YourCol - 32) ;
এমনকি আরও সহজ ব্যবহার করতে পারে । দক্ষ না হয়।