0

以下のSQLクエリを最適化するタスクを与えました。現在業績不振です。その実行計画を実行したところ、クラスター化インデックス スキャンが実行されていることがわかりました。そのコストは非常に高くなっています。どうすればコストを削減できますか、または代わりにインデックスシークを使用するように変更できますか?

SELECT TOP 20 CustomerPrimaryExtID,
              Max(POSTimeStamp)     AS TransactionDate,
              ExtLocationCode,
              0                     AS RedemptionAmount,
              0                     AS RedemptionCount,
              TerminalNum,
              LogixTransNum,
              POSTransNum           AS TransNum,
              0                     AS DetailRecords,
              CustomerTypeID,
              PresentedCustomerID,
              PresentedCardTypeID,
              HHID,
              Replayed,
              0                     AS TransContext,
              isnull(TransTotal, 0) AS TransTotal

FROM   TransHist AS TH WITH(nolock)
WHERE  ( ( ( CustomerPrimaryExtID IN ( '' )
             AND HHID IS NULL )            

            OR HHID = '0000000250000013408'
               AND CustomerTypeID <> 1 )                            

          OR ( CustomerPrimaryExtID = '0000000250000013408'
               AND CustomerTypeID = 1 ) )           

       AND NOT EXISTS (SELECT LogixTransNum
                       FROM   TransRedemption AS TR2 with(nolock)
                       WHERE  ( ( ( CustomerPrimaryExtID IN ( '' )
                                    AND HHID IS NULL )
                                   OR HHID = '0000000250000013408'
                                      AND CustomerTypeID <> 1 )
                                 OR ( CustomerPrimaryExtID = '0000000250000013408'
                                      AND CustomerTypeID = 1 ) )
                              AND TH.LogixTransNum = TR2.LogixTransNum)

GROUP  BY CustomerPrimaryExtID,
          HHID,
          CustomerTypeID,
          PresentedCustomerID,
          PresentedCardTypeID,
          LogixTransNum,
          POSTransNum,
          TerminalNum,
          ExtLocationCode,
          Replayed,
          TransTotal
ORDER  BY TransactionDate DESC 

ここに画像の説明を入力

ここに画像の説明を入力

4

1 に答える 1

0

注意すべき点: CustomerTypeID <> 1CustomerTypeID > 1 ほど効果的にインデックスを使用しません。以下のテスト例を参照してください。また、WHERE NOT EXISTSまたはNOT INパフォーマンスキラーでもあります。

CREATE TABLE NumberCrazy(
    IntegersAreCool INT
)

-- Run this 20+ times
INSERT INTO NumberCrazy
VALUES (1)

-- Run this twice
DECLARE @begin INT = 1, @max INT = 2000, @r INT

WHILE @begin <= @max
BEGIN

    SET @r = (RAND()*(@begin))

    INSERT INTO NumberCrazy
    SELECT @r

    SET @begin = @begin + 1

END

CREATE CLUSTERED INDEX [IX_DaInts] ON [dbo].[NumberCrazy]
(
    [IntegersAreCool] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)

GO

SET STATISTICS IO ON

SELECT *
FROM NumberCrazy
WHERE IntegersAreCool > 1

SELECT *
FROM NumberCrazy
WHERE IntegersAreCool <> 1

結果:

テーブル「NumberCrazy」。スキャン カウント 1、論理読み取り 12、物理読み取り 0、先読み読み取り 0、LOB 論理読み取り 0、LOB 物理読み取り 0、LOB 先読み読み取り 0。

テーブル「NumberCrazy」。スキャン カウント 2、論理読み取り 15、物理読み取り 0、先読み読み取り 0、LOB 論理読み取り 0、LOB 物理読み取り 0、LOB 先読み読み取り 0。

NOTE THE EXECUTION PLAN(この上にある混乱のように見えます)。

于 2013-10-02T22:05:28.787 に答える