Cláusula WHERE-CASE Subquery Performance
A pergunta pode ser específica para o servidor SQL. Quando escrevo uma consulta como:
SELECT * FROM IndustryData WHERE Date='20131231'
AND ReportTypeID = CASE WHEN (fnQuarterDate('20131231')='20131231') THEN 1
WHEN (fnQuarterDate('20131231')!='20131231') THEN 4
END;
A função chama fnQuarterDate (ou qualquer subconsulta) dentro de Case dentro de uma cláusula Where é executada para CADA linha da tabela?
Como seria melhor obter o valor da função (ou qualquer subconsulta) de antemão dentro de uma variável como:
DECLARE @X INT
IF fnQuarterDate('20131231')='20131231'
SET @X=1
ELSE
SET @X=0
SELECT * FROM IndustryData WHERE Date='20131231'
AND ReportTypeID = CASE WHEN (@X = 1) THEN 1
WHEN (@X = 0) THEN 4
END;
Eu sei que no MySQL, se houver uma subconsulta dentro de IN (..) dentro de uma cláusula WHERE, ela é executada para cada linha, eu só queria descobrir o mesmo para o SQL SERVER.
...
Basta preencher a tabela com cerca de 30 mil linhas e descobrir a diferença de horário:
Consulta1 = 70ms; Consulta 2 = 6 ms. Eu acho que isso explica, mas ainda não sabemos os fatos reais por trás disso.
Também haveria alguma diferença se, em vez de uma UDF, houvesse uma subconsulta simples?