eu tenho uma mesa
CREATE TABLE [dbo].[Numbers]
(
[Date] [date] NULL,
[Time] [time](3) NULL,
[Value] [char](10) NULL
)
e a tabela tem > 10 bilhões de linhas, portanto é particionada por mês e tem um índice clusterizado em[Date], [Time] ASC
Agora eu uso uma função com valor de tabela que lê esses dados:
SELECT *
FROM [dbo].[QueryNumbers] ('2012-10-08','2012-10-08','07:00:00.000','08:00:00.000')
Isso me retorna cerca de 6.000 linhas em 1 segundo
No entanto, quando eu faço o mesmo assim:
declare
@StartDate date,
@EndDate date,
@StartTime time(3),
@EndTime time(3),
SET @StartDate = '2012-10-08';
SET @EndDate ='2012-10-08';
SET @StartTime ='07:00:00.000';
SET @EndTime = '08:00:00.000';
SELECT *
FROM [dbo].[QueryNumbers] (@StartDate,@EndDate,@StartTime,@EndTime)
A mesma consulta leva 3 minutos (o que é um desastre), brinquei um pouco com os parâmetros e parece que o parâmetro time aciona o comportamento diferente. Alguém tem uma dica para mim o que está acontecendo de errado aqui?
Sua primeira consulta tem constantes para os parâmetros, portanto, quando o sql compila o plano, ele sabe exatamente quais serão os parâmetros e pode usar esse conhecimento para escolher um plano ideal.
Na segunda consulta, os valores são parametrizados, portanto o sql criará um plano que funcionará para quaisquer valores potenciais para os parâmetros.
Você pode testar isso executando a consulta parametrizada com a cláusula OPTION (RECOMPILE). Isso permitirá que o sql crie um plano ideal para esses valores específicos.