一、???? 查詢要求
Q5語句查詢得到通過某個地區(qū)零件供貨商而獲得的收入(收入按sum(l_extendedprice * (1 -l_discount))計算)統(tǒng)計信息距辆。可用于決定在給定的區(qū)域是否需要建立一個當(dāng)?shù)胤峙渲行摹?/p>
Q5語句的特點是:帶有分組跨算、排序椭懊、聚集操作并存的多表連接查詢操作。
二灾搏、???? Oracle執(zhí)行
Oracle編寫的查詢SQL語句如下:
select /*+ parallel(n) */
???????? n_name,
???????? sum(l_extendedprice * (1 - l_discount)) as revenue
from
???????? customer,
???????? orders,
???????? lineitem,
???????? supplier,
???????? nation,
???????? region
where
???????? c_custkey = o_custkey
???????? and l_orderkey = o_orderkey
???????? and l_suppkey = s_suppkey
???????? and c_nationkey = s_nationkey
???????? and s_nationkey = n_nationkey
???????? and n_regionkey = r_regionkey
???????? and r_name = 'ASIA'
???????? and o_orderdate >= date '1995-01-01'
???????? and o_orderdate < date '1995-01-01' + interval '1' year
group by
???????? n_name
order by
???????? revenue desc;
其中/*+ parallel(n) */ 是Oracle的并行查詢語法,n是并行數(shù)媳板。
腳本執(zhí)行時間泉哈,單位:秒
并行數(shù)124812
Oracle672368301224225
三蛉幸、???? SPL優(yōu)化
優(yōu)化原理和Q3類似,只是涉及的外鍵表更多一些提陶。
SPL腳本如下:
A
1=1
2=now()
3>date=date("1995-01-01")
4>name="ASIA"
5=elapse@y(date,1)
6=file(path+"region.ctx").create().cursor().select(R_NAME==name).fetch()
7=file(path+"nation.ctx").create().cursor().switch@i(N_REGIONKEY, ? A6:R_REGIONKEY).fetch().keys@i(N_NATIONKEY)
8=file(path+"supplier.ctx").create().cursor@m(S_SUPPKEY,S_NATIONKEY;S_NATIONKEY:A7;A1).fetch().keys@i(S_SUPPKEY)
9=file(path+"customer.ctx").create().cursor@m(C_CUSTKEY,C_NATIONKEY;C_NATIONKEY:A7;A1).fetch().keys@i(C_CUSTKEY)
10=file(path+"orders.ctx").create().cursor@m(O_ORDERKEY,O_CUSTKEY;O_ORDERDATE>=date ? && O_ORDERDATE < A5,O_CUSTKEY:A9;A1)
11=file(path+"lineitem.ctx").create().news(A10,L_ORDERKEY,L_SUPPKEY,L_EXTENDEDPRICE,L_DISCOUNT,O_CUSTKEY;L_SUPPKEY:A8)
12=A11.select(O_CUSTKEY.C_NATIONKEY==L_SUPPKEY.S_NATIONKEY)
13=A12.groups@u(L_SUPPKEY.S_NATIONKEY.N_NAME;sum(L_EXTENDEDPRICE ? * (1 - L_DISCOUNT)):revenue)
14=A13.sort(revenue ? :-1)
15=now()
16=interval@s(A2,A15)
這里大量使用了前面題目中說過的游標(biāo)建立時過濾和將關(guān)聯(lián)字段轉(zhuǎn)換成外鍵表指針的技巧匹层。
與Q3不大相同的是,最后用于分組的字段不是已經(jīng)有序的L_ORDERKEY撑柔,所以不能再使用groups@o。
腳本執(zhí)行時間铅忿,單位:秒
并行數(shù)124812
Oracle672368301224225
SPL組表353177914934