Why use Select Top 100 Percent?

后端 未结 10 2209
花落未央
花落未央 2020-11-27 15:41

I understand that prior to SQL Server 2005, you could \"trick\" SQL Server to allow use of an order by in a view definition, by also include TOP 100 PERCENT

相关标签:
10条回答
  • 2020-11-27 16:08

    ...allow use of an ORDER BY in a view definition.

    That's not a good idea. A view should never have an ORDER BY defined.

    An ORDER BY has an impact on performance - using it a view means that the ORDER BY will turn up in the explain plan. If you have a query where the view is joined to anything in the immediate query, or referenced in an inline view (CTE/subquery factoring) - the ORDER BY is always run prior to the final ORDER BY (assuming it was defined). There's no benefit to ordering rows that aren't the final result set when the query isn't using TOP (or LIMIT for MySQL/Postgres).

    Consider:

    CREATE VIEW my_view AS
        SELECT i.item_id,
               i.item_description,
               it.item_type_description
          FROM ITEMS i
          JOIN ITEM_TYPES it ON it.item_type_id = i.item_type_id
      ORDER BY i.item_description
    

    ...

      SELECT t.item_id,
             t.item_description,
             t.item_type_description
        FROM my_view t
    ORDER BY t.item_type_description
    

    ...is the equivalent to using:

      SELECT t.item_id,
             t.item_description,
             t.item_type_description
        FROM (SELECT i.item_id,
                     i.item_description,
                     it.item_type_description
                FROM ITEMS i
                JOIN ITEM_TYPES it ON it.item_type_id = i.item_type_id
            ORDER BY i.item_description) t
    ORDER BY t.item_type_description
    

    This is bad because:

    1. The example is ordering the list initially by the item description, and then it's reordered based on the item type description. It's wasted resources in the first sort - running as is does not mean it's running: ORDER BY item_type_description, item_description
    2. It's not obvious what the view is ordered by due to encapsulation. This does not mean you should create multiple views with different sort orders...
    0 讨论(0)
  • 2020-11-27 16:12

    No reason but indifference, I'd guess.

    Such query strings are usually generated by a graphical query tool. The user joins a few tables, adds a filter, a sort order, and tests the results. Since the user may want to save the query as a view, the tool adds a TOP 100 PERCENT. In this case, though, the user copies the SQL into his code, parameterized the WHERE clause, and hides everything in a data access layer. Out of mind, out of sight.

    0 讨论(0)
  • 2020-11-27 16:17

    I have seen other code which I have inherited which uses SELECT TOP 100 PERCENT

    The reason for this is simple: Enterprise Manager used to try to be helpful and format your code to include this for you. There was no point ever trying to remove it as it didn't really hurt anything and the next time you went to change it EM would insert it again.

    0 讨论(0)
  • 2020-11-27 16:18

    If there is no ORDER BY clause, then TOP 100 PERCENT is redundant. (As you mention, this was the 'trick' with views)

    [Hopefully the optimizer will optimize this away.]

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