Eu tenho uma instrução select no SQL Server que deve comparar um grande conjunto de linhas com uma única data calculada.
O cálculo em si é insignificante; apenas olhando para a segunda-feira anterior. Dado que a coluna com a qual esta data calculada será comparada está indexada, há alguma diferença se eu passar a data calculada do código do aplicativo como um parâmetro ou usar uma função escalar para calcular a data?
Dito de outra forma: devo favorecer o uso de um parâmetro ou chamar uma função escalar, ou eles são basicamente iguais neste cenário?
Parece uma situação em que você pode ser vítima - ou se beneficiar - da detecção de parâmetros. Resumindo, o SQL Server usará valores de parâmetro/variável ao compilar um plano de execução para determinar o uso ideal do índice (com base nas estatísticas da coluna). Dependendo do valor passado, você pode obter planos de execução muito diferentes e um desempenho muito ruim se o valor "errado" for usado posteriormente. ( Um bom artigo sobre isso. ).
Eu calcularia pessoalmente a data dentro do procedimento usando uma função escalar, a menos que seja necessário que o que quer que esteja chamando esse procedimento especifique a data em si. Então você sempre pode usar a função escalar no procedimento para recorrer a um valor padrão. Contanto que o sniffing de parâmetros não esteja dando a você mudanças surpreendentes de desempenho, é apenas uma questão de design do aplicativo.