天天看點

《T-SQL性能調優秘笈——基于SQL Server 2012 視窗函數》——1.3 視窗函數中的元素

本節書摘來自異步社群出版社《t-sql性能調優秘笈——基于sql server 2012 視窗函數》一書中的第1章,第1.3節,作者: 【美】itzik ben-gan,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

t-sql性能調優秘笈——基于sql server 2012 視窗函數

視窗函數的行為描述出現在函數的over子句中,并涉及多個元素。3個核心元素是分區、排序和架構。不是所有的視窗函數都支援這3個元素。本節在介紹每個元素時會指出支援它的函數。

分區元素由partition by子句定義,并被所有的視窗函數支援。它對目前計算的視窗進行限制,僅僅那些在結果集的分區列中與目前行有相同值的行才能進入視窗。例如,如果函數使用partition by custid,目前行的custid為1,那麼對于目前行的視窗就是查詢結果集中所有custid值為1的行。如果目前行的custid為2,那麼對于目前行的視窗就是所有custid為2的行。

如果沒有指定partition by子句,視窗就沒有限制。換種說法就是:如果沒有顯式地指定分區,則預設分區就是把整個查詢結果集當作一個分區。

有一點不太明顯,這裡提出來:同一個查詢中的不同函數,可能會有不同的分區描述。把程式清單1-1内的查詢當做一個示例:

程式清單1-1 查詢中有兩個rank計算

《T-SQL性能調優秘笈——基于SQL Server 2012 視窗函數》——1.3 視窗函數中的元素

觀察第一個rank函數(它生成rnk_all列),它依賴預設分區,第二個rank函數(它生成rnk_cust列)使用按照custid進行的顯式分區。圖1-4顯示了在查詢中,為3個示例計算結果定義的分區:一個rnk_all值和兩個rnk_cust值。

《T-SQL性能調優秘笈——基于SQL Server 2012 視窗函數》——1.3 視窗函數中的元素

箭頭從函數的結果值指向用于計算它們所屬的視窗分區。

排序元素定義計算的順序,如果與分區有關,則是在分區内的順序。在标準sql中,所有函數都支援排序元素。起初sql server不支援聚合函數中的排序元素,而僅僅支援分區。對聚合函數中排序的支援,是從sql server 2012開始的。

有趣的是,針對不同的函數類别,排序元素有輕微的不同意義。對于排名函數,排序是直覺的。例如,當使用降序排序時,rank函數傳回對應分區内大于目前值的記錄的個數加1;當使用升序排序時,函數傳回小于目前值的記錄的個數加1。圖1-5說明了之前清單1-1的排名情況——這次包含了對排序元素的解釋。

《T-SQL性能調優秘笈——基于SQL Server 2012 視窗函數》——1.3 視窗函數中的元素

圖1-5僅僅展示了在視窗中3行記錄的排名計算。當然還有很多——準确地說,有1 660條。原因是有830行記錄,對于每一行,都要計算兩個排名(升序和降序)。從概念上來說,一個有趣的現象是這麼多視窗時同時存在。

聚合視窗函數的排序和排名視窗函數略有意義上的不同。在聚合中,與某些人認為的相反,排序與聚合中的順序無關;然而,排序元素為下面将要描述的架構選項賦予一定的含義,換句話說,排序元素幫助限定在視窗内的行。

從本質上來說,架構是一個在分區内對行進行進一步限制的篩選器。它适用于聚合視窗函數,也适用于三個偏移函數:first_value、last_value和nth_value。把這個視窗元素想成是基于給定的排序,在目前行所在分區中定義兩個點,這兩點形成的架構之間的行才會參與計算。

在标準的架構描述中,包含一個rows或range選項,用來定義架構的開始行和結束行,這兩行也可以形成“架構外”(架構内的行被排除在計算之外)視窗選項。sql server 2012開始支援架構,完全實作rows選項,部分實作range選項,尚未實作“架構外”視窗選項。

rows選項允許我們用相對于目前行的偏移行數來指定架構的起點和終點。range選項更具靈活性,可以以架構起終點的值與目前行的值的差異來定義偏移行數。“架構外”視窗選項用來定義如何對目前行及具有相同值的行進行處置,這樣解釋不夠清晰和充分,但我暫時還不想深入到細節中去,後面會有更多的詳述。目前,我隻希望介紹概念,并提供一個簡單的示例。下面是一個對emporders視圖的查詢,計算每個員工每個訂單月的銷售數量累積總計:

我們觀察到,視窗函數在qty特性上應用了sum聚合視窗,用empid進行分區,分區中的行按照ordermonth進行排序,在分區内,按照給定的排序,設定架構為目前行之前的所有行(沒有下邊界點)。換句話說,結果合計的架構是目前行(包含)之前的所有行。這個查詢的部分輸出如下:

《T-SQL性能調優秘笈——基于SQL Server 2012 視窗函數》——1.3 視窗函數中的元素

可以看到,視窗的描述跟普通的英語一樣簡單。第2章提供架構選項的更多細節。

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