Preciso encontrar a chamada primeira entrada no banco de dados para itens relacionados a seus parceiros. Eu escrevi a consulta e está me dando resultados corretos, mas é péssimo com desempenhos.
Eu suspeito que perdi a concepção, portanto, esta consulta pode ser escrita muito melhor. Portanto, peço que me ajude a redesenhar esta consulta para obter um melhor desempenho.
Meu sistema de banco de dados em execução é SQL Server 2008
declare @od_datuma datetime
declare @do_datuma datetime
set @od_datuma='2011-12-01'
set @do_datuma='2011-12-31'
select
doc.PAR_ID
,sdo.art_id
,MIN(doc.id) as doc_id
from
dokumenti
inner join DOC on dokumenti.tip=DOC.TIP
inner join SDO on DOC.ID=SDO.DOC_ID
left outer join (
select par_id,art_id from dokumenti
inner join DOC on dokumenti.tip=DOC.TIP
inner join SDO on DOC.ID=SDO.DOC_ID
where dokumenti.NABAVA =1 and
dokumenti.KOL_UL=1 and
DOC.DATUM<@od_datuma
) as stari_uazi on DOC.PAR_ID=stari_uazi.PAR_ID and SDO.ART_ID=stari_uazi.ART_ID
where
dokumenti.NABAVA =1 and
dokumenti.KOL_UL=1 and
stari_uazi.ART_ID is null and
doc.datum between @od_datuma and @do_datuma
group by doc.PAR_ID,sdo.art_id
A primeira coisa que eu tentaria é adicionar where doc.datum>=@od_datuma e doc.datum <=@do_datuma porque a cláusula have. Talvez dê uma dica para o planejador de consultas. Então a grande questão é: por que a junção externa com a subconsulta? O "onde .. stari_uazi.ART_ID é nulo" significa que você deseja excluir todas as linhas que retornam da subconsulta? Suspeito que a subconsulta seja o verdadeiro assassino porque a pesquisa por DOC não é limitada ( DOC.DATUM <@od_datuma ), portanto, pode buscar um grande número de linhas, que não têm propósito real, pois a consulta pai exclui essas linhas de qualquer maneira.
Meu palpite é que se você suprimir a subconsulta ( junção externa esquerda .. ) terá algo muito próximo do que deseja, muito mais rápido. Se você precisar suprimir algumas linhas do conjunto de resultados, poderá colocá-las em uma tabela temporária e excluí-las posteriormente, isso pode ser mais rápido do que a subconsulta de junção externa.
Atualização: então se você quiser manter apenas as linhas entre @od / @do _datum, remova a junção esquerda e adicione a condição
where DOC.DATUM between @od_ and @do_
Você terá o mesmo resultado e será muito mais rápido.