天天看點

《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中都有類似的解決方案就好了。

本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。