成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

具體的Oracle參數視圖實踐

數據庫 Oracle
一般情況下Oracle數據庫是不帶參數的視圖。有時,我們想使用Oracle參數視圖,可以給我們方便查詢數據。下面就來簡單介紹下。

一般情況下Oracle數據庫是不帶參數的視圖。有時,我們想使用Oracle參數視圖,可以給我們方便查詢數據。
比如,眼下我面對這這樣一個問題:要打印一張報表,報表的數據源是Oracle視圖?,F在,隨著數據量的增大,打印報表的速度越來越慢了。所以首先想到了如何優化視圖,視圖的基表為3張表,表A幾百條數據,表B大約3萬條數據,表C大約60萬條數據,其中表C每月大約增加3萬條數據,視圖的SCRIPTS大概是這個樣子:

  1. CREATE OR REPLACE VIEW  M_VIEW  
  2. (COL1,COL2,COL3)  
  3. AS   
  4. SELECT  COL1,COL2,COL3 FROM A,B,C WHERE A.NAME=GET_A_NAME(B.ID) AND B.ID = C.ID; 

其中,GET_A_NAME()為已定義好的根據B表ID查詢其對應的A表NAME的方法。各基表中都已建立了索引,考慮到打印報表時值需要指定月份的數據,所以,想到能不能在視圖中限定C.TIME=指定的時間,這樣數據量就會大大下降,只需要C表中大約3萬條數據。但是,問題是,Oracle中視圖是不能帶參數的。有問題,就有辦法,用變通的辦法,看招:

方案1:利用全局變量。
用全局變量做什么?改一下Oracle參數視圖:

  1. CREATE OR REPLACE VIEW  M_VIEW  
  2. (COL1,COL2,COL3)  
  3. AS   
  4. SELECT  COL1,COL2,COL3 FROM A,B,C WHERE A.NAME=GET_A_NAME(B.ID) AND B.ID = C.ID AND C.TIME=全局變量;  

全局變量中保存查詢的時間條件,在每次調用查詢視圖之前,先修改全局變量的值,然后查詢視圖時就會按照指定條件篩選數據。但是,問題又來了,Oracle參數中是不支持全局變量的,要實現全局變量,同樣需要變通實現,方法就是用包(PACKAGE),針對眼前的應用,可以設計如下的包:

  1. CREATE OR REPLACE PACKAGE PKG_REPORT AS  
  2. FUNCTION GET_VALUE RETURN VARCHAR2;  
  3. PROCEDURE SET_VALUE(PS_TIME IN VARCHAR2);  
  4. END PKG_REPORT;  
  5. CREATE OR REPLACE PACKAGE BODY PKG_REPORT IS  
  6. M_V VARCHAR2(6);  
  7. PROCEDURE SET_VALUE(PS_TIME IN VARCHAR2) IS BEGIN M_V:=PS_TIME; END;  
  8. FUNCTION GET_VALUE RETURN VARCHAR2 IS BEGIN RETURN M_V; END;  
  9. END PKG_REPORT;  

首先修改上面的視圖,把全局變量替換成PKG_REPORT.GET_VALUE(),在程序中打印報表時先調用PKG_REPORT.SET_VALUE()方法設定時間條件,然后查詢視圖生成報表,這樣就變通的實現了帶參數視圖。#p#

方案2:利用臨時表。
利用臨時表的思路是這樣的:首先將所需數據插入到臨時表中,然后構造視圖時以該臨時表為基表。在Oracle參數中,臨時表分為事務級別、會話級別兩種。會話級別的臨時表,顧名思義是基于SESSION的,在SESSION失效時表中的數據會自動TRUNCATE掉,而且臨時表中的數據各SESSION只能訪問自己的數據,不用考慮并發沖突的問題??梢?,會話級別的臨時表正適合我的應用。
首先,建立臨時表:

  1. CREATE GLOBAL TEMPORARY TABLE  M_TEMP_TABLE  
  2. (  
  3.   COL1            VARCHAR2(10 BYTE),  
  4.   COL2            VARCHAR2(80 BYTE),  
  5.   COL3            VARCHAR2(16 BYTE)  
  6. )  
  7. ON COMMIT PRESERVE ROWS  ----指定臨時表是會話級別的  
  8. NOCACHE;  

然后,重構視圖:

  1. CREATE OR REPLACE VIEW  M_VIEW  
  2. (COL1,COL2,COL3)  
  3. AS   
  4. SELECT  * FROM M_TEMP_TABLE;  ----以臨時表為基表 

***,在程序中打印報表前,先調用如下過程,往臨時表中插入數據:

  1. CREATE OR REPLACE PROCEDURE PR_DYNAMIC_DATA(  
  2. /************************************  
  3. 動態的往會話級別的臨時表中插數據  
  4. **************************************/  
  5.     PS_TIME  IN  VARCHAR2, -----指定的時間條件  
  6.     RTN        OUT    NUMBER  
  7. )  
  8. IS      
  9. BEGIN  
  10.     RTN:=1;        
  11. BEGIN          
  12.      INSERT INTO M_TEMP_TABLE   
  13.      SELECT  COL1,COL2,COL3 FROM A,B,C WHERE A.NAME=GET_A_NAME(B.ID) AND B.ID = C.ID AND C.TIME=PS_TIME;       
  14.     EXCEPTION  
  15.         WHEN OTHERS THEN  
  16.             RTN:=-1;  
  17.     END;  
  18.     IF RTN=1 THEN         
  19.         COMMIT;  
  20.     ELSE  
  21.         ROLLBACK;  
  22.     END IF;      
  23. END;  

實際測試,方案看總是看上去很美的,究竟能不能響,還不一定。測試了一下:
優化前:打印報表需要1分45秒;
方案1:打印報表需要1分45秒;
方案2:打印報表需要1分35秒;
可見,方案真的是看上去美,但并沒帶來實際的效果。分析其原因,應該是Oracle自動優化了原來的代碼,也就是說,SELECT * FROM 視圖 A WHERE  A.TIME='200710' 和SELECT * FROM 基表 A,基表 B WHERE  A.ID=B.ID AND A.TIME='200710' 在執行時應該是一樣的。這只是我的猜想,因為我也沒仔細研究過Oracle優化器怎么個工作法。
另外,我查看了優化前的視圖腳本、利用方案1優化后的視圖腳本的EXPLAIN PLAN,調整前的COST=36703670,調整后的COST=17031703。應該說能快一些,但實際并不是這個樣兒地,有些不明白了。希望得到指點~

總結:Oracle參數化視圖可以實現。但想以此作為優化的手段,看來并不可取。

【編輯推薦】

  1. 修改Oracle存儲過程所需代碼
  2. 對Oracle存儲過程的總結
  3. 實現Oracle存儲過程的實際應用的代碼 
  4. 深入高性能的Oracle動態SQL開發 
  5. Oracle SQL的優化規則解析 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/eigo/archive/2007/10/23/1839692.aspx

責任編輯:佚名 來源: CSDN博客
相關推薦

2010-11-16 10:42:45

Oracle創建視圖

2009-05-06 11:09:10

Oracle物化視圖數據庫

2010-04-19 11:21:39

Oracle視圖

2010-10-26 16:43:58

查看Oracle索引

2009-10-29 15:56:12

Oracle用戶權限視

2010-04-02 15:22:02

Oracle join

2010-04-06 09:48:33

Oracle性能

2010-05-05 18:01:29

Oracle時間

2009-11-17 15:59:25

Oracle物化視圖

2009-04-07 10:45:43

Oracle視圖創建

2009-12-14 13:38:59

VS 類視圖

2009-11-17 16:47:09

Oracle物化視圖日

2024-04-17 07:21:52

物化視圖查詢加速器數據倉庫

2016-08-11 14:02:02

NodeJS前端

2010-10-27 16:14:24

Oracle參數查詢命

2010-04-19 10:08:46

Oracle視圖

2010-05-04 08:50:24

Oracle表

2011-03-11 16:42:51

Oracle數據庫視圖

2010-11-19 10:48:44

oracle視圖

2010-04-09 10:52:30

Oracle數據對象
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www.久久精品视频 | 国产精品一区二区电影 | 久久中文字幕电影 | 欧美另类日韩 | 久久精品二区 | 欧美天堂| 日韩三级电影一区二区 | 精品国产一级 | 91精品国产91久久综合桃花 | 亚洲视频在线播放 | 亚洲国产精品一区二区第一页 | 日韩精品视频在线 | 中文字幕高清 | 国产午夜久久久 | 欧美激情亚洲天堂 | 综合色婷婷| 97操操 | 一区二区亚洲 | 国产二区精品视频 | 天天精品在线 | 色综合久久久 | 一区二区三区在线免费观看 | 情侣酒店偷拍一区二区在线播放 | 亚洲国产一区二区在线 | 日韩h| 欧美中文字幕在线 | 黄色男女网站 | 久久久久国产精品午夜一区 | 欧美a在线 | 激情麻豆视频 | 久草免费在线视频 | 亚洲一区二区三区高清 | 精品一区二区三区中文字幕 | 国产成人福利在线观看 | 国产我和子的乱视频网站 | 成人特区 | 亚洲免费网址 | 成人精品毛片国产亚洲av十九禁 | 在线不卡视频 | 中文字字幕一区二区三区四区五区 | www.亚洲免费|