Режим SQL Server «Сухой пробег»? Загрузить буферы данных, без удерживания замков или изменяющихся данных
-
24-09-2019 - |
Вопрос
Я собираюсь запустить некоторые запросы против базы данных SQL Server, а затем удалить. В идеале все это происходит внутри транзакции (то есть атомная).
Но практически, потому что данные давно убраны из буферов, SQL Server должен будет выполнить много физического IO для завершения транзакции T-SQL. Это может быть проблемой, потому что, если для запуска всей патенты занимает более 30 секунд, то пользователи будут испытывать проблемы ожидания времени.
Я заметил, что если я бегу select
S На куски, каждый раз, когда бегут все больше и больше окончательного SQL, позволяя SQL Server заполнить буферы все больше и больше необходимых данных. например:
Первый забег:
BEGIN TRANSACTION
SELECT ... WHERE ...
ROLLBACK
Второй пробег:
BEGIN TRANSACTION
SELECT ... WHERE ...
SELECT ... WHERE ...
ROLLBACK
...
неверный:
BEGIN TRANSACTION
SELECT ... WHERE ...
SELECT ... WHERE ...
...
SELECT ... WHERE ...
ROLLBACK
И к тому времени, когда я достигаю окончательный пробег:
BEGIN TRANSACTION
SELECT ... WHERE ...
SELECT ... WHERE ...
...
SELECT ... WHERE ...
DELETE FROM ... WHERE ...
COMMIT
Весь пакет быстро работает, поскольку буферы предварительно заполнены.
Есть ли режим SQL Server (т.е. SET NOEXEC ON
) Это приведет к тому, что SQL Server не выполняет какие-либо фактические модификации данных, не принимайте какие-либо замки, но заполните буферы необходимыми данными? например
SET NOEXEC ON
EXECUTE ThatThingYouDo
SET NOEXEC OFF
EXECUTE ThatThingYouDo
или
SET DRYRUN ON
EXECUTE ThatThingYouDo
SET DRYRUN OFF
EXECUTE ThatThingYouDo
Решение
Нет.
Допустим, у вас есть вставка, а затем обновление на вставленных строках. Вы никогда не сможете подражать обновлению, потому что вставленные строки не существуют. Теперь, в этом случае, почему вы выбираете в транзакции? По умолчанию (т. Е. Если вы не используете HOLTLOLLOLLOLLOL или Anty), вы не блокируете строки в течение длительности транзакции.
Если вы считаете, что буферный пул (AKA Cache Cache Data) является «полным», то вам нужно больше оперативной памяти или некоторого другого обновления / масштабирования.
Другие советы
Я обнаружил, что всякий раз, когда вы пытаетесь сделать что-то чрезвычайно из нормы, чтобы решить проблему, что вы базовый дизайн, скорее всего, проблема. Это чрезвычайно вне нормального.
Возможно, вы можете предоставить больше информации о удалении (размер таблицы, активность, индекс, строки для удаления, другие процессы, работающие и т. Д.), которые принимают так долго, и будет обычное решение, используя индекс или блокировку и т. Д. Отказ