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 を使用するように書き換えます。1行がより確実に見つかった場合、これは処理を停止し、さらに多くの中間行がある可能性がある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 に答える