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'
答案 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'值。