konhon

          忘掉過去,展望未來。找回自我,超越自我。
          逃避不一定躲的過, 面對不一定最難過, 孤單不一定不快樂, 得到不一定能長久, 失去不一定不再擁有, 可能因為某個理由而傷心難過, 但我卻能找個理由讓自己快樂.

          Google

          BlogJava 首頁 新隨筆 聯(lián)系 聚合 管理
            203 Posts :: 0 Stories :: 61 Comments :: 0 Trackbacks
          平時在PL/SQL中的編程中遇到一些問題,這里以問答的形式來進行把它們總結下來,以供大家分享。  
            
            1、當需要向表中裝載大量的數(shù)據(jù)流或者需要處理大量的數(shù)據(jù)流的時候,能否使用管道提高處理效率?
            

            管道函數(shù)對于改善并行查詢的性能非常方便,它加快往表中加載數(shù)據(jù)的速度。管道函數(shù)的使用總結如下兩點:
            
            每當在查詢里使用PL/SQL函數(shù)時,該查詢將被序列化,即一個處理器只能運行一個查詢實例,那么在這種情況下不可能使用并行查詢(比如在數(shù)據(jù)倉庫中要經常使用這項技術)。因此,為了使用并行查詢就必須使用管道函數(shù),這樣也就加快了執(zhí)行的速度。
            
            管道函數(shù)的輸入?yún)?shù)必須是一個引用記錄集類型(即ref cursor),而返回的是嵌套表類型(其表中每一行對應每一個引用記錄)。在使用管道函數(shù)之前,必須先在程序頭寫上PARALLEL_ENABLE,這樣才能在查詢語句中使用管道函數(shù)來處理了。
            
            2. 如何使PL/SQL程序等待一段時間執(zhí)行?
            

            方法就是使用DBMS_LOCK包的SLEEP函數(shù),可以進行精確定時,其語法為:
            
            DBMS_LOCK.SLEEP (seconds IN NUMBER);
            
            3.需要在一張表插入一條記錄之后等若干秒后再執(zhí)行另外一個操作,如何在PL/SQL程序里進行定時操作?
            

            一般的做法是用循環(huán)作延遲,利用 DBMS_UTILITY的gettime函數(shù)來檢測當前的時間,程序代碼如下:
            
            DECLARE
            v_delaytime CONSTANT INTEGER := 100;
            v_starttime INTEGER ;
            v_endtime INTEGER ;
            BEGIN
            V_starttime := DBMS_UTILITY.get_time;
            V_endtime := DBMS_UTILITY.get_time;
            While abs(V_endtime- V_starttime)< v_delaytime loop
            /*空循環(huán)或者簡單的耗時執(zhí)行語句*/
            End loop;
            END;
            /
            
            另外如果是不同會話(session)之間的定時,就必須使用DBMS_PIPE包的函數(shù)來實現(xiàn)會話間的消息傳遞。
            
            4.當PL/SQL返回一個數(shù)據(jù)集的時候,該使用集合還是游標?
            

            一般情況下,有以下兩點作為依據(jù):
            
            1) 如果PL/SQL程序返回多多行數(shù)據(jù)給另外一個PL/SQL程序的話,這里就建議使用集合,因為這樣可以利用集合的批收集(bulk collection)來提高從數(shù)據(jù)庫提取數(shù)據(jù)的速度。
            
            2) 如果需要在PL/SQL程序的環(huán)境中把數(shù)據(jù)返回到宿主語言環(huán)境中(如Sql*plus,c,delphi等),這時應該使用游標變量來返回這些數(shù)據(jù),因為幾乎所有的宿主語言都支持游標變量,但不是所有的宿主語言都支持集合。這樣可以增強程序的可移植性。
            
            5.如何更有效的在PL/SQL中使用游標?
            

            游標是PL/SQL中一個非常重要的概念,對數(shù)據(jù)庫的檢索主要依靠游標來操作。在PL/SQL中有兩類游標,一類是隱式游標,如select clno into v_clno from table_detail.另外一類是顯式游標,如cursor v_cur is select clno from table_detail。對于游標的使用這里給出以下幾點建議:
            
            1) 盡可能的使用bulk collection。它能夠較大的提高運行性能,在Oracl9i的第二版,甚至可以使用bulk collection來直接將數(shù)據(jù)寫入到記錄表
            
            2) 盡量使用顯式游標來處理,因為相對于隱式游標來說,顯式游標的速度更快一些。
            
            3) 如果查詢的表很小或者是靜態(tài)的,可以把該表緩存到一個包級的集合里。這樣,你的查詢函數(shù)就直接從集合里(即進程全局區(qū),PGA cache),而不是從系統(tǒng)全局區(qū)(SGA)來取數(shù)據(jù),這樣的處理速度會提升很多。
          posted on 2005-11-28 21:06 konhon 優(yōu)華 閱讀(503) 評論(0)  編輯  收藏 所屬分類: Oracle
          主站蜘蛛池模板: 丰镇市| 五台县| 安宁市| 沙湾县| 新宁县| 盐山县| 广昌县| 工布江达县| 罗平县| 宁陕县| 图片| 罗城| 新丰县| 彭山县| 宜昌市| 山东省| 贺州市| 新邵县| 五大连池市| 南京市| 仁化县| 蒙阴县| 集贤县| 读书| 炉霍县| 西丰县| 江永县| 淮南市| 资中县| 景东| 龙岩市| 澄迈县| 吉木萨尔县| 清镇市| 陇南市| 兴和县| 永泰县| 望奎县| 桑植县| 西林县| 大冶市|