Почему первое выполнение запроса занимает вдвое больше времени? - PullRequest
2 голосов
/ 01 апреля 2011

Я выполняю пару запросов с относительно большими наборами результатов (300К строк) и вставляю их в таблицы в цепочке:

Массовая вставка данных в Table0 , затем чтение данных из Table0 и массовая вставка в Table1 , чтение из Table1 вставка Table2 и т. Д. Для чтения данных я использую команду ADO.NET, которая запускает хранимую процедуру exec_sql в фоновом режиме.

Я испытал интересное явление. Когда я воссоздаю базу данных и запускаю весь процесс на нескольких таблицах, это занимает примерно 20 секунд для каждой. Однако при каждом последующем выполнении процесса выполнение запросов занимает всего 10 секунд. Перед вставкой данных таблицы всегда усекаются, поэтому объем данных не увеличивается.

Сначала я подумал, что это как-то связано с кэшированными планами выполнения, поэтому я очистил кэш с помощью DBCC FREEPROCCACHE после 2-го запуска, а 3-й - все еще 10 секунд.

Есть ли какие-либо другие вещи, которые происходят, когда запрос выполняется впервые, и могут ли они быть выяснены быстрее (то есть без фактического выполнения запроса)?

Ответы [ 2 ]

2 голосов
/ 01 апреля 2011

Я бы предположил, что в SQL Server есть кэши для всех видов содержимого, включая таблицы и индексы, поэтому при втором выполнении он, вероятно, содержит много данных, необходимых уже в памяти.

2 голосов
/ 01 апреля 2011

При первом выполнении запроса он анализируется, компилируется и оптимизируется. При следующем выполнении запроса СУБД берет внутреннюю скомпилированную и оптимизированную версию и выполняет ее. Это то, что вызывает разницу во времени исполнения.

Для получения дополнительной информации об этом процессе, пожалуйста, прочитайте эту статью .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...