有關利用Oracle聚集函數進行統計時的,一點小發現

 

 

      今天利用Oracle做數據抽取時,做了個小的實驗,對於自己心中的一點疑問做了個實驗。把結果貼了出來與大家分享。希望對於,與我有同樣問題的人,有所幫助。

      表中的列數yq_jbb表24列,行數530601;yq_bbjcb表24列,行數233451;yq_bbjcjgb表20列,行數230205。其中xb字段是varchar2(4)類型的,sid是varchar2(36)類型的,cxsj是varchar2(20)類型的。

       我的問題如下:

     1.聚合函數中的列,要求得與Select List中的列相同。那麼,如果我在Select List中採用decode對該列進行編碼後,聚合函數group by 認爲是合法的嗎?會不會不讓執行?此問題是由如下的問題聯想到的。當Select List列中某列用substr(XX,1,2)||'000000'進行處理後,就認爲是不同樣列(Group by中的列沒有在Select List中)。

     2.聚合函數中的Select List中的列不做處理,而是在嵌套一層查詢。即在外層查詢對內層查詢的聚合列進行處理。我的問題是,內層處理(如果允許的話)與外層處理會不會有性能上的區別;會不會影響執行的速度?

      針對上述的兩個問題,我做了兩個查詢組,分別用來解答我的兩個疑問。語句如下:

 

 

 

看下面的語句時注意:下面的寫法,2個同樣的查詢,分別交叉排列了8次。執行時,要一併執行。執行後,前兩個語句的執行時間不做計算——原因是考慮到Database Server、Oracle對數據進行緩存、編譯對實驗結果的影響——後面的3組的執行時間求均值,便可看到誰快、誰效率高了。如果還不放心的話,可以對這個過程進行重複實驗,再求均值,我想這樣下來得到的結果便更精確了。

       由於時間的限制,我只是針對下面的語句做了一次實驗,並沒有重複多次再求均值。執行的結果是:嵌套查詢處理花費,1.583S;直接處理花費,1.412S。執行的效率此時,就不言而喻了。

 

 

 

     對於聚合函數的應用,還有一點要說明:超級聚合的group列中不允許出現子查詢。例如,下面的寫法是錯誤的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章