一尘不染

为什么 ORDER BY 不属于视图?

sql-server

我知道 你 不能有 ORDER BY意见。(至少在我正在使用的 SQL Server 2012 中)

我也明白排序视图的“正确”方法是在查询视图的语句ORDER BY周围放置一个。SELECT

但是对于实际的 SQL 和视图的使用相对较新,我想了解为什么这是设计使然。如果我正确地遵循了历史,这曾经是可能的,并且已从 SQL Server 2008 等中明确删除(不要引用我的确切版本)。

然而,我能想出的最好的理由是为什么微软删除了这个功能,因为“视图是一个未排序的数据集合”。

我假设有一个很好的、合乎逻辑的理由来解释为什么视图应该是未排序的。为什么视图不能只是扁平化的数据集合?为什么特别未排序?似乎并不难想出这样的情况(至少对我/恕我直言),有一个排序视图似乎非常直观。


阅读 169

收藏
2022-10-31

共1个答案

一尘不染

(当然,索​​引视图除外。)

视图没有具体化 - 数据没有存储,那么如何对其进行排序?视图有点像只包含SELECT不带参数的存储过程......它不保存数据,它只保存查询的定义。由于对视图的不同引用可能需要以不同方式排序的数据,因此您执行此操作的方式 - 就像从表中选择一样,根据定义,该表也是未排序的行集合 - 是在外部查询中包含 order by .

也可以稍微了解一下历史。如果不ORDER BY包括TOP. _ 在这种情况下,ORDER BY指示哪些行包含在 中TOP,而不是它们将如何呈现。碰巧在 SQL Server 2000 中,如果TOPis100 PERCENT或{some number >= number of rows in the table},优化器相当简单,最终生成的计划与TOP/ORDER BY. 但是这种行为从来没有得到保证或记录——它只是基于观察,这是一个坏习惯。当 SQL Server 2005 出现时,这种行为开始“破坏”,因为优化器的变化导致使用不同的计划和运算符——除此之外,TOP / ORDER BY如果是 . 将被完全忽略TOP 100 PERCENT。一些客户对此的抱怨如此之大,以至于微软发布了一个跟踪标志以恢复旧行为。我不会告诉你标志是什么,因为我不想让你使用它,并且我想确保意图是正确的——如果你想要一个可预测的排序顺序,ORDER BY请在外部查询中使用。

总结一下并尽可能澄清您提出的观点: Microsoft 没有删除任何内容。他们使产品变得更好,并且作为副作用,这种无证、无保证的行为变得不那么可靠了。总的来说,我认为产品更适合它。

2022-10-31