Spørgsmål: Hent TOP 10 rækker uden at bruge TOP eller LIMIT?
Svar: Da jeg blev stillet dette spørgsmål i mit seneste omfattende sundhedstjek af databaseydelse , spurgte jeg tilbage til personen, hvorfor han vil genopfinde hjulet. Men da jeg modtog hans svar, er jeg faktisk nu virkelig enig i ræsonnementet.
Her er grunden: Vi ønsker ikke at bruge TOP eller LIMIT, da de faktisk ikke er en ANSI-implementering. Vi ønsker at hente de øverste rækker på en sådan måde, at det kan fungere på tværs af forskellige databaser som SQL Server, MySQL, MariaDB samt PostgreSQL.
Alle databaserne har implementeret deres egen logik for at hente de øverste rækker. SQL Server bruger TOP søgeord, hvorimod MySQL, MariaDB og PostgreSQL bruger LIMIT nøgleord for at begrænse rækkerne i SQL Server. Dette giver unikke udfordringer for tredjepartsleverandører, der skriver kode, som kan tilsluttes ethvert RDBMS. De skal skrive kodeheksbetingelser og vedligeholde to forskellige versioner af logikken. Men hvis du bruger følgende metode, vil den virke i alle de seneste versioner af relationsdatabaserne.
VÆLG ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_DEFINITIONFROM (VÆLG ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_DEFINITION,ROW_NUMBER() OVER (ORDNEL EFTER ROUTINE_NAME) SOM ROWNUMFRA INFORMATION_SCHEMA.ROUTINESWHERE ROUTINE_DURE=')NUM>PROTWINEHERE ROUTINE_TYPE')NUM>1Dette vil fungere med alle de kendte relationsdatabaser, jeg er stødt på. Selvom vi ofte elsker at bruge TOP og LIMIT, anbefales det, at vi fortsætter med at bruge logikken, som fungerer på tværs af flere relationelle databaser.
Her er andre blogindlæg, som du kan finde interessante:
- SQL SERVER – Deaktivering af Priority Boost Server Configuration Option på SSMS 18 og fremefter
- SQL-SERVER – Eksempel på script til at kontrollere indeksfragmentering med RowCount
- SQL-puslespil – Skema og tabeloprettelse – Svar uden at køre kode
- Hvordan ved man, om indeks er tvunget på forespørgsel? – Ugens interviewspørgsmål #246