পুনরায় যোগদানের পরিসীমা নালযোগ্য সংমিশ্র সূচকগুলিতে সন্ধান করুন?


14

নিম্নলিখিত স্কিমা এবং উদাহরণ ডেটা জন্য

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মান সবসময় প্রথম হয়। (বিপরীতে অনুমান করা হয়েছে।) ফিডল
ypercubeᵀᴹ

হ্যাঁ ওরাকল ভিন্ন different
মার্টিন স্মিথ


@ টাইপারকিউব - এসকিউএল সার্ভার কেবল দুর্ভাগ্যক্রমে এর জন্য একটি অর্ডারযুক্ত স্ক্যান দেয় যাতে ইতিমধ্যে অ্যাপ্লিকেশন দ্বারা প্রক্রিয়া করা সমস্ত সারি পুনরায় পাঠ করে (লজিকাল রিডস 2015)। এটা তোলে প্রথম চাবি মধ্যে নেওয়া হয় না(NULL, 1000 )
মার্টিন স্মিথ

@Aনাল হোক বা না থাকায় 2 টি পৃথক শর্তের সাথে মনে হয় এটি কোনও স্ক্যান করে না। তবে পরিকল্পনাগুলি আপনার প্রশ্নের চেয়ে ভাল কিনা তা আমি বুঝতে পারি না। ফিডল -২
ypercubeᵀᴹ

উত্তর:


21

এমন কোনও ক্যোয়ারী লেখার কি কোনও উপায় আছে যা কেবলমাত্র সেই সংমিশ্রিত সূচক কীটিতে সন্ধান করে এবং তারপরে এটির সাথে অনুসরণ করে পরবর্তী 1000 টি সারির অংশটি পুনরুদ্ধার করতে পারে?

আমার পছন্দসই সমাধান হ'ল APIকার্সার ব্যবহার করা :

SET NOCOUNT ON;
SET STATISTICS IO ON;

DECLARE 
    @cur integer,
    -- FAST_FORWARD, AUTO_FETCH, AUTO_CLOSE, CHECK_ACCEPTED_TYPES, FAST_FORWARD_ACCEPTABLE
    @scrollopt integer = 16 | 8192 | 16384 | 32768 | 1048576,
    -- READ_ONLY, CHECK_ACCEPTED_OPTS, READ_ONLY_ACCEPTABLE
    @ccopt integer = 1 | 32768 | 65536, 
    @rowcount integer = 1000,
    @rc integer;

-- Open the cursor and return (up to) the first 1000 rows
EXECUTE @rc = sys.sp_cursoropen
    @cur OUTPUT,
    N'
    SELECT A, B, C
    FROM T
    ORDER BY A, B;
    ',
    @scrollopt OUTPUT,
    @ccopt OUTPUT,
    @rowcount OUTPUT;

IF @rc <> 16 -- FastForward cursor automatically closed
BEGIN
    -- Name the cursor so we can use CURSOR_STATUS
    EXECUTE sys.sp_cursoroption
        @cur, 
        2, 
        'MyCursorName';

    -- Until the cursor auto-closes
    WHILE CURSOR_STATUS('global', 'MyCursorName') = 1
    BEGIN
        EXECUTE sys.sp_cursorfetch
            @cur,
            2,
            0,
            1000;
    END;
END;

SET STATISTICS IO OFF;

সামগ্রিক কৌশলটি একক স্ক্যান যা কলগুলির মধ্যে এর অবস্থানটি মনে রাখে । একটি ব্যবহার APIকার্সার মানে আমরা একটি সময়ে এক সারি একটি ব্লক বদলে আসতে পারেন হিসাবে একটি মামলা হবে T-SQLকার্সার:

কার্যকর করার পরিকল্পনা রয়েছে

STATISTICS IOআউটপুট হল:

Table 'T'. Scan count 1, logical reads 1011, physical reads 0, read-ahead reads 0
Table 'T'. Scan count 1, logical reads 1001, physical reads 0, read-ahead reads 0
Table 'T'. Scan count 1, logical reads 516, physical reads 0, read-ahead reads 0
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.