天天看点

《T-SQL性能调优秘笈——基于SQL Server 2012 窗口函数》——1.5 潜在的额外筛选器

本节书摘来自异步社区出版社《t-sql性能调优秘笈——基于sql server 2012 窗口函数》一书中的第1章,第1.5节,作者: 【美】itzik ben-gan,更多章节内容可以访问云栖社区“异步社区”公众号查看。

t-sql性能调优秘笈——基于sql server 2012 窗口函数

上面提供t-sql中的一个变通方法,它可以在不直接支持窗口函数的查询元素里,间接地使用窗口函数。这个变通的方法就是cte形式的表表达式或派生表。有变通方法当然很好,但表表达式给查询增加了一个层次,也增加了其复杂性。我展示的那些示例都很简单,但可以想象一下,如果本身的查询已经很长和复杂,这样做确实会增加难度。是否有更简单的方法,无须增加查询的层次就可达到目的?

对于窗口函数,sql server目前还没有解决方案。不过有趣的是看看其他系统是如何应对这个难题。例如,teredata,它创建了一个称为qualify的过滤子句,在select子句之后进行概念性评估。这意味着它可以直接指向窗口函数,如下面的示例:

《T-SQL性能调优秘笈——基于SQL Server 2012 窗口函数》——1.5 潜在的额外筛选器

更进一步,可以指向select列表定义的列的别名,如下所示:

《T-SQL性能调优秘笈——基于SQL Server 2012 窗口函数》——1.5 潜在的额外筛选器

标准sql没有定义qualify子句;它是teredata特有的特性。这个解决方案看起来很不错,如果在标准sql和sql server中都有类似的解决方案就好了。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。