Sqlserver 2005使用join删除查询

时间:2013-04-03 15:56:20

标签: sql-server-2005 query-optimization

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'

1 个答案:

答案 0 :(得分:1)

不,在DELETE语句中使用JOIN没有特别的开销。两个查询都相当简单,几乎没有优化空间。如果缺少性能,请尝试将索引添加到要搜索的列(INQUIRY_MATCH.INQUIRY_MATCH_ID,INQUIRY_MATCH.BATCH_ID,BATCH_SCORE.BATCH_ID)

INQUIRY_MATCH.CURRENT_STATE上的索引可能没有帮助,具体取决于该列中有多少个不同的值。一般的经验法则是MSSQL不会选择使用索引,除非大约有5%的选择性(例如20个不同的值均匀分布)。该指南可能完全排除了索引BATCH_SCORE.PERMANENT_BATCH,因为我猜它只包含'N'和'Y'值。