一、 查詢要求
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是並行數。
腳本執行時間,單位:秒
三、 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腳本如下:
腳本執行時間,單位:秒