2

我有一个连接删除与另一个表匹配的行,但连接字段必须是一个大的 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,此查询也会不断超时。

任何帮助,将不胜感激。

4

3 回答 3

3

我可能会先删除这条线,因为它似乎没有做任何事情:

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

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

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

于 2010-03-08T17:16:36.763 回答
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)
于 2010-03-08T17:29:13.853 回答
0

只需添加一个索引

CREATE INDEX idx_feedPhotos_feedid
    ON dbo.FeedPhotos (feedId)
于 2010-03-08T17:15:16.163 回答