SQL присоединяется к тайм-аутам полей varchar - PullRequest
2 голосов
/ 08 марта 2010

У меня есть объединение, которое удаляет строки, соответствующие другой таблице, но поля объединения должны быть большими 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 строк.

Любая помощь будет оценена.

Ответы [ 3 ]

3 голосов
/ 08 марта 2010

Я бы, вероятно, начал с удаления этой строки, так как она, похоже, ничего не делает:

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

В ListingPhotos может быть не так много строк, но если в Listings много строк, то объединение не будет оптимизировано.

Также проверьте свою индексацию, поскольку любое соединение обязательно будет медленным без соответствующих индексов. Хотя вы все равно должны стараться избегать присоединения к символьным полям, обычно это признак того, что данные не нормализованы должным образом.

1 голос
/ 08 марта 2010

Я бы рассмотрел:

  • переписать, чтобы использовать EXISTS. Это остановит обработку, если одна строка будет найдена более надежно, чем полагается на JOIN, который может иметь гораздо больше промежуточных строк (что и сказал Аарона)

  • убедитесь, что все типы данных совпадают точно . Все различия по длине или типу означают, что индексы не будут использоваться

  • Говоря о том, есть ли у вас индекс (приблизительное предположение) на feedid, фотографии и 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)
0 голосов
/ 08 марта 2010

Просто добавьте index .

CREATE INDEX idx_feedPhotos_feedid
    ON dbo.FeedPhotos (feedId)
...