Режим SQL Server "Пробный запуск"? Загрузка буферов данных без удержания блокировок или изменения данных

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

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

я заметил, что если я бегу selectПо частям, каждый раз запуская все больше и больше окончательного SQL, позволяя SQL Server заполнять буферы все большим количеством необходимых данных. например:

Первый запуск:

 BEGIN TRANSACTION
 SELECT ... WHERE ...
 ROLLBACK

Второй прогон:

 BEGIN TRANSACTION
 SELECT ... WHERE ...
 SELECT ... WHERE ...
 ROLLBACK

...

n-й прогон:

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

2 ответа

Решение

Нет.
Допустим, у вас есть INSERT, а затем UPDATE на вставленные строки. Вы никогда не сможете эмулировать ОБНОВЛЕНИЕ, потому что вставленные строки не существуют. Теперь, в этом случае, почему вы выбираете в транзакции? По умолчанию (т. Е. Если вы не используете HOLDLOCK или аналогичный), вы не блокируете строки на время транзакции.

Если вы думаете, что буферный пул (он же кеш данных) "заполнен", то вам нужно больше оперативной памяти или какое-либо другое обновление / увеличение.

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

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

Другие вопросы по тегам