Режим SQL Server «Сухой пробег»? Загрузить буферы данных, без удерживания замков или изменяющихся данных

StackOverflow https://stackoverflow.com/questions/2374457

Вопрос

Я собираюсь запустить некоторые запросы против базы данных SQL Server, а затем удалить. В идеале все это происходит внутри транзакции (то есть атомная).

Но практически, потому что данные давно убраны из буферов, SQL Server должен будет выполнить много физического IO для завершения транзакции T-SQL. Это может быть проблемой, потому что, если для запуска всей патенты занимает более 30 секунд, то пользователи будут испытывать проблемы ожидания времени.

Я заметил, что если я бегу selectS На куски, каждый раз, когда бегут все больше и больше окончательного 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) является «полным», то вам нужно больше оперативной памяти или некоторого другого обновления / масштабирования.

Другие советы

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

Возможно, вы можете предоставить больше информации о удалении (размер таблицы, активность, индекс, строки для удаления, другие процессы, работающие и т. Д.), которые принимают так долго, и будет обычное решение, используя индекс или блокировку и т. Д. Отказ

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top