1. 程式人生 > >oracle sql 高階程式設計學習筆記(二十二)

oracle sql 高階程式設計學習筆記(二十二)

一、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;

這裡寫圖片描述