Обнаружил такое
интересное вредное поведение в такой древней операции как Restore Database
Если сразу после restore сделать
Select count(1) From [Any Table] Where 1=2
то профайлер показывает ровно то количество чтений страниц у этого select сверху, сколько весит таблица. Вместо нуля.
Получается при любом select в том числе такой как выше, sql server вычитывает всю таблицу целиком
При этом для backup сделаны все условия что бы такого не происходило. Бекап полный и ровно один. При бекапе любые транзакции отсутствуют гарантированно в том числе на чтение. Плюс у базы при бекапе включена Simple Recovery Mode еще при создании.
Другими словами в бекапе всё максимально целостное.
Как это можно настроить?
Есть ли что то типа dbcc что бы это убрать?
Ну и самое главное. Если будет запрос который некий index seek будет использовать то этот очередной запрос тоже весь индекс вычитает полностью при первом вызове после restore?
Прошу прощения, слона то я и не приметил. Как-то упустил из вида условие `where 1=2`.
Тогда, действительно, поведение странное.
Потому что, должен срабатывать contradiction detection и query plan должен схлопнуться до SELECT <= Constant Scan.
А какая версия MSSQL?
И что будет, если вот так попробовать:
select count(1) From [Any Table] Where 1=2 OPTION(RECOMPILE)