Eu tinha uma consulta muito grande que rodava mais devagar do que eu pensava, mas nenhuma pesquisa no plano de execução da consulta ajudou a esclarecer a lentidão. Eventualmente, eu reduzi: try_parse
era o culpado!
consulta normal:
SELECT CloseDate
FROM MyTable
(4959 row(s) affected)
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 17 ms.
Com try_parse:
SELECT try_parse(CloseDate as datetime using 'en-us')
FROM MyTable
(4959 row(s) affected)
SQL Server Execution Times:
CPU time = 719 ms, elapsed time = 718 ms.
O plano de execução no último caso parece bastante inocente:
Existe uma maneira de identificar o culpado mais facilmente no futuro? A fonte real de lentidão está completamente oculta.
Mostra que isso é limitado pela CPU.
Se você puder reproduzir o problema em uma máquina de desenvolvimento, uma maneira de ver em que a CPU está gastando tempo é usar o Windows Performance Recorder.
Depois de rastrear por alguns segundos enquanto o seguinte estava sendo executado simultaneamente ...
... Entendo (clique para embiggen)
Ao SQL Server são atribuídos 20,88% do tempo total de CPU durante esse período. Mais de 75% desse montante é tomado com
Com um pedaço saudável disso ocupado com
Nenhum dos nomes
master..spt_values
foi analisado como datas válidas, então todos acabam retornando nulo.O exposto acima mostra que, por algum motivo
TRY_PARSE
, chama oDateTime.Parse
método e captura a exceção, em vez de usar oTryParse
método interno que provavelmente teria um desempenho melhor nesse caso.Nunca é tão simples. Você realmente tem que tentar várias maneiras de executar a consulta e verificar as diferenças. Não apenas verificando os tempos de execução, mas passando o mouse sobre cada etapa do plano de execução e verificando os custos.