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

一、 查詢要求

Q16語句查詢獲得能夠以指定的貢獻條件供應零件的供貨商數量。可用於決定在訂單量大,任務緊急時,是否有充足的供貨商。

Q16語句的特點是:帶有分組、排序、聚集、去重、NOT IN子查詢操作並存的兩表連接操作。

二、 Oracle執行

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

select /*+ parallel(n) */

p_brand,p_type,p_size,

count(distinct ps_suppkey) as supplier_cnt

from

partsupp,part

where

p_partkey = ps_partkey

and p_brand <> 'Brand#21'

and p_type not like 'SMALL%'

and p_size in (2, 15, 17, 23, 25, 41, 44, 45)

and ps_suppkey not in (

select

s_suppkey

from

supplier

where

s_comment like '%Customer%Complaints%'

)

group by

p_brand,

p_type,

p_size

order by

supplier_cnt desc,

p_brand,

p_type,

p_size;

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

腳本執行時間,單位:秒

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

三、 SPL優化

這個查詢是將partsupp用兩個外鍵表part和supplier進行匹配過濾後再分組,分組時將用兩個外鍵表字段。這時候採用前面所述的技巧,先將外鍵表按條件過濾後,再將主表的關聯字段與外鍵表匹配並把匹配上的關聯字段轉換成外鍵表的記錄指針,這樣匹配不上的記錄 可直接過濾掉,而且在後面分組運算時即可直接引用外鍵表字段。

SPL腳本如下:

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

A7和A8分別讀來並過濾外鍵表,A9建立遊標同時做匹配和過濾。

注意A7中做in判斷時使用了pos@b,表示這裡將採用二分法。當in判斷的集合成員較多時,將成員先排序後使用二分法可以減少比較次數,從而提高性能。

腳本執行時間,單位:秒

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

本問題涉及數據量不大,SPL的運算結果與SQL差別也不大。


分享到:


相關文章: