Улучшить производительность удалений в табличной переменной - PullRequest
1 голос
/ 22 августа 2011

Я видел изменения производительности для удаления на обычных таблицах в t-sql.

Но есть ли изменения производительности при удалении в табличных переменных, которые нужно сделать?


EDIT

Вот пример: График становится толще, поскольку UserExclusionEvaluate на самом деле является CTE, но я собираюсь сначала попытаться оптимизировать его вокруг переменной таблицы (если это возможно). Сам CTE работает очень быстро. Просто медленное удаление.

DELETE FROM @UsersCriteria
FROM @UsersCriteria UsersCriteria
WHERE UserId IN (SELECT UserID FROM UserExclusionsEvaluate WHERE PushRuleExclusionMet = 1)

В текущем воплощении @UsersCriteria:

DECLARE @UsersCriteria TABLE
(
    UserId int primary key,
    PushRuleUserCriteriaType int
)

Я пробовал @UsersCriteria как неосновные и экспериментировал с кластеризованными некластеризованными.

Вероятно, проблема также в IN. Я также попытался присоединиться к подзапросу.


EDIT:

ХОРОШИЕ НОВОСТИ! После множества игр с SQL, включая перемещение запроса в цепочку CTE, попытки подсказок таблицы и т. Д. И т. Д. И т.

Простое изменение табличной переменной на временную таблицу значительно повысило производительность.

Что действительно интересно, поскольку удаление выполнялось само собой, подзапрос (в CTE) выполнялся сам по себе. Но смешивание этих двух мега замедлилось.

Я полагаю, что оптимизатор не может включиться при использовании CTE в подзапросе? Возможно при смешивании с удалением.

Ответы [ 3 ]

4 голосов
/ 22 августа 2011

Не совсем.

Если вы не определили PK в DECLARE, который может работать: статистика для табличных переменных отсутствует, и предполагается, что таблица содержит только 1 строку

3 голосов
/ 22 августа 2011

Ну, есть ограниченная сумма, которую вы можете сделать.Однако, если у вас большой набор данных в табличной переменной, вы должны использовать временную таблицу, если вам нужна лучшая производительность.

Вы также можете выполнять удаление в пакетном режиме (скажем, 1000 одновременно).

В противном случае покажите нам свой статус удаления, и мы посмотрим, увидим ли мы что-либо, что может быть исправлено.

1 голос
/ 22 августа 2011

NO.

Переменные в таблице не могут быть изменены и кратковременны.У них нет статистики.

Они не предназначены для хранения очень больших объемов данных.

Если у вас есть табличная переменная, которая достаточно велика, чтобы вызвать проблемы с производительностью при удалении из неевы используете их непреднамеренно.Поместите эти данные в таблицу #Temp или реальную таблицу, чтобы иметь больше контроля.

...