Existe uma função que:
- retorna apenas 1 linha
- tem apenas 1 parâmetro
- tem várias junções em tabelas diferentes, cada uma apenas para retornar um único valor escalar
- é chamado apenas uma vez em cada login de uma aplicação web
Atualmente, é escrito em c# linq-to-sql e leva de 150 a 300 ms para ser executado.
Depois de reescrevê-lo em SQL usando uma SELECT
instrução muito simples, leva 30ms para ser executado.
Agora eu quero encapsular este select em uma função de banco de dados, qual é a melhor maneira (execução mais rápida) de fazer isso?
- Faça uma visualização e a cada chamada faça algo como
select * from viewXX where id=123
- Faça um procedimento armazenado
- Faça uma função com valor de tabela
Existem alguns truques que eu poderia aproveitar em tal caso?
Aqui está um exemplo de como a consulta se parece
declare @id int=162;
select top 1 i.id, i.name, itd.description,
(select top 1 case when count(*)>0 then '1' else '0' end from category where category_desc=itd.description) "HasCategory",
(select top 1 number from wheels where wheel_item_id=i.id) "WheelCount"
from items i left items_desc itd on i.id=itd.itemid where i.id=@id
Se os dados forem alterados com pouca frequência, empacote o SELECT de execução rápida como uma exibição e defina um índice nele.
Uma visão indexada vem com algumas restrições que limitam minimamente a flexibilidade em mudanças futuras. Não há nada terrivelmente ruim, no entanto.
Se os dados forem alterados com muita frequência e as atualizações forem críticas para o desempenho, o tempo extra para manter a exibição pode ser uma preocupação, mas não mais do que para qualquer outro índice.