variable - usare variabili in una query sql oracle




Perché SQL Server rallenta quando si usano le variabili? (5)

È perché quando i valori sono hard codificati, può cercare le statistiche che ha sui dati nella tabella e capire la migliore query da eseguire. Dai un'occhiata ai piani di esecuzione di ognuna di queste domande. Deve essere la scansione quando si utilizzano variabili.

se l'intervallo è sempre piccolo, potresti essere in grado di utilizzare un suggerimento indice per aiutarti.

Ho una query sql che esegue super veloce, circa un secondo, quando non si usano variabili, come:

WHERE id BETWEEN 5461094 and 5461097

Ma quando ho:

declare @firstId int
declare @lastId int

set @firstId = 5461094
set @lastId = 5461097

...
    WHERE id BETWEEN @firstId and @lastId

... la query viene eseguita molto lentamente, terminando solo dopo alcuni minuti. Perché succede? Ho bisogno di usare variabili. Posso fare qualche miglioramento per evitare questi problemi di prestazioni?


L'ID è in un indice (ad es. Chiave primaria)? In caso contrario, prova ad aggiungerne uno.

Un'altra cosa potrebbe essere che nella prima istanza (veloce) la query viene eseguita in modo leggermente diverso. La cosa più comune che ho visto succedere è che i join vengono eseguiti in un ordine inefficiente. Prova a riordinare i join o convertirne alcuni in subquery. Se pubblichi più della tua richiesta, possiamo aiutarti ulteriormente.



Sembra che questa query sia relativa a una stored procedure, il suo piano di esecuzione verrà compilato per la prima volta in cui viene eseguito il proc e quindi riutilizzato per le esecuzioni successive.

È possibile che il piano compilato sia davvero negativo per le situazioni in cui FirstID è davvero vicino a lastid, tuttavia è davvero buono quando i valori sono distanti.

Prova a abilitare l'opzione WITH RECOMPILE sul tuo proc memorizzato. Se risolve il problema e sei contento che il proc venga ricompilato ogni volta che viene eseguito (otterrai un hit delle prestazioni) lascialo lì. Se sei ancora insoddisfatto delle prestazioni, considera la possibilità di riprogettare il proc in modo che non richieda la ricompilazione.


È divertente che anche questo codice sia veloce:

DECLARE @sql VARCHAR(8000)

SET @sql = 'SELECT * FROM table_x WHERE id BETWEEN ' + CAST(@firstId AS VARCHAR) + ' AND ' + CAST(@lastId AS VARCHAR)

EXEC (@sql)

(MSSQL 2000)





stored-procedures