oracle學(xué)習(xí)筆記9: model子句(下)

物化視圖

--物化視圖與查詢重寫
DROP MATERIALIZED VIEW mv_model_inventory;
CREATE MATERIALIZED VIEW mv_model_inventory
ENABLE QUERY REWRITE AS 
  select product,country, year,week,inventory,sale,receipts
  from sales_fact
  model return updated rows
  partition by(product, country)
  dimension by(year, week)
  measures(0 inventory, sale,receipts)
  rules sequential order(
   inventory[year,week] order by year, week=nvl(inventory[cv(year),cv(week)-1],0)-sale[cv(year),cv(week)]+receipts[cv(year),cv(week)]
  )
/

SELECT * FROM (
 select product,country, year,week,inventory,sale,receipts
  from sales_fact
  model return updated rows
  partition by(product, country)
  dimension by(year, week)
  measures(0 inventory, sale,receipts)
  rules sequential order(
     inventory[year,week] order by year, week=nvl(inventory[cv(year),cv(week)-1],0)-sale[cv(year),cv(week)]+receipts[cv(year),cv(week)]
  )
)
WHERE country IN ('Australia') AND product='Xtend Memory'
ORDER BY product,country,year,week;

執(zhí)行計劃
----------------------------------------------------------
Plan hash value: 2344724570

----------------------------------------------------------------------------------------------------

| Id  | Operation                     | Name               | Rows  | Bytes | Cost (%CPU)| Time     |

----------------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT              |                    |    96 | 10944 |   278   (2)| 00:00:04 |

|   1 |  SORT ORDER BY                |                    |    96 | 10944 |   278   (2)| 00:00:04 |

|*  2 |   MAT_VIEW REWRITE ACCESS FULL| MV_MODEL_INVENTORY |    96 | 10944 |   277   (2)| 00:00:04 |

----------------------------------------------------------------------------------------------------


Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("MV_MODEL_INVENTORY"."COUNTRY"='Australia' AND
              "MV_MODEL_INVENTORY"."PRODUCT"='Xtend Memory')

并行

基于model的sql語句可以與oracle的并行執(zhí)行能力無縫結(jié)合。并行和基于model的sql語句可以改善分區(qū)表的查詢性能。

SELECT /*+ parallel ( sf 4) */  
  product,country, year,week,inventory,sale,receipts
  from sales_fact 
  WHERE country IN ('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=nvl(inventory[cv(year),cv(week)-1],0)-sale[cv(year),cv(week)]+receipts[cv(year),cv(week)]
  )

model子句執(zhí)行中的分區(qū)

分區(qū)表可以改進(jìn)model sql語句的性能。如果model sql中的分區(qū)列與表的分區(qū)鍵相匹配使碾,分區(qū)就是被剪裁過的。分區(qū)裁剪是一門將掃描限制在較少分區(qū)中的性能優(yōu)化技術(shù)。

--分區(qū)剪裁
SELECT *
  FROM (SELECT product, country, YEAR, week, inventory, sale, receipts
          FROM sales_fact sf 
          model RETURN updated rows 
          PARTITION BY(YEAR, country) 
          dimension BY(product, week) 
          measures(0 inventory, sale, receipts) 
          rules AUTOMATIC ORDER(
          inventory [ product, week ] ORDER BY product, week =
                  nvl(inventory [ cv(product), cv(week) - 1 ], 0) - sale [ cv(product),
                  cv(week) ] + +receipts [ cv(product),
                  cv(week) ]))
 WHERE YEAR = 2000
   AND country = 'Australia'
   AND product = 'Xtend Memory'

--不進(jìn)行分區(qū)剪裁
SELECT * FROM (
       SELECT product, country, year, week, inventory, sale, receipts
          FROM sales_fact sf 
          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 =
                  nvl(inventory [ cv(year), cv(week) - 1 ], 0)
                   - sale [ cv(year), cv(week) ] 
                   +receipts [ cv(year),cv(week) ]))
 WHERE YEAR = 2000
   AND country = 'Australia'
   AND product = 'Xtend Memory'


執(zhí)行計劃
----------------------------------------------------------
Plan hash value: 463616151

----------------------------------------------------------------------------------

| Id  | Operation           | Name       | Rows  | Bytes | Cost (%CPU)| Time |

----------------------------------------------------------------------------------

|   0 | SELECT STATEMENT    |            |   154 | 17556 |   310   (1)| 00:00:04 |

|*  1 |  VIEW               |            |   154 | 17556 |   310   (1)| 00:00:04 |

|   2 |   SQL MODEL ACYCLIC |            |   154 |  8624 |            | |

|*  3 |    TABLE ACCESS FULL| SALES_FACT |   154 |  8624 |   310   (1)| 00:00:04 |

----------------------------------------------------------------------------------


Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("YEAR"=2000)
   3 - filter("PRODUCT"='Xtend Memory' AND "COUNTRY"='Australia')

product列和country列作為分區(qū)列轰绵,但表使用year列作為分區(qū)鍵,執(zhí)行計劃中的第1步表明為證year=2000由于規(guī)則可能訪問其它分區(qū)而沒有推進(jìn)到視圖中尼荆,因為year是一個維度列左腔。因為分區(qū)鍵沒有前推進(jìn)視圖中,就不允許進(jìn)行分區(qū)剪裁耀找,從而需要掃描所有分區(qū)翔悠。

索引

選擇索引來提高使用model子句的sql語句性能與選擇索引提高其它的任何sql語句的性能都是一樣的业崖”┐眨可以使用訪問和篩選謂語確定最佳的索引策略叫挟。

--記住sql數(shù)據(jù)訪問索引
SELECT * FROM (
       SELECT product, country, year, week, inventory, sale, receipts
          FROM sales_fact sf 
          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 =
                  nvl(inventory [ cv(year), cv(week) - 1 ], 0)
                   - sale [ cv(year), cv(week) ] 
                   +receipts [ cv(year),cv(week) ]))
 WHERE YEAR = 2000  AND country = 'Australia' AND product = 'Xtend Memory'

執(zhí)行計劃
----------------------------------------------------------
Plan hash value: 918126316

-----------------------------------------------------------------------------------------------

| Id  | Operation                     | Name          | Rows  | Bytes | Cost (%CPU)| Time     |

-----------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT              |               |   154 | 17556 |   139(0)| 00:00:02 |

|*  1 |  VIEW                         |               |   154 | 17556 |   139(0)| 00:00:02 |

|   2 |   SQL MODEL ACYCLIC           |               |   154 |  8624 |   |          |

|   3 |    TABLE ACCESS BY INDEX ROWID| SALES_FACT    |   154 |  8624 |   139(0)| 00:00:02 |

|*  4 |     INDEX RANGE SCAN          | SALES_FACT_I1 |   154 |       |     4(0)| 00:00:01 |

-----------------------------------------------------------------------------------------------


Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("YEAR"=2000)
   4 - access("COUNTRY"='Australia' AND "PRODUCT"='Xtend Memory')

子查詢因子

在商務(wù)環(huán)境中,需求是很復(fù)雜的并且經(jīng)常需要多個層級的聚合汁汗。當(dāng)書寫復(fù)雜查詢時撮抓,將子查詢因子化與model子句結(jié)合起來妇斤,以避免sql語句變得復(fù)雜而不易管理。

--記住更多sql數(shù)據(jù)訪問索引的內(nèi)容
WITH t1 AS (
       SELECT product, country, year, week, inventory, sale, receipts
          FROM sales_fact sf 
          WHERE country IN ('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 =
                  nvl(inventory [ cv(year), cv(week) - 1 ], 0)
                   -sale [ cv(year), cv(week) ] 
                   +receipts [ cv(year),cv(week) ])
)
SELECT product, country, year, week, inventory, sale, receipts, prev_sale
FROM t1
MODEL RETURN UPDATED ROWS
PARTITION BY(product,country)
DIMENSION BY(year,week)
MEASURES (inventory,sale,receipts,0 prev_sale)
RULES SEQUENTIAL ORDER(
 prev_sale[year,week] ORDER BY year,week =
  NVL(sale[cv(year)-1,cv(week)],0)  
)
ORDER BY 1,2,3,4;

小結(jié)

寫sql語句以集合的思維方式思考丹拯,很多sql語句都可以使用model子句來簡潔地進(jìn)行重寫站超。用model子句或分析函數(shù)進(jìn)行查詢重寫可以獲取比傳統(tǒng)的sql語句好得多的性能。子查詢因子化乖酬,model和分析函數(shù)特性的結(jié)合可以用來有效實現(xiàn)復(fù)雜的需求死相。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市咬像,隨后出現(xiàn)的幾起案子算撮,更是在濱河造成了極大的恐慌,老刑警劉巖县昂,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肮柜,死亡現(xiàn)場離奇詭異,居然都是意外死亡倒彰,警方通過查閱死者的電腦和手機审洞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來待讳,“玉大人芒澜,你說我怎么就攤上這事〈吹” “怎么了撰糠?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長辩昆。 經(jīng)常有香客問我阅酪,道長,這世上最難降的妖魔是什么汁针? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任术辐,我火速辦了婚禮,結(jié)果婚禮上施无,老公的妹妹穿的比我還像新娘辉词。我一直安慰自己,他們只是感情好猾骡,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布瑞躺。 她就那樣靜靜地躺著敷搪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪幢哨。 梳的紋絲不亂的頭發(fā)上赡勘,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音捞镰,去河邊找鬼闸与。 笑死,一個胖子當(dāng)著我的面吹牛岸售,可吹牛的內(nèi)容都是我干的践樱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼凸丸,長吁一口氣:“原來是場噩夢啊……” “哼拷邢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起屎慢,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤解孙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后抛人,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡脐瑰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年妖枚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苍在。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡绝页,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寂恬,到底是詐尸還是另有隱情续誉,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布初肉,位于F島的核電站酷鸦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏牙咏。R本人自食惡果不足惜臼隔,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望妄壶。 院中可真熱鬧摔握,春花似錦、人聲如沸丁寄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至盛正,卻和暖如春删咱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛮艰。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工腋腮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人壤蚜。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓即寡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親袜刷。 傳聞我的和親對象是個殘疾皇子聪富,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容