2013-04-03 34 views
0

sqlserver的2005年删除与联接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

不,没有使用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'值。

+0

CURRENT_STATE列上已经有一个索引 –

+0

如果您没有明白我的意思,那么重要的索引是BATCH_ID(在这两个表中)和INQUIRY_MATCH_ID上的索引。 CURRENT_STATE *上的索引可能会有所帮助,但不会像其他索引那样多。 –

+0

谢谢亚当明白你的观点。 –