আমার উপস্থিতি জিজ্ঞাসা কেন সূচীর পরিবর্তে সূচি স্ক্যান করছে?


15

আমি কিছু প্রশ্নের অনুকূলিতকরণ কাজ করছি।

নীচের প্রশ্নের জন্য,

SET STATISTICS IO ON;
DECLARE @OrderStartDate DATETIME2 = '27 feb 2016';
DECLARE @OrderEndDate  DATETIME2 = '28 feb 2016';

SELECT  o.strBxOrderNo
        , o.sintOrderStatusID
        , o.sintOrderChannelID
        , o.sintOrderTypeID
        , o.sdtmOrdCreated
        , o.sintMarketID
        , o.strOrderKey
        , o.strOfferCode
        , o.strCurrencyCode
        , o.decBCShipFullPrice
        , o.decBCShipFinal
        , o.decBCShipTax
        , o.decBCTotalAmount
        , o.decWrittenTotalAmount
        , o.decBCWrittenTotalAmount
        , o.decBCShipOfferDisc
        , o.decBCShipOverride
        , o.decTotalAmount
        , o.decShipTax
        , o.decShipFinal
        , o.decShipOverride
        , o.decShipOfferDisc
        , o.decShipFullPrice
        , o.lngAccountParticipantID
        , CONVERT(DATE, o.sdtmOrdCreated, 120) as OrderCreatedDateConverted
FROM    tablebackups.dbo.tblBOrder o
WHERE   o.sdtmOrdCreated >= @OrderStartDate
        AND o.sdtmOrdCreated < @OrderEndDate
        AND EXISTS  (
            SELECT  *
            FROM    tablebackups.dbo.tblBOrderItem oi 
            WHERE   oi.strBxOrderNo = o.strBxOrderNo
            AND     oi.decCatItemPrice > 0
        )
OPTION (RECOMPILE);

আমি নিম্নলিখিত ফিল্টারড সূচক তৈরি করেছি:

-- table dbo.tblBorderItem
CREATE NONCLUSTERED INDEX IX_tblBOrderItem_decCatItemPrice_INCL 
ON dbo.tblBorderItem 
( 
     strBxOrderNo ASC
    , sintOrderSeqNo ASC
    , decCatItemPrice   
)   
INCLUDE 
(
    blnChargeShipping
    , decBCCatItemPrice
    , decBCCostPrice
    , decBCFinalPrice
    , decBCOfferDiscount
    , decBCOverrideDiscount
    , decBCTaxAmount
    , decCostPrice
    , decFinalPrice
    , decOfferDiscount
    , decOverrideDiscount
    , decTaxAmount
    , decWasPrice
    , dtmOrdItemCreated
    , sintOrderItemStatusId
    , sintOrderItemType
    , sintQuantity
    , strItemNo
)  
WHERE decCatItemPrice > 0 
WITH (DROP_EXISTING = ON, FILLFACTOR = 95);

এই সূচকটি কেবলমাত্র এই ক্যোয়ারির জন্য বিশেষত ব্যবহৃত হয় না, এমন অন্যান্য প্রশ্ন রয়েছে যা এই সূচকটি ব্যবহার করে, সুতরাং কলামগুলি অন্তর্ভুক্ত।

বিশেষত এই ক্যোয়ারির জন্য, আমি যদি কেবল অর্ডারতে কোনও আইটেম থাকে তবে কেবলমাত্র (উপস্থিতি) পরীক্ষা করতে চাই decCatItemPrice > 0

এসকিউএল সার্ভার একটি সূচক স্ক্যান করছে যা আপনি নীচের ছবিগুলিতে দেখতে পাচ্ছেন।

  • পরিসংখ্যান সবেমাত্র আপডেট করা হয়েছে।
  • আইটেম সারণিতে পরীক্ষায় 41,208 সারি রয়েছে।

দয়া করে মনে রাখবেন, আমি আইটেম টেবিল থেকে কোনও কলাম নির্বাচন করি না।

এই আইটেমের টেবিলটিতে 164,309,397 লাইভ রয়েছে। আমি সেখানে স্ক্যান এড়াতে চাই।

প্রশ্ন:

এসকিউএল সার্ভার কেন একটি সূচক সন্ধান করছে না?

এই কোয়েরিটির উন্নতি করার জন্য আমার অন্যান্য বিবেচনা করা উচিত?

(4537 row(s) affected) Table 'tblBorder'. Scan count 1, logical reads
116, physical reads 0, read-ahead reads 0, lob logical reads 0, lob
physical reads 0, lob read-ahead reads 0. Table 'tblBorderItem'. Scan
count 1, logical reads 689, physical reads 0, read-ahead reads 0, lob
logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(1 row(s) affected)

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

এই সংজ্ঞা এবং টেবিল tblBorderItem এর সূচী হয়

    IF OBJECT_ID('[dbo].[tblBorderItem]') IS NOT NULL 
    DROP TABLE [dbo].[tblBorderItem] 
    GO
    CREATE TABLE [dbo].[tblBorderItem] ( 
    [strBxOrderNo]                VARCHAR(20)                      NOT NULL,
    [sintOrderSeqNo]              SMALLINT                         NOT NULL,
    [sintOrderItemStatusId]       SMALLINT                         NOT NULL,
    [sintNameStructureID]         SMALLINT                         NOT NULL,
    [strItemNo]                   VARCHAR(20)                      NOT NULL,
    [sintQuantity]                SMALLINT                         NOT NULL,
    [strCurrencyCode]             VARCHAR(3)                       NOT NULL,
    [decCostPrice]                DECIMAL(18,4)                    NOT NULL,
    [decCatItemPrice]             DECIMAL(18,2)                    NOT NULL,
    [decOfferDiscount]            DECIMAL(18,2)                    NOT NULL,
    [decOverrideDiscount]         DECIMAL(18,2)                    NOT NULL,
    [decFinalPrice]               DECIMAL(18,2)                    NOT NULL,
    [decTaxAmount]                DECIMAL(18,2)                    NOT NULL,
    [strBCCurrencyCode]           VARCHAR(3)                       NOT NULL,
    [decBCCostPrice]              DECIMAL(18,4)                    NOT NULL,
    [decBCCatItemPrice]           DECIMAL(18,4)                    NOT NULL,
    [decBCOfferDiscount]          DECIMAL(18,4)                    NOT NULL,
    [decBCOverrideDiscount]       DECIMAL(18,4)                    NOT NULL,
    [decBCFinalPrice]             DECIMAL(18,4)                    NOT NULL,
    [decBCTaxAmount]              DECIMAL(18,4)                    NOT NULL,
    [dtmOrdItemCreated]           DATETIME                         NOT NULL,
    [blnChargeShipping]           BIT                              NOT NULL,
    [lngTimeOfOrderQtyOnHand]     INT                                  NULL,
    [sdtmTimeOfOrderDueDate]      SMALLDATETIME                        NULL,
    [lngProdSetSeqNo]             INT                                  NULL,
    [lngProdRelationId]           INT                                  NULL,
    [lngProdRelationMemberId]     INT                                  NULL,
    [decWasPrice]                 DECIMAL(18,2)                        NULL,
    [sintOrderItemType]           SMALLINT                             NULL,
    [tsRowVersion]                TIMESTAMP                            NULL,
    [sdtmOrderItemStatusUpdated]  SMALLDATETIME                        NULL,
    CONSTRAINT   [PK_tblBOrderItem]  
PRIMARY KEY CLUSTERED    
([strBxOrderNo] asc, [sintOrderSeqNo] asc) 
WITH FILLFACTOR = 100)

    GO

    CREATE NONCLUSTERED INDEX 
    [IX_tblBOrderItem__dtmOrdItemCreated] 
       ON [dbo].[tblBorderItem] ([dtmOrdItemCreated] asc)
       WITH FILLFACTOR = 100


    CREATE NONCLUSTERED INDEX [IX_tblBOrderItem__sintOrderItemStatusId] 
       ON [dbo].[tblBorderItem] ([sintOrderItemStatusId] asc)
       INCLUDE ([sdtmOrderItemStatusUpdated], 
    [sintOrderSeqNo], [strBxOrderNo], [strItemNo])
       WITH FILLFACTOR = 100

CREATE NONCLUSTERED INDEX [IX_tblBOrderItem__
sintOrderItemStatusId_decFinalPrice_
sdtmOrderItemStatusUpdated_
include_strBxOrderNo] 
   ON [dbo].[tblBorderItem] 
([sintOrderItemStatusId] asc, 
 [decFinalPrice] asc, 
 [sdtmOrderItemStatusUpdated] asc)
   INCLUDE ([strBxOrderNo])
   WITH FILLFACTOR = 100

CREATE NONCLUSTERED INDEX [IX_tblBOrderItem__strBxOrderNo] 
   ON [dbo].[tblBorderItem] 
([strBxOrderNo] asc)
   WITH FILLFACTOR = 100


CREATE NONCLUSTERED INDEX [IX_tblBOrderItem__strItemNo] 
   ON [dbo].[tblBorderItem] ([strItemNo] asc)
   WITH FILLFACTOR = 100

CREATE NONCLUSTERED INDEX 
[IX_tblBOrderItem_decCatItemPrice_INCL] 
   ON [dbo].[tblBorderItem] 
([strBxOrderNo] asc, [sintOrderSeqNo] asc, [decCatItemPrice] asc)
   INCLUDE ([blnChargeShipping], 
[decBCCatItemPrice], [decBCCostPrice], [decBCFinalPrice], 
[decBCOfferDiscount], [decBCOverrideDiscount], 
[decBCTaxAmount], [decCostPrice], [decFinalPrice], 
[decOfferDiscount], [decOverrideDiscount], 
[decTaxAmount], [decWasPrice], [dtmOrdItemCreated], 
[sintOrderItemStatusId], [sintOrderItemType], 
[sintQuantity], [strItemNo])
   WHERE ([decCatItemPrice]>(0))
   WITH FILLFACTOR = 95

এটি টেবিল টিবিএলবোর্ডারের সংজ্ঞা এবং সূচিগুলি

IF OBJECT_ID('[dbo].[tblBorder]') IS NOT NULL 
DROP TABLE [dbo].[tblBorder] 
GO
CREATE TABLE [dbo].[tblBorder] ( 
[strBxOrderNo]                VARCHAR(20)                      NOT NULL,
[uidOrderUniqueID]            UNIQUEIDENTIFIER                 NOT NULL,
[sintOrderStatusID]           SMALLINT                         NOT NULL,
[sintOrderChannelID]          SMALLINT                         NOT NULL,
[sintOrderTypeID]             SMALLINT                         NOT NULL,
[blnIsBasket]                 BIT                              NOT NULL,
[sdtmOrdCreated]              SMALLDATETIME                    NOT NULL,
[sintMarketID]                SMALLINT                         NOT NULL,
[strOrderKey]                 VARCHAR(20)                      NOT NULL,
[strOfferCode]                VARCHAR(20)                      NOT NULL,
[lngShippedToParticipantID]   INT                              NOT NULL,
[lngOrderedByParticipantID]   INT                              NOT NULL,
[lngShipToAddressID]          INT                              NOT NULL,
[lngAccountAddressID]         INT                              NOT NULL,
[lngAccountParticipantID]     INT                              NOT NULL,
[lngOrderedByAddressID]       INT                              NOT NULL,
[lngOrderTakenBy]             INT                              NOT NULL,
[strCurrencyCode]             VARCHAR(3)                       NOT NULL,
[decShipFullPrice]            DECIMAL(18,2)                    NOT NULL,
[decShipOfferDisc]            DECIMAL(18,2)                    NOT NULL,
[decShipOverride]             DECIMAL(18,2)                    NOT NULL,
[decShipFinal]                DECIMAL(18,2)                    NOT NULL,
[decShipTax]                  DECIMAL(18,2)                    NOT NULL,
[strBCCurrencyCode]           VARCHAR(3)                       NOT NULL,
[decBCShipFullPrice]          DECIMAL(18,4)                    NOT NULL,
[decBCShipOfferDisc]          DECIMAL(18,4)                    NOT NULL,
[decBCShipOverride]           DECIMAL(18,4)                    NOT NULL,
[decBCShipFinal]              DECIMAL(18,4)                    NOT NULL,
[decBCShipTax]                DECIMAL(18,4)                    NOT NULL,
[decTotalAmount]              DECIMAL(18,2)                    NOT NULL,
[decBCTotalAmount]            DECIMAL(18,4)                    NOT NULL,
[decWrittenTotalAmount]       DECIMAL(18,2)                        NULL,
[decBCWrittenTotalAmount]     DECIMAL(18,4)                        NULL,
[blnProRataShipping]          BIT                              NOT NULL,
[blnChargeWithFirstShipment]  BIT                              NOT NULL,
[sintShippingServiceLevelID]  SMALLINT                         NOT NULL,
[sintShippingMethodID]        SMALLINT                         NOT NULL,
[sdtmDoNotShipUntil]          SMALLDATETIME                        NULL,
[blnHoldUntilComplete]        BIT                              NOT NULL,
[tsRowVersion]                TIMESTAMP                            NULL,
CONSTRAINT   [PK_tblBOrder]  
PRIMARY KEY CLUSTERED    
([strBxOrderNo] asc) WITH FILLFACTOR = 100)

GO

CREATE NONCLUSTERED INDEX 
[IX_tblBOrder__lngAccountAddressID] 
   ON [dbo].[tblBorder] 
   ([lngAccountAddressID] asc, [sintOrderStatusID] asc)
   WITH FILLFACTOR = 100

CREATE NONCLUSTERED INDEX 
[IX_tblBOrder__lngAccountParticipantID] 
   ON [dbo].[tblBorder] 
   ([lngAccountParticipantID] asc)
   WITH FILLFACTOR = 100

CREATE NONCLUSTERED INDEX 
[IX_tblBOrder__lngOrderedByAddressID] 
   ON [dbo].[tblBorder] 
   ([lngOrderedByAddressID] asc, [sintOrderStatusID] asc)
   WITH FILLFACTOR = 100

CREATE NONCLUSTERED INDEX 
[IX_tblBOrder__lngOrderedByParticipantID] 
   ON [dbo].[tblBorder] ([lngOrderedByParticipantID] asc)
   WITH FILLFACTOR = 100

CREATE NONCLUSTERED INDEX 
[IX_tblBOrder__lngShippedToParticipantID] 
   ON [dbo].[tblBorder] 
   ([lngShippedToParticipantID] asc)
   WITH FILLFACTOR = 100

CREATE NONCLUSTERED INDEX 
[IX_tblBOrder__lngShipToAddressID] 
   ON [dbo].[tblBorder] 
   ([lngShipToAddressID] asc, [sintOrderStatusID] asc)
   WITH FILLFACTOR = 100

CREATE NONCLUSTERED INDEX 
[IX_tblBOrder__sdtmOrdCreated_sintMarketID__include_strBxOrderNo] 
   ON [dbo].[tblBorder] 
   ([sdtmOrdCreated] asc, [sintMarketID] asc)
   INCLUDE ([strBxOrderNo])
   WITH FILLFACTOR = 100

CREATE NONCLUSTERED INDEX 
[IX_tblBOrder_sdtmOrdCreated_INCL] 
   ON [dbo].[tblBorder] 
   ([sdtmOrdCreated] asc)
   INCLUDE ([decBCShipFinal], [decBCShipFullPrice], 
            [decBCShipOfferDisc], [decBCShipOverride], 
            [decBCShipTax], [decBCTotalAmount], [decBCWrittenTotalAmount], 
            [decShipFinal], [decShipFullPrice], [decShipOfferDisc], 
            [decShipOverride], [decShipTax], [decTotalAmount], 
            [decWrittenTotalAmount], [lngAccountParticipantID], 
            [lngOrderedByParticipantID], [sintMarketID], 
            [sintOrderChannelID], [sintOrderStatusID], 
            [sintOrderTypeID], [strBxOrderNo], [strCurrencyCode], 
            [strOfferCode], [strOrderKey])
   WITH FILLFACTOR = 100

CREATE NONCLUSTERED 
INDEX [IX_tblBOrder_sintMarketID_sdtmOrdCreated] 
   ON [dbo].[tblBorder] 
   ([sintMarketID] asc, [sdtmOrdCreated] asc)
   INCLUDE ([sintOrderChannelID], [strBxOrderNo])
   WITH FILLFACTOR = 100

CREATE NONCLUSTERED 
INDEX [IX_tblBOrder__sintOrderChannelID_sdtmOrdCreated_INCL] 
   ON [dbo].[tblBorder] 
   ([sintOrderChannelID] asc, [sdtmOrdCreated] asc)
   INCLUDE ([decBCShipFinal], [decBCShipFullPrice], 
   [decBCShipTax], [decShipFinal], [decShipFullPrice], 
   [decShipTax], [lngAccountParticipantID], [sintMarketID], 
   [sintOrderTypeID], [strBxOrderNo], 
   [strCurrencyCode], [strOrderKey])
   WITH FILLFACTOR = 100

CREATE NONCLUSTERED INDEX [IX_tblBOrder_strBxOrderNo_sdtmOrdCreated_incl] 
   ON [dbo].[tblBorder] ([strBxOrderNo] asc, 
   [sdtmOrdCreated] asc)
   INCLUDE ([sintOrderChannelID], [sintOrderTypeID], [sintMarketID], 
   [strOrderKey], [lngAccountParticipantID], [strCurrencyCode], 
   [decShipFullPrice], [decShipFinal], [decShipTax], 
   [decBCShipFullPrice], [decBCShipFinal], 
   [decBCShipTax])

উপসংহার

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

এর পরে, ক্যোয়ারী প্ল্যানটি দেখার সময় আমি নীচের ছবিটি দেখছি:

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

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

এটি ঠিক কীভাবে আমি এটি হতে চেয়েছিলাম।

আমি মনে করি এই ক্ষেত্রে ক্যোয়ারী অপ্টিমাইজার উভয় পরিবেশে সর্বোত্তম ক্যোয়ারী পরিকল্পনা পেতে ভাল কাজ করেছে এবং আমি খুশী যে আমি কোনও ক্যোয়ারির ইঙ্গিতগুলি যোগ না করলাম।

পোস্ট করা 3 টি উত্তর দিয়ে শিখেছি। ধন্যবাদ ম্যাক্স ভারনন , পল হোয়াইট এবং ড্যানিয়েল Hutmacher তাদের উত্তরের জন্য।

উত্তর:


15

আপনি যদি ক্যোয়ারী অপ্টিমাইজারের কাছ থেকে ভাল ফলাফল চান, তবে এটি ডেটা ধরণের সম্পর্কে সতর্ক থাকার জন্য অর্থ প্রদান করে

আপনার ভেরিয়েবলগুলি ডেটটাইম 2 হিসাবে টাইপ করা হয় :

DECLARE @OrderStartDate datetime2 = '27 feb 2016';
DECLARE @OrderEndDate  datetime2 = '28 feb 2016';

তবে এগুলির সাথে যে কলামটি তুলনা করা হয় তা টাইপ করা হয়েছে ছোট্ট সময়কাল (যেমন এসডিটিএম উপসর্গটি সূচিত করে!):

[sdtmOrdCreated] SMALLDATETIME NOT NULL

এক্সিকিউশন প্ল্যান এক্সএমএল-তে বর্ণিত যেমন অসম্পূর্ণতা প্রকারটি রূপান্তরকরণের মাধ্যমে ফলাফলের কার্ডিনালটির প্রাক্কলনটি কার্যকর করা অপ্টিমাইজারের পক্ষে এটি শক্ত করে তোলে :

<ScalarOperator ScalarString="GetRangeWithMismatchedTypes([@OrderStartDate],NULL,(22))">
<ScalarOperator ScalarString="GetRangeWithMismatchedTypes(NULL,[@OrderEndDate],(10))">

বর্তমান অনুমানটি সঠিক হতে পারে বা নাও হতে পারে (সম্ভবত না)। ধরণের অসঙ্গতি ঠিক করা আপনার পরিকল্পনা নির্বাচনের সমস্যাটিকে পুরোপুরি সমাধান করতে পারে বা নাও পারে, তবে সমস্যাটি গভীরতর দেখার আগে এটিই প্রথম (সহজ!) জিনিসটি ঠিক করব:

DECLARE @OrderStartDate smalldatetime = CONVERT(smalldatetime, '20160227', 112);
DECLARE @OrderEndDate smalldatetime = CONVERT(smalldatetime, '20160228', 112);

কোরিয়ালিটি পুনরায় লেখার বা ইঙ্গিতগুলি ব্যবহার করার সিদ্ধান্ত নেওয়ার আগে সর্বদা কার্ডিনালিটির অনুমানের নির্ভুলতা এবং কোনও তাত্পর্য হওয়ার কারণটি পরীক্ষা করে দেখুন ।

ডায়নামিক সিক সম্পর্কে আরও তথ্যের জন্য আমার এসকিউএলব্লগ.কম নিবন্ধ, "ডায়নামিক সিকস এবং হিডেন ইম্পিলিটি রূপান্তর" দেখুন।

আপডেট: ডেটা টাইপ স্থির করা আপনার পছন্দসই পরিকল্পনাটি পেয়েছিল। এর আগে ধরণের রূপান্তরকরণের কারণে কার্ডিনালিটি অনুমানের ত্রুটিগুলি আপনাকে ধীর গতির পরিকল্পনা দিয়েছে।


11

এসকিউএল সার্ভার একটি সূচক স্ক্যান করছে যেহেতু এটি মনে করে যে প্রতিটি প্রয়োজনীয় সারির চেয়ে চেয়ে সস্তা। সম্ভবত, এসকিউএল সার্ভারটি আপনার সেটআপের পছন্দ অনুসারে সঠিক।

সচেতন থাকুন এসকিউএল সার্ভার আসলে সূচকটি পুরো সূচি স্ক্যান করার বিপরীতে সূচীতে একটি রেঞ্জ স্ক্যান করছে।

যদি আপনি উভয় টেবিলের জন্য ডিডিএল সরবরাহ করেন তবে আপনার অন্যান্য সূচকগুলিও বজায় রাখতে পারে তবে আমরা আপনাকে এই কম সংস্থানকে আরও নিবিড় করে তুলতে সহায়তা করতে পারি।

পার্শ্ব নোট হিসাবে, কখনও কখনও তারিখের আক্ষরিক ব্যবহার করবেন না। পরিবর্তে:

DECLARE @OrderStartDate DATETIME2 = '27 feb 2016';
DECLARE @OrderEndDate  DATETIME2 = '28 feb 2016';

এটা ব্যবহার কর:

DECLARE @OrderStartDate DATETIME2 = '2016-02-27T00:00:00.0000';
DECLARE @OrderEndDate  DATETIME2 = '2016-02-28T00:00:00.0000';

হারুনের পোস্ট এটি পরিষ্কার করতে সাহায্য করতে পারে।


6

ম্যাক্সের উত্তরে যোগ করতে, আমি সম্ভবত আপনার প্রশ্নের দুটি অংশে বিভক্ত করার চেষ্টা করব:

DECLARE @OrderStartDate DATETIME2 = {d '2016-02-27'};
DECLARE @OrderEndDate   DATETIME2 = {d '2016-02-28'};

--- Work variable declarations:
DECLARE @minOrderNo varchar(20), @maxOrderNo varchar(20);

--- Find the lowest and highest order number respectively for
--- your date range:
SELECT @minOrderNo=MIN(strBxOrderNo),
       @maxOrderNo=MAX(strBxOrderNo)
FROM    dbo.tblBOrder o
WHERE   o.sdtmOrdCreated >= @OrderStartDate AND
        o.sdtmOrdCreated <  @OrderEndDate;

--- Join orders and order items on their respective clustering keys.
SELECT    o.strBxOrderNo
        , o.sintOrderStatusID
        , o.sintOrderChannelID
        , o.sintOrderTypeID
        , o.sdtmOrdCreated
        , o.sintMarketID
        , o.strOrderKey
        , o.strOfferCode
        , o.strCurrencyCode
        , o.decBCShipFullPrice
        , o.decBCShipFinal
        , o.decBCShipTax
        , o.decBCTotalAmount
        , o.decWrittenTotalAmount
        , o.decBCWrittenTotalAmount
        , o.decBCShipOfferDisc
        , o.decBCShipOverride
        , o.decTotalAmount
        , o.decShipTax
        , o.decShipFinal
        , o.decShipOverride
        , o.decShipOfferDisc
        , o.decShipFullPrice
        , o.lngAccountParticipantID
        , CONVERT(DATE, o.sdtmOrdCreated, 120) as OrderCreatedDateConverted
FROM dbo.tblBOrder AS o
INNER /*MERGE*/ JOIN dbo.tblBOrderItem AS oi ON
    o.strBxOrderNo>=@minOrderNo AND      --- OrderNo filter on "orders"
    o.strBxOrderNo<=@maxOrderNo AND
    oi.strBxOrderNo=o.strBxOrderNo AND   --- Equijoin
    oi.strBxOrderNo>=@minOrderNo AND     --- OrderNo filter on "order items"
    oi.strBxOrderNo<=@maxOrderNo AND
    oi.decCatItemPrice > 0               --- Item price filter on "order items"
OPTION (RECOMPILE);

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

সব মিলিয়ে, এমআইএন / ম্যাক্স ক্যোয়ারী তারিখ কলামে একটি ক্লাস্টারযুক্ত সূচী থেকে অর্ডার সংখ্যা (ক্লাস্টারিং কীটিতে অন্তর্ভুক্ত) সীমাটি শনাক্ত করতে অর্ডার সারণীতে একটি সর্বোচ্চ অনুকূল সূচক ব্যবহার করে:

MIN / MAX ক্যোয়ারী পরিকল্পনা plan

তারপরে, আপনি তাদের নিজস্ব ক্লাস্টারযুক্ত সূচীতে দুটি টেবিলগুলিতে যোগ দিতে পারেন:

অর্ডার এবং অর্ডার আইটেমগুলিতে যোগদান করুন

স্পষ্টতই, পরীক্ষা করার জন্য আমার কাছে আপনার ডেটা নেই, তবে আমি ধারণা করি এটি সত্যিই ভাল পারফরম্যান্স সমাধান হওয়া উচিত।


+1 আমি এখানে চিন্তাভাবনা করার পদ্ধতিটি সত্যিই পছন্দ করেছি। এটি বিশেষ করে এই ক্ষেত্রে দৃশ্যের জন্য কাজ করে না তবে আমি ধারণা পেয়েছিলাম।
মার্সেলো মিওরেলি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.