Время анализа против времени компиляции
Пересказ статьи Forrest. Parse Time vs Compilation Time
В последнее время я возился с долгими компиляциями, и в голову закрался однин вопрос, основанный на SET STATISTICS TIME ON…
Есть ли разница между временем анализа (parse time) и временем компиляции (compile time)? Для меня наступило времени науки, иначе говоря, победить SQL Server и узнать его секреты.
Сначала давайте построим процедуру, которая содержит очень простой запрос, но гигабайт пробелов. Упс...
Прекрасно, только полгига пробелов:
Этого достаточно для доказательства, что время анализа <> времени компиляции, поскольку числа разнятся. STATISTICS TIME охватывает полную продолжительность.
В то время как план выполнения показывает меньшее время компиляции. (Кроме того, расширенные события (Extended Events) показывают время компиляции, совпадающее со временем в плане выполнения.)
sys.query_store_query содержит относящиеся к этому столбцы, не только с числом компиляции плана выполнения, но и не содержащие полного времени.
В итоге, анализ отличается от компиляции, и затраты ЦП не показываются нигде за исключением STATISTICS TIME. Более трудно было бы обнаружить ситуацию, когда сервер, тратит все свои вычислительные ресурсы на синтаксический анализ, хотя я думаю, что это редкость. Я не могу сказать, что этого никогда не происходит, потому что видел кое-что в производстве.
Сначала давайте построим процедуру, которая содержит очень простой запрос, но гигабайт пробелов. Упс...
Прекрасно, только полгига пробелов:
DECLARE @w VARCHAR(MAX) = ' ' --8 пробелов
SET @w += @w --2^4
SET @w += @w --2^5
SET @w += @w --2^6
SET @w += @w --2^7
SET @w += @w --2^8
SET @w += @w --2^9
SET @w += @w --2^10 = 1024, 1KB
SET @w += @w --2^11
SET @w += @w --2^12
SET @w += @w --2^13
SET @w += @w --2^14
SET @w += @w --2^15
SET @w += @w --2^16
SET @w += @w --2^17
SET @w += @w --2^18
SET @w += @w --2^19
SET @w += @w --2^20 = 1MB
SET @w += @w --2^21
SET @w += @w --2^22
SET @w += @w --2^23
SET @w += @w --2^24
SET @w += @w --2^25
SET @w += @w --2^26
SET @w += @w --2^27
SET @w += @w --2^28
SET @w += @w --2^29 = 512MB
--SET @w += @w --2^30 = 1GB
DECLARE @sql VARCHAR(MAX) = '
CREATE OR ALTER PROC Parsimonious
AS
SELECT TOP(1)'+@w+' *
FROM dbo.Comments
OPTION(RECOMPILE)
'
EXEC(@sql)
Этого достаточно для доказательства, что время анализа <> времени компиляции, поскольку числа разнятся. STATISTICS TIME охватывает полную продолжительность.
В то время как план выполнения показывает меньшее время компиляции. (Кроме того, расширенные события (Extended Events) показывают время компиляции, совпадающее со временем в плане выполнения.)
sys.query_store_query содержит относящиеся к этому столбцы, не только с числом компиляции плана выполнения, но и не содержащие полного времени.
В итоге, анализ отличается от компиляции, и затраты ЦП не показываются нигде за исключением STATISTICS TIME. Более трудно было бы обнаружить ситуацию, когда сервер, тратит все свои вычислительные ресурсы на синтаксический анализ, хотя я думаю, что это редкость. Я не могу сказать, что этого никогда не происходит, потому что видел кое-что в производстве.
Обратные ссылки
Автор не разрешил комментировать эту запись
Комментарии
Показывать комментарии Как список | Древовидной структурой