নিম্নলিখিত স্কিমা এবং উদাহরণ ডেটা জন্য
CREATE TABLE T
(
A INT NULL,
B INT NOT NULL IDENTITY,
C CHAR(8000) NULL,
UNIQUE CLUSTERED (A, B)
)
INSERT INTO T
(A)
SELECT NULLIF(( ( ROW_NUMBER() OVER (ORDER BY @@SPID) - 1 ) / 1003 ), 0)
FROM master..spt_values
একটি অ্যাপ্লিকেশন এই সারণী থেকে ক্লাস্টার ইনডেক্স অর্ডারে 1000 সারি অংশগুলিতে সারিগুলি প্রক্রিয়া করছে is
প্রথম ক্যারিয়ার থেকে প্রথম 1000 টি সারি পুনরুদ্ধার করা হয়েছে।
SELECT TOP 1000 *
FROM T
ORDER BY A, B
সেই সেটটির চূড়ান্ত সারিটি নীচে
+------+------+
| A | B |
+------+------+
| NULL | 1000 |
+------+------+
এমন কোনও ক্যোয়ারী লেখার কি কোনও উপায় আছে যা কেবলমাত্র সেই সংমিশ্রিত সূচক কীটিতে সন্ধান করে এবং তারপরে এটির সাথে অনুসরণ করে পরবর্তী 1000 টি সারির অংশটি পুনরুদ্ধার করতে পারে?
/*Pseudo Syntax*/
SELECT TOP 1000 *
FROM T
WHERE (A, B) is_ordered_after (@A, @B)
ORDER BY A, B
এখন পর্যন্ত আমি যে পরিমাণ পঠন পরিচালনা করতে পেরেছি তা হ'ল 1020 তবে কোয়েরিটি অনেকটা বিশৃঙ্খল বলে মনে হচ্ছে। সমান বা উন্নত দক্ষতার সহজ উপায় কি আছে? সম্ভবত এক যা চেষ্টা করে এটি একটি পরিসরের মধ্যে এটি করতে সমস্ত পরিচালনা করে?
DECLARE @A INT = NULL, @B INT = 1000
;WITH UnProcessed
AS (SELECT *
FROM T
WHERE ( EXISTS(SELECT A
INTERSECT
SELECT @A)
AND B > @B )
UNION ALL
SELECT *
FROM T
WHERE @A IS NULL AND A IS NOT NULL
UNION ALL
SELECT *
FROM T
WHERE A > @A
)
SELECT TOP 1000 *
FROM UnProcessed
ORDER BY A,
B
এফডাব্লুআইডাব্লু: যদি কলামটি A
তৈরি করা হয় NOT NULL
এবং এর -1
পরিবর্তে এর একটি সেন্ডিনেল মান ব্যবহার করা হয় তবে সমপরিমাণ বাস্তবায়ন পরিকল্পনা অবশ্যই সহজ দেখায়
তবে পরিকল্পনার একক সন্ধানকারী অপারেটরটি এখনও এটি একটি একক নিয়মিত পরিসরে ভেঙে পড়ার চেয়ে দুটি চাওয়া সম্পাদন করে এবং যৌক্তিক পাঠগুলি একই রকম হয় তাই আমি সন্দেহ করছি যে এটি সম্ভবত এটির মতোই বেশ ভালই পাবে?
(NULL, 1000 )
@A
নাল হোক বা না থাকায় 2 টি পৃথক শর্তের সাথে মনে হয় এটি কোনও স্ক্যান করে না। তবে পরিকল্পনাগুলি আপনার প্রশ্নের চেয়ে ভাল কিনা তা আমি বুঝতে পারি না। ফিডল -২
NULL
মান সবসময় প্রথম হয়। (বিপরীতে অনুমান করা হয়েছে।) ফিডল