কেন এই কোয়েরিতে প্রাথমিক (ক্লাস্টারড) কী ব্যবহার হচ্ছে না?


10

আমার একটি এসকিউএল সার্ভার 2008 আর 2 টেবিল রয়েছে যার স্কিমার কাঠামোটি নীচে দেখায়:

CREATE TABLE [dbo].[CDSIM_BE]
(
    [ID] [bigint] NOT NULL,
    [EquipmentID] [varchar](50) NOT NULL,
    [SerialNumber] [varchar](50) NULL,
    [PyrID] [varchar](50) NULL,
    [MeasMode] [varchar](50) NULL,
    [ReadTime] [datetime] NOT NULL,
    [SubID] [varchar](15) NULL,
    [ProbePosition] [float] NULL,
    [DataPoint] [int] NULL,

    CONSTRAINT [PK_CDSIM_BE] 
    PRIMARY KEY CLUSTERED ([ID] ASC, [EquipmentID] ASC, [ReadTime] ASC)
         WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
               IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
               ALLOW_PAGE_LOCKS = ON) ON [MonthlyArchiveScheme9]([ReadTime])
) ON [MonthlyArchiveScheme9]([ReadTime])

CREATE NONCLUSTERED INDEX [idx_CDSIM_BE__SubID_ProbePosition] 
ON [dbo].[CDSIM_BE] ([SubID] ASC, [ProbePosition] ASC)
INCLUDE ([EquipmentID], [ReadTime], [BECorr]) 
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
          SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, 
          ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [MonthlyArchiveScheme9]([ReadTime])

CREATE NONCLUSTERED INDEX [IX_CDSIM_BE_ProbePosition] 
ON [dbo].[CDSIM_BE] ([ProbePosition] ASC)
INCLUDE ([SerialNumber], [SubID]) 
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
          SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, 
          ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [MonthlyArchiveScheme9]([ReadTime])

CREATE NONCLUSTERED INDEX [IX_CSDIM_Readtime] 
ON [dbo].[CDSIM_BE]([ReadTime] ASC)
INCLUDE ([EquipmentID]) 
    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
          SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, 
          ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [MonthlyArchiveScheme9]([ReadTime])

এবং আমি এই সাধারণ জিজ্ঞাসাটি সম্পাদন করছি:

Select Max(Id)
From dbo.CDSIM_BE

টেবিলটিতে 2.5 ডলার সারি রয়েছে।

ক্যোয়ারী পরিকল্পনা শো একটি সূচক স্ক্যান করা হচ্ছে IX_CdSIM_BE_ProbePositionসূচি। আমি ভাবছি কেন এসকিউএল সার্ভার কেবল ক্লাস্টারড (এবং প্রাথমিক) সূচকটি ব্যবহার করবে না এবং সঙ্গে সঙ্গে টেবিলের সর্বশেষ সারিতে যাবে এবং আইডি মানটি পুনরুদ্ধার করবে, কারণ এটি অবশ্যই সর্বোচ্চ হতে হবে be


সর্বোচ্চ () এবং সর্বনিম্ন () দলা প্রায়ই এই শুভেচ্ছা সমস্যাযুক্ত হয়। আপনি যদি নিশ্চিত হতে চান যে পরিবর্তে কোনও সূচক ব্যবহার করা হয়েছেselect top 1 Id from dbo.CDSIM_BE order by Id descending;
পিটার জেরকেনস

4
ক্লাস্টারড ইনডেক্সটি পার্টিশন করা হয়েছে ReadTimeযাতে এটি আপনার বর্ণনা অনুযায়ী পিকে ব্যবহার করতে পারে না। Max(Id)প্রতিটি পার্টিশনের জন্য এটি সন্ধান করতে হবে এবং তারপরে সর্বাধিক সন্ধান করতে হবে। Dba.stackexchange.com/a/99418/3690
মার্টিন স্মিথ

উত্তর:


7

ক্লাস্টারড ইনডেক্সটি পার্টিশন করা হয়েছে ReadTimeযাতে এটি আপনার বর্ণনা অনুযায়ী পিকে ব্যবহার করতে পারে না। Max(Id)প্রতিটি পার্টিশনের জন্য এটি সন্ধান করতে হবে এবং তারপরে সর্বাধিক সন্ধান করতে হবে। এটা তোলে হয় ক্যোয়ারী পুনর্লিখন তবে এই ধরনের একটি পরিকল্পনা পেতে সম্ভব।

এখানে নিবন্ধের উপর ভিত্তি করে একটি উদাহরণ ব্যবহার করে একটি সম্ভাব্য পুনর্লিখন হতে পারে

SELECT MAX(ID) AS ID
FROM   sys.partitions AS P
       CROSS APPLY (SELECT MAX(ID) AS ID
                    FROM   [dbo].[CDSIM_BE]
                    WHERE  $PARTITION.MonthlyArchiveFunction9(ReadTime) 
                                                    = P.partition_number) AS A
WHERE  P.object_id = OBJECT_ID('dbo.CDSIM_BE')
       AND P.index_id <= 1; 

ঘুরে প্রতিটি পার্টিশন প্রক্রিয়া করা।

নোট করুন পরিকল্পনায় এখনও একটি স্ক্যান রয়েছে (পার্টিশন নির্বাচন করার জন্য প্রিকিকেট সহ) তবে এটি পার্টিশনের সম্পূর্ণ স্ক্যান নয়।

স্ক্যানটি "ব্যাকওয়ার্ড" দিকনির্দেশ সহ সূচী ক্রমে রয়েছে। TOPপুনরুক্তিকারীর পর প্রথম এক গৃহীত হয় স্ক্যান থেকে সারি অনুরোধ বন্ধ করতে পারবেন।

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

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