Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
varchar字段上的SQL联接超时_Sql_Join_Sql Delete - Fatal编程技术网

varchar字段上的SQL联接超时

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

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

任何帮助都将不胜感激。

只需添加一个


我可能会先删除这一行,因为它似乎没有任何作用:

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)