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 上的索引可能无济于事。一般的经验法则是 MSSQL 不会选择使用索引,除非有大约 5% 的选择性(例如均匀分布的 20 个不同的值)。该指南可能完全排除了索引 BATCH_SCORE.PERMANENT_BATCH,因为我猜它只包含“N”和“Y”值。

于 2013-04-03T16:49:58.573 回答