为什么select百分之百?

我明白,在SQL Server 2005之前,你可以“欺骗”SQL Server以允许在视图定义中使用一个命令,也可以在SELECT子句中包含TOP 100 PERCENT 。 但我已经看到了其他代码,我已经inheritance了使用SELECT TOP 100 PERCENT …在dynamicSQL语句(在ASP.NET应用程序的ADO中使用等)。 这有什么理由吗? 是不是没有包括TOP 100 PERCENT的结果?

它被用于“ 中间物化(谷歌search) ”

好文章: Adam Machanic:探索中间物化的秘密

他甚至提出了一个MS连接,所以它可以在一个更清洁的方式完成

我的观点是“不是固有的坏”,但除非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 

但是,这不在SQL Server 2000中。内部查询被评估和假脱机:

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

请注意,这仍然适用于SQL Server 2005

 SELECT TOP 2000000000 ... ORDER BY... 

在最新版本的SQL Server中,TOP(100)PERCENT是完全没有意义的,查询处理器会忽略它(以及相应的ORDER BY,在视图定义或派生表的情况下)。

你以前是正确的,它可以作为一个技巧,但即使如此,它是不可靠的。 不幸的是,微软的一些graphics工具把这个无意义的条款放在其中。

至于为什么这可能出现在dynamicSQL中,我不知道。 你是没有理由的,没有它的结果是一样的(同样,在视图定义或派生表的情况下,没有TOP和ORDER BY子句)。

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

这不是一个好主意。 一个视图不应该定义一个ORDER BY。

一个ORDER BY会影响性能 – 使用它一个视图意味着ORDER BY将在解释计划中出现。 如果查询在立即查询中join了任何内容,或者在内联视图(CTE /子查询因子分解)中引用,那么ORDER BY总是在最后一个ORDER BY之前运行(假定它已经被定义)。 当查询不使用TOP(或MySQL / Postgres的LIMIT)时,sorting不是最终结果集的行是没有好处的。

考虑:

 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 

…等同于使用:

  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 

这是不好的,因为:

  1. 该示例首先按项目描述对列表进行sorting,然后根据项目types描述对其进行重新sorting。 这是浪费的资源在第一种sorting – 按原样运行并不意味着它正在运行: ORDER BY item_type_description, item_description
  2. 由于封装,这个视图是不是很明显。 这并不意味着你应该使用不同的sorting顺序创build多个视图…

如果没有ORDER BY子句,那么TOP 100 PERCENT是多余的。 (正如你所说,这是“窍门”)

[希望优化器将优化这一点。]

没有理由,但冷漠,我猜。

这样的查询string通常由graphics查询工具生成。 用户join一些表格,添加filter,sorting顺序并testing结果。 由于用户可能希望将查询保存为视图,因此该工具会添加TOP 100 PERCENT。 但是,在这种情况下,用户将SQL复制到其代码中,参数化WHERE子句,并隐藏数据访问层中的所有内容。 出于想象,在视线之外。

我见过其他代码,我inheritance了使用SELECT TOP 100 PERCENT

原因很简单:企业pipe理器过去试图有帮助和格式化您的代码,以包括这个给你。 从来没有试过去除它,因为它并没有真正的伤害任何东西,下一次你去改变它EM将再次插入它。

我假设你可以在结果中使用一个variables,但除了在视图中获得ORDER BY片断之外,隐含地声明“TOP 100 PERCENT”不会带来好处:

 declare @t int set @t=100 select top (@t) percent * from tableOf 

请尝试下面,希望它会为你工作。

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