sql >> Database >  >> RDS >> Sqlserver

De volgorde van een SQL Select-instructie zonder Order By-clausule

Nee, op dat gedrag kan niet worden vertrouwd. De volgorde wordt bepaald door de manier waarop de queryplanner heeft besloten de resultatenset op te bouwen. eenvoudige zoekopdrachten zoals select * from foo_table worden waarschijnlijk geretourneerd in de volgorde waarin ze op schijf zijn opgeslagen, wat in de volgorde van de primaire sleutel kan zijn of de volgorde waarin ze zijn gemaakt, of een andere willekeurige volgorde. complexere zoekopdrachten, zoals select * from foo where bar < 10 kan in plaats daarvan worden geretourneerd in de volgorde van een andere kolom, op basis van een index die is gelezen, of door de tabelvolgorde voor een tabelscan. nog uitgebreidere zoekopdrachten, met meerdere where voorwaarden, group by clausules, union s, staan ​​in de volgorde die de planner het meest efficiënt acht om te genereren.

De volgorde kan zelfs veranderen tussen twee identieke zoekopdrachten, alleen vanwege gegevens die tussen die zoekopdrachten zijn gewijzigd. een "where"-clausule kan worden voldaan met een indexscan in één zoekopdracht, maar latere invoegingen kunnen die voorwaarde minder selectief maken, en de planner zou kunnen besluiten om een ​​volgende zoekopdracht uit te voeren met behulp van een tabelscan.

Om er een punt achter te zetten. RDBMS-systemen hebben het mandaat om u exact waar u om heeft gevraagd, zo efficiënt mogelijk. Die efficiëntie kan vele vormen aannemen, waaronder het minimaliseren van IO (zowel naar schijf als via het netwerk om gegevens naar u te verzenden), het minimaliseren van de CPU en het klein houden van de grootte van de werkset (met behulp van methoden die minimale tijdelijke opslag vereisen).

zonder een ORDER BY clausule, hebt u niet precies gevraagd voor een bepaalde volgorde, en dus geeft het RDBMS je die rijen in een volgorde die (misschien) overeenkomt met een toevallig aspect van de zoekopdracht, op basis van het algoritme dat het RDBMS verwacht de gegevens het snelst te produceren.

Als je om efficiëntie geeft, maar niet om bestellen, sla dan de ORDER BY over clausule. Als je de bestelling belangrijk vindt, maar niet de efficiëntie, gebruik dan de ORDER BY clausule.

Omdat je echt om BEIDE geeft gebruik ORDER BY en stem vervolgens uw zoekopdracht en database zorgvuldig af zodat deze efficiënt is.



  1. NU() instellen als standaardwaarde voor datatype datetime?

  2. Hoe u alle tabellen met of zonder primaire sleutelbeperking in Sql Server-database kunt krijgen - SQL Server / TSQL-zelfstudie 59

  3. Query Performance Insight:ontdekken wat resources van uw Azure SQL-database verbruikt?

  4. Hoe kan ik de uitvoer van de draaitabel in MySQL retourneren?