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

L'ordine di un'istruzione SQL Select senza la clausola Order By

No, non si può fare affidamento su quel comportamento. L'ordine è determinato dal modo in cui il pianificatore di query ha deciso di creare il set di risultati. query semplici come select * from foo_table è probabile che vengano restituiti nell'ordine in cui sono archiviati sul disco, che può essere nell'ordine della chiave primaria o nell'ordine in cui sono stati creati o in qualche altro ordine casuale. query più complesse, come select * from foo where bar < 10 può invece essere restituito in ordine di una colonna diversa, in base a un indice letto, o in base all'ordine della tabella, per una scansione della tabella. query ancora più elaborate, con where multiplo condizioni, group by clausole, union s, sarà nell'ordine che il pianificatore decide è più efficiente da generare.

L'ordine potrebbe anche cambiare tra due query identiche solo a causa dei dati che sono cambiati tra quelle query. una clausola "where" può essere soddisfatta con una scansione dell'indice in una query, ma inserimenti successivi potrebbero rendere quella condizione meno selettiva e il pianificatore potrebbe decidere di eseguire una query successiva utilizzando una scansione della tabella.

Per mettere un punto su di esso. I sistemi RDBMS hanno il mandato di fornirti esattamente quello che hai chiesto, nel modo più efficiente possibile. Tale efficienza può assumere molte forme, inclusa la riduzione al minimo dell'IO (sia su disco che sulla rete per l'invio di dati all'utente), la riduzione al minimo della CPU e il mantenimento delle dimensioni ridotte del suo set di lavoro (utilizzando metodi che richiedono uno spazio di archiviazione temporaneo minimo).

senza un ORDER BY clausola, non avrai chiesto esattamente per un ordine particolare, quindi l'RDBMS ti darà quelle righe in un ordine che (forse) corrisponde a qualche aspetto casuale della query, in base all'algoritmo che l'RDBMS prevede di produrre i dati più velocemente.

Se ti interessa l'efficienza, ma non l'ordine, salta il ORDER BY clausola. Se ti interessa l'ordine ma non l'efficienza, usa il ORDER BY clausola.

Dal momento che tieni davvero a ENTRAMBI usa ORDER BY e quindi ottimizza con attenzione la query e il database in modo che siano efficienti.