-3

[deliverybody]フィールドに「x」が含まれているかどうかを確認して「x」の行を削除すると、最初の/キャッシュされていないクエリに時間がかかります。'x'をチェックしないと、[deliverytime]にインデックスが付けられ、クエリが1秒で完了します。

AND [ deliverybody] <>'x'の部分がある場合、クエリの実行時間は10秒以上です。1秒。インデックス付きフィールド[deliverytime]はあまり役に立たないようです。

クエリは1600行のみを返します。追加の1600フィールドのスキャンには、10秒以上かかります。クエリの何が問題になっていますか?

更新: NTEXTからNVARCHAR(MAX)にアップグレードされました。内部クエリの実行プラン:

このクエリには10秒以上かかります。

  SELECT MAX([deliveryid]) AS deliveryid, COUNT(*) AS cnt  
  FROM [_hMaiServer].[dbo].[hm_deliverylog]
  WHERE [deliverytime] > DATEADD(HOUR, -24, GETDATE()) 
  AND [deliverybody] <> 'x' 
  GROUP BY deliverysubject

クエリは1秒で完了しました:

SELECT MAX([deliveryid]) AS deliveryid, COUNT(*) AS cnt  
FROM [_hMaiServer].[dbo].[hm_deliverylog]
WHERE [deliverytime] > DATEADD(HOUR, -2400, GETDATE()) 
--AND [deliverybody] <> 'x' 
GROUP BY deliverysubject

そしてインデックス付きのテーブル構造:http: //pastebin.com/W0PsDnqS

私の結論:

5000行のチェックには10秒以上かかります。{HOUR}の値を小さくすると、実行時間が速くなります。これで問題ない場合は問題ありませんが、私には遅いようです。

SELECT COUNT(*) FROM [hm_deliverylog]
WHERE [deliverybody] <> 'x' 
AND [deliverytime] > DATEADD(HOUR, -__{HOUR}__ , GETDATE())     
4

1 に答える 1

1

SET STATISTICS IO ON;要求された結果を提供していません。

ただし、考えられる改善の1つは、を使用する代わりに使用することです。

WHERE [deliverybody] <> 'x'

使用する

WHERE NOT (LEN([deliverybody]) = 1 AND LEFT([deliverybody],1) = 'X')

これが有益な例を以下に示します。

CREATE TABLE T1
  (
     Id             INT,
     [deliverybody] VARCHAR(MAX)
  )

INSERT INTO T1
VALUES     (1, Replicate(Cast('A' AS VARCHAR(MAX)), 2000000000)),
           (2,'X')

SET STATISTICS IO ON;

SELECT id
FROM   T1
WHERE  NOT ( Len([deliverybody]) = 1
             AND LEFT([deliverybody], 1) = 'X' )

SELECT id
FROM   T1
WHERE  [deliverybody] <> 'X'

DROP TABLE T1 

両方のIO結果は以下のとおりです

Table 'T1'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0
            , lob logical reads 6, lob physical reads 0, lob read-ahead reads 0.

Table 'T1'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0
    lob logical reads 2209665, lob physical reads 0, lob read-ahead reads 642255.

最初のものは、2GBの値全体をドラッグアウトして、そうではないことを検出することを回避するため、読み取りが大幅に少なくなります。X

于 2012-11-13T21:41:00.397 に答える