一、 查詢要求
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是並行數。
腳本執行時間,單位:秒
三、 SPL優化
這個查詢是將partsupp用兩個外鍵表part和supplier進行匹配過濾後再分組,分組時將用兩個外鍵表字段。這時候採用前面所述的技巧,先將外鍵表按條件過濾後,再將主表的關聯字段與外鍵表匹配並把匹配上的關聯字段轉換成外鍵表的記錄指針,這樣匹配不上的記錄 可直接過濾掉,而且在後面分組運算時即可直接引用外鍵表字段。
SPL腳本如下:
A7和A8分別讀來並過濾外鍵表,A9建立遊標同時做匹配和過濾。
注意A7中做in判斷時使用了pos@b,表示這裡將採用二分法。當in判斷的集合成員較多時,將成員先排序後使用二分法可以減少比較次數,從而提高性能。
腳本執行時間,單位:秒
本問題涉及數據量不大,SPL的運算結果與SQL差別也不大。