Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为什么要使用Select Top 100%?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 为什么要使用Select Top 100%?

Sql 为什么要使用Select Top 100%?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我知道在SQL Server 2005之前,您可以“欺骗”SQL Server,允许在视图定义中使用order by,也可以在SELECT子句中包含TOP 100%。但我看到了我继承的其他代码,它们使用selecttop100%。。。在动态SQL语句中(在ASP.NET应用程序等的ADO中使用)。这有什么原因吗?结果是否与不包括前100%的结果相同?如果没有ORDER BY子句,则前100%是多余的。(正如您所提到的,这是视图的“诀窍”) [希望优化器能够优化它。]我猜没有理由,只是漠不关心 此

我知道在SQL Server 2005之前,您可以“欺骗”SQL Server,允许在视图定义中使用order by,也可以在SELECT子句中包含
TOP 100%
。但我看到了我继承的其他代码,它们使用
selecttop100%
。。。在动态SQL语句中(在ASP.NET应用程序等的ADO中使用)。这有什么原因吗?结果是否与不包括
前100%
的结果相同?

如果没有
ORDER BY
子句,则
前100%
是多余的。(正如您所提到的,这是视图的“诀窍”)


[希望优化器能够优化它。]

我猜没有理由,只是漠不关心

此类查询字符串通常由图形查询工具生成。用户加入几个表,添加过滤器、排序顺序,并测试结果。由于用户可能希望将查询另存为视图,因此该工具会添加一个100%的顶部。不过,在本例中,用户将SQL复制到代码中,参数化WHERE子句,并隐藏数据访问层中的所有内容。心不在焉,看不见

我还看到了我继承的其他代码,它们使用SELECT TOP 100%

这样做的原因很简单:EnterpriseManager过去常常试图提供帮助,并格式化代码,以便为您包含这些内容。尝试删除它是没有意义的,因为它不会真正伤害任何东西,下次你去更改它时,EM会再次插入它

…允许在视图定义中使用ORDER BY

那不是个好主意。视图不应定义ORDER BY

ORDER BY对性能有影响-使用它作为视图意味着ORDER BY将出现在解释计划中。如果您有一个查询,其中视图与即时查询中的任何内容关联,或在内联视图中引用(CTE/子查询分解)-ORDER BY始终在最终ORDER BY之前运行(假设已定义)。当查询不使用TOP(或LIMIT for MySQL/Postgres)时,对不是最终结果集的行进行排序没有任何好处

考虑:

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 (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
这是不好的,因为:

  • 该示例首先根据项目描述对列表进行排序,然后根据项目类型描述对列表进行重新排序。它在第一次排序中浪费了资源-按原样运行表示它正在运行:
    按项目的顺序\u类型\u描述,项目\u描述
  • 由于封装,视图的顺序并不明显。这并不意味着您应该创建具有不同排序顺序的多个视图
  • 在最新版本的SQL Server中,TOP(100%)是完全没有意义的,查询处理器会忽略它(以及相应的ORDER BY,在视图定义或派生表的情况下)

    你是对的,很久以前,它可以被用作一个把戏,但即使那样,它也不可靠。可悲的是,微软的一些图形工具将这一毫无意义的条款放在了其中

    至于为什么这会出现在动态SQL中,我不知道。您是正确的,没有理由这样做,没有它的结果是相同的(同样,对于视图定义或派生表,没有TOP和ORDER BY子句)。

    它用于“”

    好文章:

    他甚至养大了孩子,以便能以更干净的方式来做

    我的观点“并非天生就坏”,但除非100%确定,否则不要使用它。问题是,它只在您这样做的时候起作用,可能不会在以后(补丁级别、模式、索引、行计数等)起作用

    工作实例 这可能会失败,因为您不知道评估的顺序

    SELECT foo From MyTable WHERE ISNUMERIC (foo) = 1 AND CAST(foo AS int) > 100
    
    这也可能失败,因为

    SELECT foo
    FROM
        (SELECT foo From MyTable WHERE ISNUMERIC (foo) = 1) bar
    WHERE
        CAST(foo AS int) > 100
    
    但是,在SQLServer2000中没有这样做。内部查询将被计算和假脱机:

    SELECT foo
    FROM
        (SELECT TOP 100 PERCENT foo From MyTable WHERE ISNUMERIC (foo) = 1 ORDER BY foo) bar
    WHERE
        CAST(foo AS int) > 100
    
    注意,这在SQLServer2005中仍然有效

    SELECT TOP 2000000000 ... ORDER BY...
    

    我想您可以在结果中使用一个变量,但除了在视图中按件获取订单外,您不会看到隐式声明“TOP 100%”的好处:


    请尝试下面的,希望它将为您工作

          SELECT TOP
                  ( SELECT COUNT(foo) 
                      From MyTable 
                     WHERE ISNUMERIC (foo) = 1) * 
                      FROM bar WITH(NOLOCK) 
                  ORDER BY foo
                     WHERE CAST(foo AS int) > 100
                   )
    

    试试这个,它本身就可以解释。您无法创建带有订单的视图,除非

    CREATE VIEW v_Test
             AS
               SELECT name
                 FROM sysobjects
             ORDER BY name
            GO
    
    Msg 1033,第15级,状态1,过程测试视图,第5行,订单依据 子句在视图、内联函数、派生表、, 子查询和常用表表达式,除非TOP、OFFSET或FOR 还指定了XML


    错误说明了一切

    Msg 1033,第15级,状态1,过程测试视图,第5行,订单依据 子句在视图、内联函数、派生表、, 子查询和常用表表达式,除非TOP、OFFSET或FOR 还指定了XML

    不要使用
    TOP 100%
    ,使用
    TOP n
    ,其中n是一个数字


    SQL Server视图(2012年后版本)忽略了前100%(原因我不知道),但我认为MS保留它是出于语法原因。TOP n更好,可以在视图中工作,并在最初使用视图时按照您希望的方式对其进行排序。

    可能有一些语句结构正在进行:“选择TOP{0}百分比…”您的第一句话已成为我隐藏问题的答案之一。我使用TOP 99.999999百分比,它始终有效。已经够近了。我倾向于根据预期的记录数附加'9'的数量。更多的记录,更多的9,它总是有效的。我在SQL 2008到SQL 2017之间使用过。为什么第二个查询会失败?因为内部查询没有(必须)完全计算?第二个链接解释了为什么创建临时表有时会带来显著的性能改进!这不是真的;有关详细信息,请参见@gbn的答案。您引用的链接没有说明任何有关选择百分之一百(100%)的内容。。按部就班,毫无意义。该链接提到了SELECT TOP(2147483647)的使用。。点菜。目前,
          SELECT TOP
                  ( SELECT COUNT(foo) 
                      From MyTable 
                     WHERE ISNUMERIC (foo) = 1) * 
                      FROM bar WITH(NOLOCK) 
                  ORDER BY foo
                     WHERE CAST(foo AS int) > 100
                   )
    
    CREATE VIEW v_Test
             AS
               SELECT name
                 FROM sysobjects
             ORDER BY name
            GO