关于varchar字段的SQL连接超时

时间:2010-03-08 17:13:49

标签: sql join sql-delete

我有一个连接删除与另一个表匹配的行,但连接字段必须是一个大的varchar(250个字符)。我知道这不理想,但我想不出更好的方法。这是我的疑问:

DELETE P 
FROM dbo.FeedPhotos AS P
INNER JOIN dbo.ListingPhotos AS P1 ON P.photo = P1.feedImage
INNER JOIN dbo.Listings AS L ON P.accountID = L.accountID
WHERE P.feedID = @feedID

即使在ListingPhotos表中少于1000行,此查询也会不断超时。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:3)

我可能首先删除这一行,因为它似乎没有做任何事情:

INNER JOIN dbo.Listings AS L ON P.accountID = L.accountID

ListingPhotos中可能没有很多行,但如果Listings中有很多行,则联接将不会被优化。

同时检查索引,因为没有适当的索引,任何连接都会很慢。虽然您通常应该尽量避免加入字符字段,但这通常表明数据未正确规范化。

答案 1 :(得分:1)

我会考虑:

  • 重写使用EXISTS。如果更可靠地找到一行然后依赖于可能有更多中间行的JOIN(这是Aaronaught所说的),这将停止处理

  • 确保所有数据类型与完全匹配。所有长度或类型的差异都意味着不会使用任何索引

  • 说到哪,你有关于feedid,photo和accountid的索引(粗略猜测)?

类似的东西:

DELETE
    P 
FROM
    dbo.FeedPhotos AS P
WHERE
    P.feedID = @feedID
    AND
    EXISTS (SELECT * FROM
             dbo.ListingPhotos P1
           WHERE P.photo = P1.feedImage)
    AND
    EXISTS (SELECT * FROM
             dbo.Listings L
           WHERE P.accountID = L.accountID)

答案 2 :(得分:0)

只需添加index

CREATE INDEX idx_feedPhotos_feedid
    ON dbo.FeedPhotos (feedId)