從 TPCH 測試看 SPL 性能優化技巧 1

測試環境說明

CPU:4顆,主頻2.6G,每一個CPU內核數8個。oracle

硬盤:800G,15000轉SAS硬盤,理論讀寫速度150m/s。函數

內存:64G。性能

操做系統:Linux cent os 6測試

SQL1

select   
   
          l_returnflag,   
   
          l_linestatus,   
   
          sum(l_quantity) as sum_qty,   
   
          sum(l_extendedprice) as sum_base_price,   
   
          sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,   
   
          sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,   
   
          avg(l_quantity) as avg_qty,   
   
          avg(l_extendedprice) as avg_price,   
   
          avg(l_discount) as avg_disc,   
   
          count(*) as count_order   
   
 from   
   
          lineitem   
   
 where   
   
          l_shipdate <= date '1998-12-01' - interval '90' day(3)   
   
 group by   
   
          l_returnflag,   
   
          l_linestatus   
   
 order by   
   
          l_returnflag,   
   
          l_linestatus;

LineItem表原始數據大小爲79.6G(文本格式),數據行數600037902。大數據

Oracle空間文件大小爲200G,lineItem表數據導入時間20個小時。spa

SQL運行時間爲637秒。操作系統

在SQL裏增長並行選項select /+ parallel(lineitem 10) /後,運行時間降低到397秒。線程

用集文件執行

         集文件爲集算器支持的數據文件格式。特色是對數據進行必定的壓縮,以提升查找和計算的磁盤性能。code

         集文件結構簡單,應用範圍明確,其生成速度遠遠高於oracle的數據導入速度。lineitem數據導入僅需48分28秒,最終生成的集文件大小爲56.9G。排序

         用集文件改寫上面SQL的SPL腳本以下:

image.png

上例運行時間爲412秒,比SQL少了225秒。

groups和groupx的選用

         在集算器中分組統計函數有兩個,一個是groups,另外一個是groupx。

         在上例中已經介紹了groups的腳本。groupx腳本以下:

image.png

本例中該腳本的運行時間爲418秒,與groups至關。

         groups與groupx的區別在於,groups全內存運行,支持並行運行,但當內存不足時不能利用外存,僅僅是拋出異常。groupx在內存不足時會利用外存完成計算,但不支持並行。

         選用groups仍是groupx須要預判統計計算過程當中,內存佔用的大小。決定統計計算中內存佔用大小的決定因素是,分組表達式可能產生的分組的個數。

         本例中L_RETURNFLAG爲二值,L_LINESTATUS爲枚舉值,能夠判斷分組數很是小。所以這裏採用groups是合適的(groups經過並行能夠大幅提升執行效率,後面會介紹)。

關於遊標使用

         遊標原意是爲了減小內存消耗,保證大數據處理能力。但有時也能用於提升性能,緣由在於減小內存使用後能減小磁盤換頁機會,同時小內存塊更容易分配出來、分配速度更快。

         本例中因數據量大,必須使用遊標。咱們在筆記本上用1G的數據量進行過測試。當採用非遊標運行的時候,內存佔用達到了2380.2M,運行時間爲100秒。而採用遊標處理後內存佔用降爲183.49M,運行時間降爲38秒。

用並行計算提升運算速度

咱們看一下並行計算對運算效率的提高:

image.png

         這裏採用的是8線程,運行時間爲84秒,運算效率提高了近5倍。

         並行計算能夠充分利用CPU、硬盤等計算機資源,提高運算效率效果明顯。

         設置不一樣的並行運算數能夠取得不一樣的運算效率。在實際運行中,還要受硬盤轉速、CPU核數等多種條件的影響。即便相同條件下,屢次測試的結果也會有必定的波動。具體的性能指標只有屢次實測才能得出。

用組表提升計算速度

         集算器還提供了列存格式,即組表。咱們再用組表來嘗試一下,先生成組表。用文本文件生成組表的SPL腳本,以下:

image.png

         組表有更好的壓縮效率,最終生成的文件的大小爲29.4G,其大小几乎只有集文件的一半。

組表運行腳本:

image.png

運行時間變爲60秒,相對於集文件效率提升了1/3。

組表提升運行速度的緣由是:

一、採用列存方式,數據集中,須要加載的數據量更少。

二、列存使得壓縮比更高,磁盤數據進一步減小。

組表排序後對性能的影響

         組表的一個好處是,可讓組表存儲時,針對一些經常使用數據有序,以提升性能。本腳本有個針對L_SHITDATE的條件,若是將數據按此字段排序後會提升過濾性能。下面程序是讓組錶針對L_SHIPDATE排序:

image.png

排序後,再次運行腳本,運行時間爲44秒(8線程),明顯優於未排序狀況。

相關文章
相關標籤/搜索