從 TPCH 測試學習性能優化技巧之 Q18

一、 查詢要求

Q18語句查詢獲得比指定供貨量大的供貨商信息。可用於決定在訂單量大,任務緊急時,驗證是否有充足的供貨商。

Q18語句的特點是:帶有分組、排序、聚集、IN子查詢操作並存的三表連接操作。查詢語句沒有從語法上限制返回多少條元組,但是TPC-H標準規定,查詢結果只返回前100行(通常依賴於應用程序實現)。

二、 Oracle執行

Oracle編寫的查詢SQL語句如下:

select * from (

select /*+ parallel(n) */

c_name,c_custkey,o_orderkey,o_orderdate,o_totalprice,

sum(l_quantity)

from

customer,orders,lineitem

where

o_orderkey in (

select

l_orderkey

from

lineitem

group by

l_orderkey

having

sum(l_quantity) > 314

)

and c_custkey = o_custkey

and o_orderkey = l_orderkey

group by

c_name,

c_custkey,

o_orderkey,

o_orderdate,

o_totalprice

order by

o_totalprice desc,

o_orderdate

) where rownum<=100;

其中/*+ parallel(n) */ 是Oracle的並行查詢語法,n是並行數。

腳本執行時間,單位:秒

從 TPCH 測試學習性能優化技巧之 Q18

三、 SPL優化

分析這個查詢,如果我們將下面的子查詢

select l_orderkey,sum(l_quantity) lq

from lineitem

group by l_orderkey

命名為視圖lo,則原查詢的主體等價於:

select /*+ parallel(n) */

c_name,c_custkey,o_orderkey,o_orderdate,o_totalprice,

sum(lq)

from

customer,orders,lo

where

c_custkey = o_custkey

and o_orderkey = l_orderkey

and lq>314

group by

c_name,

c_custkey,

o_orderkey,

o_orderdate,

o_totalprice

這是一個有外鍵關聯的表orders與其同維表lo的連接運算,而我們知道lineitem是orders的子表,也是按l_orderkey排序的,用lineitem計算出來的lo仍然可以保證按l_orderkey有序,這樣可以與orders做高速歸併連接。

customer作為外鍵表在結果集上與orders關聯即可,前面運算可以不參與。

SPL腳本如下:

從 TPCH 測試學習性能優化技巧之 Q18

腳本執行時間,單位:秒

從 TPCH 測試學習性能優化技巧之 Q18


分享到:


相關文章: