Sql 为什么要使用Select Top 100%?
我知道在SQL Server 2005之前,您可以“欺骗”SQL Server,允许在视图定义中使用order by,也可以在SELECT子句中包含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%是多余的。(正如您所提到的,这是视图的“诀窍”) [希望优化器能够优化它。]我猜没有理由,只是漠不关心 此
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描述
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