您好,登錄后才能下訂單哦!
CPU:4顆,主頻2.6G,每個CPU內核數8個。
硬盤:800G,15000轉SAS硬盤,理論讀寫速度150m/s。
內存:64G。
操作系統:Linux cent os 6
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個小時。
SQL運行時間為637秒。
在SQL里增加并行選項select /*+ parallel(lineitem 10) */后,運行時間下降到397秒。
???????? 集文件為集算器支持的數據文件格式。特點是對數據進行一定的壓縮,以提高查找和計算的磁盤性能。
???????? 集文件結構簡單,應用范圍明確,其生成速度遠遠高于oracle的數據導入速度。lineitem數據導入僅需48分28秒,最終生成的集文件大小為56.9G。
???????? ?
???????? 用集文件改寫上面SQL的SPL腳本如下:
A | |
1 | =now() |
2 | =file(path+"lineitem.btx") |
3 | =A2.cursor@b( |
4 | =A3.select(L_SHIPDATE<=date(“1998-09-02”)) |
5 | =A4.groups( |
6 | =interval@s(A1,now()) |
上例運行時間為412秒,比SQL少了225秒。
?
???????? 在集算器中分組統計函數有兩個,一個是groups,另一個是groupx。
???????? 在上例中已經介紹了groups的腳本。groupx腳本如下:
???????? ?
A | |
1 | =now() |
2 | =file(path+"lineitem.btx") |
3 | =A2.cursor@b( |
4 | =A3.select(L_SHIPDATE<=date(“1998-09-02”)) |
5 | =A4.groupx( |
6 | =now@s() |
7 | =interval@s(A1,A8) |
本例中該腳本的運行時間為418秒,與groups相當。
?
???????? groups與groupx的區別在于,groups全內存運行,支持并行運行,但當內存不足時不能利用外存,僅僅是拋出異常。groupx在內存不足時會利用外存完成計算,但不支持并行。
???????? 選用groups還是groupx需要預判統計計算過程中,內存占用的大小。決定統計計算中內存占用大小的決定因素是,分組表達式可能產生的分組的個數。
???????? 本例中L_RETURNFLAG為二值,L_LINESTATUS為枚舉值,可以判斷分組數非常小。因此這里采用groups是合適的(groups通過并行可以大幅提高執行效率,后面會介紹)。
???????? ?
???????? 游標原意是為了減少內存消耗,保證大數據處理能力。但有時也能用于提高性能,原因在于減少內存使用后能減少磁盤換頁機會,同時小內存塊更容易分配出來、分配速度更快。
???????? 本例中因數據量大,必須使用游標。我們在筆記本上用1G的數據量進行過測試。當采用非游標運行的時候,內存占用達到了2380.2M,運行時間為100秒。而采用游標處理后內存占用降為183.49M,運行時間降為38秒。
?
我們看一下并行計算對運算效率的提升:
A | |
1 | =now() |
2 | =file(path+"lineitem.btx") |
3 | =A2.cursor@mb( |
4 | =A3.select(L_SHIPDATE<= date(“1998-09-02”)) |
5 | =A4.groups( |
6 | =now@s() |
7 | =interval@s(A1,A6) |
???????? 這里采用的是8線程,運行時間為84秒,運算效率提升了近5倍。
???????? 并行計算可以充分利用CPU、硬盤等計算機資源,提升運算效率效果明顯。
?
???????? 設置不同的并行運算數可以取得不同的運算效率。在實際運行中,還要受硬盤轉速、CPU核數等多種條件的影響。即使相同條件下,多次測試的結果也會有一定的波動。具體的性能指標只有多次實測才能得出。
?
???????? 集算器還提供了列存格式,即組表。我們再用組表來嘗試一下,先生成組表。用文本文件生成組表的SPL腳本,如下:
A | |
1 | =file(path+"lineitem.tbl").cursor@(; ? , "|") |
2 | =file(path+"LINEITEM.ctx").create( |
3 | =A1.new( |
4 | >A2.append(A3) |
?
???????? 組表有更好的壓縮效率,最終生成的文件的大小為29.4G,其大小幾乎只有集文件的一半。
?
組表運行腳本:
A | |
1 | =now() |
2 | =file(path+"LINEITEM.ctx").create() |
3 | =A2.cursor@m( |
4 | =A3.groups( |
5 | =interval@s(A1,now()) |
運行時間變為60秒,相對于集文件效率提高了1/3。
?
組表提高運行速度的原因是:
1、采用列存方式,數據集中,需要加載的數據量更少。
2、列存使得壓縮比更高,磁盤數據進一步減少。
???????? ?
?
???????? 組表的一個好處是,可以讓組表存儲時,針對一些常用數據有序,以提高性能。本腳本有個針對L_SHITDATE的條件,如果將數據按此字段排序后會提高過濾性能。下面程序是讓組表針對L_SHIPDATE排序:
A | |
1 | =file(path+"lineitem.tbl").cursor@(; ? , "|") |
2 | =file(path+"LINEITEM1.ctx").create( |
3 | =A1.new( |
4 | >A2.append(A3.sortx(L_SHIPDATE)) |
?
排序后,再次運行腳本,運行時間為44秒(8線程),明顯優于未排序情況。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。