sql >> Databasteknik >  >> RDS >> Sqlserver

SELECT TOP går långsamt, oavsett ORDER BY

Och så börjar det olyckliga spelet att "försöka överlista optimeraren (eftersom den inte alltid vet bäst)".

Du kan prova att lägga filterdelarna i en underfråga eller CTE:

SELECT TOP 30 *
FROM
   (SELECT *
   FROM myview, foo, bar 
   WHERE shared=1 AND [joins and other stuff]) t
ORDER BY sortcode;

Vilket kan räcka för att tvinga den att filtrera först (men optimeraren blir "smartare" för varje release, och kan ibland se igenom sådana här sken). Eller så kanske du måste gå så långt som att lägga in den här koden i en UDF . Om du skriver UDF som en tabellvärderad funktion med flera påståenden, med filtreringen inuti, och sedan frågar den UDF med din TOP x /BESTÄLL EFTER , du har ganska väl tvingat fram frågeordningen (eftersom SQL Server för närvarande inte kan optimera kring UDF:er med flera påståenden).

Naturligtvis, när man tänker på det, är att introducera UDF bara ett sätt att dölja vad vi verkligen gör - skapa en tillfällig tabell, använd en fråga för att fylla i den (baserat på WHERE-filter), sedan en annan fråga för att hitta TOP x från temptabellen.




  1. FATAL:kunde inte komma åt den privata nyckelfilen /etc/ssl/private/ssl-cert-snakeoil.key:Tillstånd nekad

  2. sql-fråga för att avgöra vilka varor som är mest lika med taggar

  3. Sortera ett textaggregat skapat med array_agg i postgresql

  4. Hur man startar SQL Server-agentjobb automatiskt