SELECT TOP is slow, regardless of ORDER BY

前端 未结 1 1354
遥遥无期
遥遥无期 2021-01-01 11:51

I have a fairly complex query in SQL Server running against a view, in the form:

SELECT *
   FROM myview, foo, bar 
   WHERE shared=1 AND [joins and other st         


        
相关标签:
1条回答
  • 2021-01-01 12:32

    And so starts the unfortunate game of "trying to outsmart the optimizer (because it doesn't always know best)".

    You can try putting the filtering portions into a subquery or CTE:

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

    Which may be enough to force it to filter first (but the optimizer gets "smarter" with each release, and can sometimes see through such shenanigans). Or you might have to go as far as putting this code into a UDF. If you write the UDF as a multistatement table-valued function, with the filtering inside, and then query that UDF with your TOP x/ORDER BY, you've pretty well forced the querying order (because SQL Server is currently unable to optimize around multistatement UDFs).


    Of course, thinking about it, introducing the UDF is just a way of hiding what we're really doing - create a temp table, use one query to populate it (based on WHERE filters), then another query to find the TOP x from the temp table.

    0 讨论(0)
提交回复
热议问题