我有一个连接删除与另一个表匹配的行,但连接字段必须是一个大的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行,此查询也会不断超时。
任何帮助都将不胜感激。
答案 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)