oracle sql 高階程式設計學習筆記(二十二)
阿新 • • 發佈:2018-11-21
一、model 空值
model 子句存在空值的原因有兩個
1、單員格存在,但值為空
2、單元格不存在
1、例項演示 nav
select product,
country,
year,
week,
sale
from sales_fact
where country = 'Australia'
and product = 'Xtend Memory'
model keep nav return updated rows
--keep nav是預設值 nav(non avaliable values ) 沒有可用值
partition by(product, country)
dimension by(year, week)
measures(sale)
rules sequential order(sale [ 2001, 1 ]
order by year, week = sale [ 2001, 1 ], sale [ 2002, 1 ]
order by year, week = sale [ 2001, 1 ] + sale [ 2002, 1 ])
order by product, country, year, week
2、例項演示 ignore nav
select product,
country,
year,
week,
sale
from sales_fact
where country = 'Australia'
and product = 'Xtend Memory'
model ignore nav return updated rows
-- 如果位空 則返回0
partition by(product, country)
dimension by(year, week)
measures(sale)
rules sequential order (sale [ 2001, 1 ]
order by year, week = sale [ 2001, 1 ], sale [ 2002, 1 ]
order by year, week = sale [ 2001, 1 ] + sale [ 2002, 1 ])
order by product, country, year, week
可以回憶上一篇 https://blog.csdn.net/whandgdh/article/details/82697327 中presetv 以及presentnnv 兩個函式對空值的處理
二、model子句效能調優
model 子句最關鍵的就是規則求解。
規則求解可以使用如下5種演算法:
1、ACYCLIC
2、ACYCLIC FAST
3、CYCLIC
4、ORDERED
5、ORDERED FAST
ACYCLIC FAST ORDERED FAST是相對較優的演算法,允許單元格高效求解。
如果演算法指定了automatic order 會選擇使用ACYCLIC和CYCLIC 演算法
如果指定了 sequential order 則會選擇使用ORDERED 演算法
如果規則訪問某個獨立的單元格不進行聚合有可能選擇 ACYCLIC FAST 或ORDERED FAST
2、執行計劃
2、1 ACYCLIC
例項演示 :model 子句開始求庫存的例項 我們在規則種再加上order
select product, country, year, week, inventory, sale, receipts
from sales_fact
where country = 'Australia'
and product = 'Xtend Memory'
model return updated rows
partition by(product, country)
dimension by(year, week)
measures(0 inventory, sale, receipts)
rules automatic
order(inventory [ year, week ] order by year ,week
-- order 來控制規則之間的依賴關係,避免迴圈依賴性
= nvl(inventory [ cv(year), cv(week) - 1 ], 0) - sale [ cv(year), cv(week) ] + receipts [ cv(year), cv(week) ])
order by product, country, year, week;
ACYCLIC 表明了規則之間沒有可能的CYCLIC(迴圈)依賴關係
2.2、ACYCLIC FAST
如果規則只訪問一個單元格,可以使用ACYCLIC FAST 演算法
select product, country, year, week, sale ,sale_modify
from sales_fact
where country = 'Australia'
and product = 'Xtend Memory'
model return updated rows
partition by(product, country)
dimension by(year, week)
measures( 0 sale_modify, sale )
rules automatic
order(sale_modify[2001,1]=sale[2001,1]*10)
order by product, country, year, week;
2.3 、CYCLIC
select product, country, year, week, inventory, sale, receipts
from sales_fact
where country = 'Australia'
and product = 'Xtend Memory'
model return updated rows
partition by(product, country)
dimension by(year, week)
measures(0 inventory, sale, receipts)
rules automatic
order(inventory [ year, week ] = nvl(inventory [ cv(year), cv(week) - 1 ], 0) - sale [ cv(year), cv(week) ] + receipts [ cv(year), cv(week) ])
order by product, country, year, week;
2.4、ORDERED
select product, country, year, week, inventory, sale, receipts,sale_modify
from sales_fact
where country = 'Australia'
and product = 'Xtend Memory'
model return updated rows
partition by(product, country)
dimension by(year, week)
measures(0 inventory,0 sale_modify,sale, receipts)
rules sequential
order(inventory [ year, week ] order by year ,week
-- order 來控制規則之間的依賴關係,避免迴圈依賴性
= nvl(inventory [ cv(year), cv(week) - 1 ], 0) - sale [ cv(year), cv(week) ] + receipts [ cv(year), cv(week) ],
sale_modify[2001,1]=sale[2001,1]*10
)
order by product, country, year, week;