Лучший способ сравнить INSERT - все включено? - PullRequest
1 голос
/ 18 июля 2011

Если я хотел бы сравнить, как различные определения таблиц влияют на скорость вставки строк в SQL Server, я полагаю, что недостаточно просто провести транзакцию времени от BEGIN до COMMIT: это только измеряет время, затрачиваемое на добавление INSERT в (последовательный) журнал,Правильно?

Но настоящий удар ввода / вывода происходит, когда INSERT фактически применяются к реальной таблице (кластеризованный индекс, который может быть немного реорганизован после INSERT).Как я могу измерить общее использованное время, все включено?То есть время для всех INSERT (записывается в журнал) + время, используемое для обновления «реальных» структур данных?Достаточно ли выполнить «ПРОВЕРКУ» перед остановкой таймера?

Ответы [ 2 ]

1 голос
/ 08 августа 2011

Из-за отсутствия ответа я отвечу сам.

Насколько я могу видеть в различной документации, я достигну all related disk activity, вызванного запросом путем выдачи CHECKPOINT. Это принудительно запишет все грязные страницы на диск.

Если ничего, кроме измеряемого запроса, не выполняется, единственными грязными страницами будут те, к которым прикоснулся запрос. Проведенные эксперименты, похоже, подтверждают эту «теорию».

0 голосов
/ 04 августа 2011

SET STATISTICS TIME ON даст вам время работы и ЦП в MS для каждого оператора, который вы выполняете после его установки

edit: Используя запрос ниже, вы можете точно определить, сколько страниц загрязнено в пуле буферов навремя выполнения, а также их размер в МБ и настроенная максимальная / минимальная память на сервере и итоги.

SELECT
ISNULL((CASE WHEN ([database_id] = 32767) THEN 'Resource Database' ELSE DB_NAME (database_id) END),'Total Pages') AS [Database Name],
SUM(CASE WHEN ([is_modified] = 1) THEN 1 ELSE 0 END)  AS [Dirty Page Count],
SUM(CASE WHEN ([is_modified] = 1) THEN 0 ELSE 1 END)  AS [Clean Page Count],
COUNT(*) * 8.0 / 1024.0 [Size in MB], a.value_in_use [Min Server Memory], 
b.value_in_use [Max Server Memory]
FROM sys.dm_os_buffer_descriptors
INNER JOIN sys.configurations a on a.configuration_id = 1543
INNER JOIN sys.configurations b on b.configuration_id = 1544
GROUP BY [database_id],a.value_in_use,b.value_in_use WITH CUBE
HAVING A.value_in_use IS NOT NULL AND B.value_in_use IS NOT NULL
ORDER BY 1;
...