varchar字段上的SQL联接超时
我有一个连接,它删除与另一个表匹配的行,但是连接字段必须是一个大的varchar(250个字符)。我知道这并不理想,但我想不出更好的办法。我的问题是:varchar字段上的SQL联接超时,sql,join,sql-delete,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 = @fe
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行,此查询也会不断超时
任何帮助都将不胜感激。只需添加一个
我可能会先删除这一行,因为它似乎没有任何作用:
INNER JOIN dbo.Listings AS L ON P.accountID = L.accountID
ListingPhotos
中可能没有太多的行,但是如果Listings
中有太多的行,那么连接将不会被优化
还要检查索引,因为如果没有适当的索引,任何连接都会很慢。尽管您通常应该尽量避免在字符字段上连接,但这通常是数据未正确规范化的迹象。我会考虑:
- 重写以使用已存在。如果发现一行比依赖连接更可靠,那么这将停止处理,因为连接可能有更多的中间行(这是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)
在
P.photo
和P1.feedImage
上是否有索引?这些肯定会有帮助…如果是自然密钥,并且您没有使用代理密钥,那么加入varchar是可以接受的(询问Joe Celko:-)。如果varchar列是唯一值,并且您选择int标识作为PK来保存数据,则必须在该列上添加唯一约束或索引integrity@gbn:如果您的自然密钥为250个字符,则是使用代理的时候了;在多个索引的插入
/更新
/删除
性能命中与长度超过8字节的键的选择
性能命中之间存在折衷,但250是另一边的问题。此外,我不相信乔·塞尔科能正确地告诉我一天的时间谢谢,我需要加入列表,因为我只想匹配特定帐户上的照片。如果另一个帐户上有匹配项,我不想删除它。然而,我已经交换了连接回合,因此它首先处理帐户,然后在accountID和feedImage上添加了一些索引。目前看来一切都很顺利…@CL4NCY:我觉得加入另一个表不会阻止删除附加到其他帐户的照片,除非你在原始帖子中省略了几行WHERE/和。但是在任何情况下,如果你没有索引,那么这就是问题所在;重新排序联接通常不会产生任何效果,因为优化器会自行重新排列。@Aaronaught:谢谢,你说得对,我不需要列表上的联接。
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)