0

結合を伴うSqlserver 2005削除クエリ

レコードを削除する次のクエリがありますが、このクエリで最適化できるものはありますか? 結合を使用してレコードを削除する方法は完璧ですか? 結合レコードで削除するオーバーヘッドはありますか?

DELETE BATCH_SCORE
    FROM BATCH_SCORE BS JOIN INQUIRY_MATCH IM ON BS.BATCH_ID = IM.BATCH_ID AND IM.INQUIRY_MATCH_ID = #inquiryMatchId#
    WHERE NOT EXISTS (SELECT TOP 1 1 FROM INQUIRY_MATCH WHERE BATCH_ID = BS.BATCH_ID AND CURRENT_STATE IN ('OPN','RVW',
    'ASN', 'ESC', 'PND')) AND BS.PERMANENT_BATCH = 'N'

私は次のように新しいクエリを書きました。新しいクエリは上記のものよりも優れています

 DELETE
    BATCH_SCORE
FROM
    BATCH_SCORE BS
WHERE
    NOT EXISTS (
SELECT
    TOP 1 1
FROM
    INQUIRY_MATCH
WHERE
    INQUIRY_MATCH_ID = 1011 AND
    BATCH_ID = BS.BATCH_ID AND
    CURRENT_STATE IN ('OPN',
    'RVW',
    'ASN',
    'ESC',
    'PND')) AND
    BS.PERMANENT_BATCH = 'N'
4

1 に答える 1

1

いいえ、DELETE ステートメントで JOIN を使用しても特にオーバーヘッドはありません。どちらのクエリも非常に単純で、最適化の余地はほとんどありません。パフォーマンスが不足している場合は、検索対象の列にインデックスを追加してみてください (INQUIRY_MATCH.INQUIRY_MATCH_ID、INQUIRY_MATCH.BATCH_ID、BATCH_SCORE.BATCH_ID)。

INQUIRY_MATCH.CURRENT_STATE のインデックスは、その列に個別の値がいくつあるかによっては役に立たない場合があります。一般的な経験則では、約 5% の選択性 (たとえば、20 個の個別の値が均等に分散されている) がない限り、MSSQL はインデックスの使用を選択しません。このガイドラインはおそらく、BATCH_SCORE.PERMANENT_BATCH のインデックス作成を完全に除外します。これは、'N' 値と 'Y' 値のみが含まれていると推測されるためです。

于 2013-04-03T16:49:58.573 に答える