Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Perché una query con parametri produce un piano di query molto più lento rispetto a una query non parametrizzata

Sembra che il pianificatore di query abbia preso una decisione nella query letterale che si basa su informazioni che già possiede. Avrebbe statistiche che può interrogare in modo efficiente in base alla diffusione dei dati forniti nel tuo letterale specifico.

La query parametrizzata ha scelto la query che ritiene sia la più giusta per tutti i dati nella tabella, che noterai sono molti loop nidificati (prestazioni =pessime).

Forse potresti provare a eseguire gli strumenti di ottimizzazione del database sul tuo database per vedere se alcuni indici potrebbero aiutarti qui?

In particolare nella tua query, prova questo:

declare @p0 int
set @p0 = 1000
select *
from foo
join bar on bar.x = foo.x
join baz on baz.y = foo.y
where foo.x = @p0
OPTION ( OPTIMIZE FOR (@p0 = 1000))

Ma sarei cauto nel farlo senza essere certo che i dati contenuti in questa query non cambieranno e che la tua query su questo piano sarà SEMPRE più efficiente.