sql >> Database >  >> RDS >> Sqlserver

SELECT TOP is traag, ongeacht ORDER BY

En zo begint het ongelukkige spel van "proberen de optimizer te slim af te zijn (omdat deze niet altijd het beste weet)".

U kunt proberen de filtergedeelten in een subquery of CTE te plaatsen:

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

Wat misschien voldoende is om het eerst te laten filteren (maar de optimizer wordt "slimmer" bij elke release en kan soms door dergelijke shenanigans heen kijken). Of misschien moet u zo ver gaan dat u deze code in een UDF . Als u de UDF schrijft als een functie met tabelwaarde met meerdere instructies, met de filtering erin, en vervolgens die UDF opvraagt ​​met uw TOP x /ORDER BY , je hebt de queryvolgorde vrij goed geforceerd (omdat SQL Server momenteel niet kan optimaliseren rond UDF's met meerdere instructies).

Natuurlijk, als je erover nadenkt, is het introduceren van de UDF slechts een manier om te verbergen wat we echt doen - maak een tijdelijke tabel, gebruik één query om deze in te vullen (op basis van WHERE-filters), en dan nog een query om de TOP x uit de tijdelijke tabel.




  1. Verbinding maken met 4D vanuit Java

  2. Sneller om veel resultaten willekeurig te verdelen op MySQL Server of in PHP

  3. SQL-query om N rijen van dual te retourneren

  4. Kan een SQL-procedure een tabel retourneren?