sql >> Databasteknik >  >> RDS >> Mysql

Hämta TOP 10 rader utan att använda TOP eller LIMIT? – Veckans intervjufråga #247

Fråga: Hämta TOP 10 rader utan att använda TOP eller LIMIT?

Svar: När jag fick den här frågan i min senaste omfattande hälsokontroll av databasprestanda , frågade jag tillbaka till personen varför han vill uppfinna hjulet igen. Men när jag fick hans svar håller jag faktiskt nu verkligen med om resonemanget.

Här är anledningen:  Vi vill inte använda TOP eller LIMIT eftersom de faktiskt inte är en ANSI-implementering. Vi vill hämta de översta raderna på ett sådant sätt att det kan fungera över olika databaser som SQL Server, MySQL, MariaDB samt PostgreSQL.

Alla databaser har implementerat sin egen logik för att hämta de översta raderna. SQL Server använder TOPP nyckelord medan MySQL, MariaDB och PostgreSQL använder LIMIT nyckelord för att begränsa raderna i SQL Server. Detta innebär unika utmaningar för tredjepartsleverantörer som skriver kod som kan kopplas in i alla RDBMS. De måste skriva kodhäxningsvillkor och underhålla två olika versioner av logiken. Men om du använder följande metod kommer den att fungera i alla de senaste versionerna av relationsdatabaserna.

VÄLJ ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_DEFINITIONFROM (VÄLJ ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_DEFINITION,ROW_NUMBER() ÖVER (ORDER EFTER ROUTINE_NAME) SOM ROWNUMFROM INFORMATION_SCHEMA.ROUTINESWHERE ROUTINE_DURE ROUTINESHERE ROUTINE_DURE=')NUM>PROTWINEHER TYPE ROUTINE')') 

Detta kommer att fungera med alla kända relationsdatabaser jag har stött på. Även om vi älskar att använda TOP och LIMIT ofta rekommenderas det att vi fortsätter att använda logiken som fungerar över flera relationsdatabaser.

Här är andra blogginlägg som du kan tycka är intressanta:

  • SQL SERVER – Stänga av Priority Boost Server Configuration Option på SSMS 18 och framåt
  • SQL-SERVER – Exempelskript för att kontrollera indexfragmentering med RowCount
  •  SQL-pussel – Schema och tabellskapande – Svara utan att köra kod
  • Hur vet man om index tvingas fram vid fråga? – Veckans intervjufråga #246

  1. Beräknar skillnaden mellan två tidsstämplar i Oracle i millisekunder

  2. Återställ sekvensvärdet till 1

  3. Dela en kolumn i flera rader

  4. hur man återställer standby-databas från en saknad arkivlogg