为什么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
这是不好的,因为:
- 该示例首先按项目描述对列表进行sorting,然后根据项目types描述对其进行重新sorting。 这是浪费的资源在第一种sorting – 按原样运行并不意味着它正在运行:
ORDER BY item_type_description, item_description
- 由于封装,这个视图是不是很明显。 这并不意味着你应该使用不同的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