中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2020-06-18 06:40:44 來源:網絡 閱讀:295 作者:raqsoft 欄目:大數據

測試環境說明

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

硬盤: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個小時。

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(
? ?? L_RETURNFLAG,? L_LINESTATUS,? L_QUANTITY,
? ?? L_EXTENDEDPRICE, L_DISCOUNT, L_TAX, ? L_SHIPDATE
? ? )

4

=A3.select(L_SHIPDATE<=date(“1998-09-02”))

5

=A4.groups(
? ?? L_RETURNFLAG, L_LINESTATUS;
? ?? sum(L_QUANTITY):sum_qty,
? ?? sum(L_EXTENDEDPRICE):sum_base_price,
? ?? sum(L_EXTENDEDPRICE * (1 - ? L_DISCOUNT)):sum_disc_price,
? ?? sum(L_EXTENDEDPRICE * (1 - ? L_DISCOUNT) * (1 + L_TAX)):sum_charge,
? ?? avg(L_QUANTITY):avg_qty,
? ?? avg(L_EXTENDEDPRICE):avg_price,
? ?? avg(L_DISCOUNT):avg_disc,
? ?? count(1):count_order
? ?? )

6

=interval@s(A1,now())

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

?

groups和groupx的選用

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

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

???????? ?


A

1

=now()

2

=file(path+"lineitem.btx")

3

=A2.cursor@b(
? ?? L_RETURNFLAG,? L_LINESTATUS,? L_QUANTITY,
? ?? L_EXTENDEDPRICE, L_DISCOUNT, L_TAX, ? L_SHIPDATE
? ? )

4

=A3.select(L_SHIPDATE<=date(“1998-09-02”))

5

=A4.groupx(
? ?? L_RETURNFLAG, L_LINESTATUS;
? ?? sum(L_QUANTITY):sum_qty,
? ?? sum(L_EXTENDEDPRICE):sum_base_price,
? ?? sum(L_EXTENDEDPRICE * (1 - ? L_DISCOUNT)):sum_disc_price,
? ?? sum(L_EXTENDEDPRICE * (1 - ? L_DISCOUNT) * (1 + L_TAX)):sum_charge,
? ?? avg(L_QUANTITY):avg_qty,
? ?? avg(L_EXTENDEDPRICE):avg_price,
? ?? avg(L_DISCOUNT):avg_disc,
? ?? count(1):count_order
? ?? ).fetch()

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(
? ?? L_RETURNFLAG,? L_LINESTATUS,? L_QUANTITY,
? ?? L_EXTENDEDPRICE, L_DISCOUNT, L_TAX, ? L_SHIPDATE
? ? )

4

=A3.select(L_SHIPDATE<= date(“1998-09-02”))

5

=A4.groups(
? ?? L_RETURNFLAG, L_LINESTATUS;
? ?? sum(L_QUANTITY):sum_qty,
? ?? sum(L_EXTENDEDPRICE):sum_base_price,
? ?? sum(L_EXTENDEDPRICE * (1 - ? L_DISCOUNT)):sum_disc_price,
? ?? sum(L_EXTENDEDPRICE * (1 - ? L_DISCOUNT) * (1 + L_TAX)):sum_charge,
? ?? avg(L_QUANTITY):avg_qty,
? ?? avg(L_EXTENDEDPRICE):avg_price,
? ?? avg(L_DISCOUNT):avg_disc,
? ?? count(1):count_order
? ?? )

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(
? ?? #L_ORDERKEY, L_PARTKEY, L_SUPPKEY,
? ?? L_LINENUMBER, L_QUANTITY, ? L_EXTENDEDPRICE,
? ?? L_DISCOUNT, L_TAX, L_RETURNFLAG, ? L_LINESTATUS,
? ?? L_SHIPDATE, L_COMMITDATE, ? L_RECEIPTDATE,
? ?? L_SHIPINSTRUCT, L_SHIPMODE, ? L_COMMENT
? ? )

3

=A1.new(
? ?? _1:L_ORDERKEY, _2:L_PARTKEY, ? _3:L_SUPPKEY,
? ?? _4:L_LINENUMBER, _5:L_QUANTITY, ? _6:L_EXTENDEDPRICE,
? ?? _7:L_DISCOUNT, _8:L_TAX, ? _9:L_RETURNFLAG,
? ?? _10:L_LINESTATUS, _11:L_SHIPDATE, ? _12:L_COMMITDATE,
? ?? _13:L_RECEIPTDATE, ? _14:L_SHIPINSTRUCT,
? ?? _15:L_SHIPMODE, _16:L_COMMENT
? ? )

4

>A2.append(A3)

?

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

?

組表運行腳本:


A

1

=now()

2

=file(path+"LINEITEM.ctx").create()

3

=A2.cursor@m(
? ?? ? L_RETURNFLAG,L_LINESTATUS,L_QUANTITY,
? ?? L_EXTENDEDPRICE,L_DISCOUNT,L_TAX,L_SHIPDATE;
? ?? L_SHIPDATE<= date(“1998-09-02”)
? ? )

4

=A3.groups(
? ?? L_RETURNFLAG,L_LINESTATUS;
? ?? sum(L_QUANTITY):sum_qty,
? ?? sum(L_EXTENDEDPRICE):sum_base_price,
? ?? sum(L_EXTENDEDPRICE * (1 - ? L_DISCOUNT)):sum_disc_price,
? ?? sum(L_EXTENDEDPRICE * (1 - ? L_DISCOUNT) * (1 + L_TAX)):sum_charge,
? ?? avg(L_QUANTITY):avg_qty,
? ?? avg(L_EXTENDEDPRICE):avg_price,
? ?? avg(L_DISCOUNT):avg_disc,
? ?? count(1):count_order
? ?)

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(
? ??? #L_SHIPDATE, #L_ORDERKEY,L_PARTKEY, ? L_SUPPKEY,
? ?? L_LINENUMBER, L_QUANTITY, ? L_EXTENDEDPRICE,
? ?? L_DISCOUNT, L_TAX, L_RETURNFLAG, ? L_LINESTATUS,
? ?? L_COMMITDATE, L_RECEIPTDATE,
? ?? L_SHIPINSTRUCT, L_SHIPMODE, ? L_COMMENT
? ? )

3

=A1.new(
? ?? _11:L_SHIPDATE, _1:L_ORDERKEY, ? _2:L_PARTKEY, _3:L_SUPPKEY,
? ?? _4:L_LINENUMBER, _5:L_QUANTITY, ? _6:L_EXTENDEDPRICE,
? ?? _7:L_DISCOUNT, _8:L_TAX, ? _9:L_RETURNFLAG, _10:L_LINESTATUS,
? ?? _12:L_COMMITDATE, _13:L_RECEIPTDATE,
? ?? _14:L_SHIPINSTRUCT, _15:L_SHIPMODE, ? _16:L_COMMENT
? ? )

4

>A2.append(A3.sortx(L_SHIPDATE))

?

排序后,再次運行腳本,運行時間為44秒(8線程),明顯優于未排序情況。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

芮城县| 皮山县| 延川县| 名山县| 攀枝花市| 修水县| 上思县| 县级市| 河北省| 肃北| 昌乐县| 太仓市| 泊头市| 西安市| 虹口区| 象州县| 庆阳市| 北辰区| 鄂州市| 留坝县| 准格尔旗| 张家界市| 东安县| 栾川县| 民权县| 福清市| 霞浦县| 长兴县| 承德市| 廊坊市| 吉隆县| 电白县| 新绛县| 博湖县| 枝江市| 济南市| 开鲁县| 永靖县| 威海市| 乡城县| 岳阳市|