sql >> Databasteknik >  >> RDS >> Sqlserver

Ordningen för en SQL Select-sats utan Order By-sats

Nej, det beteendet kan man inte lita på. Ordningen bestäms av hur frågeplaneraren har beslutat att bygga upp resultatuppsättningen. enkla frågor som select * from foo_table kommer sannolikt att returneras i den ordning de är lagrade på disken, vilket kan vara i primärnyckelordning eller den ordning de skapades, eller någon annan slumpmässig ordning. mer komplexa frågor, som select * from foo where bar < 10 kan istället returneras i ordning efter en annan kolumn, baserat på ett indexavläst, eller enligt tabellordningen, för en tabellskanning. ännu mer utarbetade frågor, med flera where villkor, group by klausuler, union s, kommer att vara i den ordning som planeraren bestämmer är mest effektiv att generera.

Ordningen kan till och med ändras mellan två identiska frågor bara på grund av data som har ändrats mellan dessa frågor. en "where"-sats kan vara nöjd med en indexsökning i en fråga, men senare infogningar kan göra det villkoret mindre selektivt, och planeraren kan besluta att utföra en efterföljande fråga med en tabellsökning.

För att sätta en finare poäng på det. RDBMS-system har mandat att ge dig exakt det du bad om, så effektivt som möjligt. Den effektiviteten kan ta många former, inklusive minimering av IO (både till disk såväl som över nätverket för att skicka data till dig), minimera CPU och hålla storleken på dess arbetsuppsättning liten (med metoder som kräver minimalt med tillfällig lagring).

utan en ORDER BY klausul har du inte frågat exakt för en viss ordning, och så kommer RDBMS att ge dig de raderna i någon ordning som (kanske) överensstämmer med någon slumpmässig aspekt av frågan, baserat på vilken algoritm som RDBMS förväntar sig att producera data snabbast.

Om du bryr dig om effektivitet, men inte beställer, hoppa över ORDER BY klausul. Om du bryr dig om beställningen men inte effektiviteten, använd ORDER BY klausul.

Eftersom du faktiskt bryr dig om BÅDA använd ORDER BY och justera sedan noggrant din fråga och databas så att den är effektiv.



  1. viloläge dialekt för oracle 12c

  2. MariaDB Server 10.0.33 nu tillgänglig

  3. Hur BIN() fungerar i MariaDB

  4. Tabellvärderad funktion med flera påståenden vs inline-värderad tabellfunktion