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

Calcolo di SQL Server ROW_NUMBER() OVER() per una tabella derivata

Il Row_Number() OVER (ORDER BY (SELECT 1)) il trucco dovrebbe NON essere visto come un modo per evitare di modificare l'ordine dei dati sottostanti. È solo un mezzo per evitare che il server esegua un ordinamento aggiuntivo e non necessario (potrebbe comunque eseguire l'ordinamento ma costerà l'importo minimo possibile rispetto all'ordinamento per colonna).

Tutte le query nel server SQL ASSOLUTAMENTE DEVONO avere un ORDER BY clausola nella query più esterna per ordinare i risultati in modo affidabile e garantito.

Il concetto di "mantenere l'ordine originale" non esiste nei database relazionali. Le tabelle e le query devono sempre essere considerate non ordinate fino a quando ea meno che non venga visualizzato un ORDER BY La clausola è specificata nella query più esterna.

Potresti provare la stessa query non ordinata 100.000 volte e riceverla sempre con lo stesso ordine, e quindi arrivare a credere di poter fare affidamento su tale ordine. Ma sarebbe un errore, perché un giorno qualcosa cambierà e non avrà l'ordine che ti aspetti. Un esempio è l'aggiornamento di un database a una nuova versione di SQL Server, che ha causato la modifica dell'ordine di molte query. Ma non deve essere un cambiamento così grande. Qualcosa come l'aggiunta o la rimozione di un indice può causare differenze. E altro ancora:installazione di un service pack. Partizionamento di una tabella. Creazione di una vista indicizzata che includa la tabella in questione. Raggiungere un punto critico in cui viene scelta una scansione anziché una ricerca. E così via.

Non fare affidamento sui risultati da ordinare a meno che tu non abbia detto "Server, ORDER BY ".