• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Khan's Notebook GCC/GNU/Linux Delphi/Window Java/Anywhere

            路漫漫,長修遠,我們不能沒有錢
            隨筆 - 173, 文章 - 0, 評論 - 257, 引用 - 0
            數據加載中……

            java.sql.SQLException: ORA-03233: 無法擴展表 SMP.LOG_MT 的子分區 LOG_MT12_OTHERS (由 64),在表空間 SMP 中

            程序的日志,發現有60多m的這種錯誤

              今天早上看我程序的日志,發現有60多m的這種錯誤,由于我以前只對sql92的一些sql語句有簡單的了解,對數據庫管理完全沒經驗,所以不知道怎么辦才好.

                    問題還沒有解決,找了一些相關文章貼出來

             

            數據庫空間的有效使用和維護不僅是數據庫管理的重要工作,也是大多數開發人員所關心的內容,因為它直接關系到數據庫性能的發揮。同時數據碎片是經常令人頭疼的問題,碎片不僅造成空間的浪費,更重要的是會直接影響應 用程序的響應速度。

            Oracle提供了不少方法用于數據空間的使用、監控和維護,同時也在各版本中陸續對這方面的功能進行了增強,目的在于簡化這方面工作的復雜度,提高應用的運行效率。

            本文希望通過系統地介紹這方面的有關概念,讓大家能更好地規劃使用數據空間,正確使用Oracle提供的有關功能特性,提高應用的執行效率。

            一、有關概念

            數 據庫的空間在邏輯上分為多個表空間,每個表空間則由系統中的一個或多個物理數據文件構成;Oracle存儲數據的基本單位是塊,其大小在建庫時由 DB_BLOCK_SIZE參數確定,一個或多個連續的塊構成一個區片(EXTENT),它作為數據對象存儲的基本單位來使用。在Oracle中,每個基 本數據對象使用的空間稱為段(Segment),段存放在唯一的表空間上,每個段實際上是一系列區片(更為準確地是數據塊)的集合。每個簡單數據對象對應 一個段;對于分區對象如分區表、索引,則每個(子)分區對應一個段,由各個(子)分區共同構成一個完整的數據對象。因此,可以把表空間看作桶,里面放著許 多段;一個段只能放在一個桶中,而不能跨越多個桶。

            二、表空間的使用

            表空間碎片的產生

            由于同一 個表空間中存放有多個數據段,各個數據段可以有不同的區片尺寸,不同段的區片可以交叉存放;當這些段中的區片經過分配(如創建表)、釋放(如刪除表)后, 就可能使表空間中原本連續的空閑數據塊變成不連續,而區片必須由連續的數據塊構成,這時,當某一段需要分配新的區片時,就有可能出現雖然表空間空閑數據塊 的總和大于所需區片的大小,但卻無法找到一串連續的塊來供此區片分配使用。這種情況就稱為表空間的Extent Fragmentation。我們經常會遇到這種情況,明明從DBA_FREE_SPACE中計算表空間還有幾百MB,但其中的某一個表卻無法再擴展幾個 MB的空間。

            消除表空間碎片

            Oracle在段的區片分配上為用戶提供了很大的靈活性,然而如果未能正確使用創建表 空間和數據對象的各個可選擇參數,則在最后將不可避免的要面對區片碎片的問題。Oracle 的Bhaskar Himatsingka 和 Juan Loaiza,為此提出了SAFE(Simple Algorithm for Fragmentation Elimination.)配制規則,通過遵循這套規則,區片級碎片可以完全的避免。而實際上,Oracle8i引入的新特性:Local Managed Tablespace就是SAFE規則在Oracle Server的內置實現。SAFE原則概括起來包括:

            1. 對每個表空間上的段使用相同的區片尺寸;段參數INITIAL=NEXT,PCTINCREASE=0;可以通過使用Create Tablespace 的‘ MINIMUM EXTENT’ 子句來確保分配的區片是此參數的倍數;

            2. 僅在表空間級指定INITIAL、NEXT參數,在創建數據段時不要指定這些參數;

            3. 區片的大小根據段大小來確定,原則是均衡順序掃描的效率和空間的利用率,同時確保段的區片數目控制在1024之下;根據此原則,在進行相應測試之后,確定以下區片選取規則:

            段大小(Oracle7)
            區片大小(Oracle7)
            段大小(Oracle8)
            區片大小(Oracle8)

            &160M
            160K
            &128M
            128K

            160M-5G
            5M
            128M-4G
            4M

            &5G
            160M
            &4G
            128M


            有此數據庫中可以只使用三種區片大小的表空間;在對象創建之前需對其大小進行評估,并放到相應的表空間中;

            4. Oracle815引入了本地管理表空間,它在管理和性能上都優于傳統的字典管理表空間,它已融合了規則1、2、3 ;要使用此特性,在CREATE TABLESPACE語句中指定EXTENT MANAGEMENT LOCAL子句;

            5. 段的區片數目上限應在4096之下,DML操作在此區片數目范圍內不會有明顯的性能差異;但某些DDL操作的速度則與區片的數目關系較大;因此合理的區片數目應保持在1024之下;對于持續不斷擴展的段,應監控區片數目,在必要時移至其它表空間;

            6. 對于特別大的數據段應控制在4G-128G(Oracle7為5G-160G)之間,它們應存放到單獨的表空間上,同時對于這些特大段應考慮使用分區拉提高性能;

            7. 用戶的臨時表空間應使用TEMPORARY類型;

            8. 當系統的事務規模比較均衡時可以對回滾段使用OPTIMAL參數,否則應避免制定OPTIMAL參數,而定期監控回滾段的大小,并在必要時重建;

            9. 臨時段和回滾段絕對不要將用戶數據存放到SYSTEM表空間,它是專為永遠不會Drop和Truncate的系統數據對象而設計的;

            10. 創建表空間時指定數據文件的大小應=區片整數倍+1數據塊,對于Local Managed Tablespace則為區片整數倍+64K;

            11. 當表空間使用統一的區片大小時,不要對其進行空間整理,重整的結果不僅耗費精力而且可能會使性能變差;對于未使用統一的區片尺寸的表空間應通過Export/Import重整;

            12. 8i 提供了Alter Table …Move [Tablespace…]命令可用于快速重整表,Alter Index …Rebuild…[Tablespace…] 命令可用于快速重建索引;

            有關使用單個區片的誤導

            在 許多關于碎片整理的文檔中建議在Export時使用Compress=Y選項,將表中的所有數據調整到一個區片中,期望在Import后獲得良好性能。由 此讓許多人產生一個觀點,認為當表中數據全部存放到一個區片中時,可以獲得良好性能。實際上單區片段只在以下條件成立時,才具有優越性:

            數據主要以(全段)掃描方式訪問;

            段所對應的數據塊在物理磁盤上連續存放,Oracle可以發布較大的順序磁盤讀操作;

            通 過對這兩條進行分析可以發現,一方面數據庫中大部分表是通過索引來訪問,另一方面現在的數據庫文件一般在物理上使用了RAID5或RAID0+1技術,數 據以條帶化方式分布到多個物理磁盤上,邏輯上的單個區片和多區片在物理上并無本質上的區別;另外,從Oracle的角度來看,管理幾百個區片的段是非常輕 松的并不會有性能的下降。由此可見將整個段放到一個區片中并無明顯好處,而這種做法卻會導致表空間碎片的產生。

            三、表數據段的使用

            表空間的組織

            Heap表的空間由一系列區片鏈接而成,每個數據塊除塊頭外其余部分可用于存放數據,在創建表時可以指定以下參數:

            PCTFREE:塊中保留用于UPDATE操作的空間百分比,當數據占用的空間達到此上限時,新的數據將不能再插入到此塊中;

            PCTUSED:指定塊中數據使用空間的最低百分比;當一個塊在達到PCTFREE,之后經歷了一些DELETE操作,在其空間使用下降到PCTUSED后便可以重新被用于INSERT數據;這就是PCTFREE/PCTUSED參數的含義;

            調整PCTFREE、PCTUSED參數的目標一方面是提高性能,另一方面則主要是提高空間使用效率,避免出現塊中存在有許多未用的空間,但卻無法找到一個塊可以被用于插入新數據行的情況發生。

            PCTFREE的使用

            在Oracle 中表的每一行數據由唯一的ROWID標記;而Oracle支持的數據類型中有一些長度是可變的,如VARCHAR,當對這些數據進行UPDATE時,如果 塊中的可用空間不能容納UPDATE后的數據行時,Oracle將會把此行移到其它數據塊,同時保留此數據行的ROWID不變,并在原有塊中建一指針指向 行遷移后的位置。在這種情況下讀取一行數據將需要訪問2個數據塊,從而導致性能下降。PCTFREE保留的空間就是為確保更改后的數據行可以仍存放于原有 數據塊中,避免行遷移的情況發生。

            由此,如果PCTFREE設置不足時可能產生行遷移;而另一方面如果PCTFREE設置過高,將會 造成空間浪費。因此正確設置PCTFREE需要對表中數據的使用進行分析。對于數據長度不會變化或極少更新的情況,可以采用較小的PCTFREE;對于其 它大多數情況應采用稍大的PCTFREE(PCTFREE的缺省值是10,如果不好估計需預留的空間,可以使用15-25的范圍),不要為節約塊中的空間 而使用較小的PCTFREE值。

            PCTUSED的使用

            當塊的使用的空間下降到PCTUSED后,此塊被重新放回空 閑鏈表(Freelist)中,作為后續Insert的候選塊。同樣,設置PCTUSED需要視數據行的特性和Insert、Update、Delete 的模式而定,但必須遵守的原則是:db_block_size * (100 - PCTFREE - PCTUSED)必須比行的長度大。

            對 于數據行長度變化較大的情況,應使用最大行長度來計算PCTUSED,并且應使用較低的PCTUSED值。因為在執行Insert時,如果數據塊的可用空 間不能裝下一行數據,當塊的使用的空間是在PCTUSED之上,Oracle將把此塊從Freelist中移走;當塊的使用的空間是在PCTUSED之 下,Oracle將會擴展段空間。因此,PCTUSED如果設得過高,將導致段的不斷擴展。

            當數據行長度不大時,使用缺省的 PCTUSED(40)是比較合適的;對于行長度較大的情況,最長的行有可能會占用半個以上的塊空間,此時可設置PCTUSED為10。較小的 PCTUSED僅在表中的數據以隨機方式被刪除,而且仍有一些行長時間保留在塊中時,才會造成空間使用上的問題,因為這些塊可能需要較長的時間才能或永遠 不能重新被用于存放新數據。在這種應用中,如果空間利用率一直處于較低水平,則需對PCTUSED進行分析和調整。

            總的說來,可以使用以下公式來計算PCTUSED(結果為負數時取1):

            PCTUSED = 100 - PCTFREE - max(10, (maximum-row-size/ blocksize)*100);

            PCTFREE、PCTUSED在各種應用場合的選取原則

            以Insert為主的應用:小的PCTFREE,缺省的PCTUSED;

            以Update為主的應用:根據行長度的變化范圍來確定PCTFREE,PCTUSED使用缺省值;

            Insert后不久Delete:采用小的PCTFREE,非常小的PCTUSED;

            隨機Insert/Delete:根據行大小,使用上面的建議來設置;

            使用Oracle8的分區技術來提高空間使用率

            Oracle8中的表分區功能可用于歷史性數據的應用場合,可使用時間或其它序列編號作為分區鍵,當舊的歷史數據被刪除后,表中剩下的數據仍可保持較緊湊的存放狀態。

            四、B*Tree索引段的使用

            Btree索引段的結構

            Btree 索引段使用二叉樹結構來組織和存放。典型的索引樹由3層結構組成:根結點塊—存放指針指向分支節點數據塊,分支節點塊-存放指針指向葉節點,葉節點塊-存 放真正的索引鍵值和對應數據行的ROWID。然而,最簡單的索引段可以只有一個塊:既是根結點又是葉節點,而龐大的索引可以有4層以上的結構。與表中的一 行數據可以存放到任何空閑的數據塊中不同,在二叉樹的數據結構中,每個鍵的值將唯一確定它存放的葉節點位置;因此相對于常規表的鏈表數據塊組織形式,索引 段具有更為嚴格的數據結構,這也是索引段結構在DML操作中更容易變形的根源。

            索引數據修改的細節

            a) Insert:

            索 引數據根據鍵值插入到相應葉節點中。如果葉節點空間已滿,將創建新的葉節點數據塊,它稱為葉節點的split,此時又分為兩種情況:如果鍵值位于索引樹的 最尾部,則新葉節點只存放插入的新鍵值,它稱為99-1分裂,否則將執行葉節點的50-50分裂,即新塊和舊塊各存放原有50%的索引數據。

            b) Delete:

            刪除釋放的空間可用于以后相應鍵值插入使用。單索引塊中的數據完全被刪除后,此塊放入空閑鏈表,可以用于將來索引的split,但并不馬上從索引樹中刪除,只有當此塊在索引樹的其它位置被重新使用時,它才會從原有位置上刪除并移到新位置上。

            c) Update:

            索引中沒有Update的操作,對鍵值的修改將對應到索引中的Delete+Insert操作。

            創建索引的有關參數

            PCTFREE:

            與表的PCTFREE不同,它只在索引創建時有效,在以后的插入操作中,此參數將不再起作用,索引數據可以充滿整個數據塊。因此對于在已有一定數據的表上創建索引并且索引創建后存在隨機的Insert、Update操作時,指定此參數才有意義。

            INITTRANS:

            指定初始分配給葉節點塊的事務項槽數,每個事務(transaction)需要分配一個事務槽(slot);它應等于葉節點塊可能的并發事務數。當塊中還有空間且事務槽不夠用時,Oracle會進行動態擴展。

            MAXTRANS:

            指定在葉節點中允許分配事務槽的最大值;它用于防止大量突發的并發事務占用過多的葉節點空間。

            索引使用上的考慮

            索 引在進過一段時間的DML操作后,結構和空間使用情況可能會變得不均衡。在許多情況下重建索引一方面可以提高空間利用率,更為重要的是對于是用率較高的索 引還可減少對數據庫緩存Buffer Pool的需求、提高程序的響應速度。但重組索引需分析數據的使用模式,因為索引的結構與些數據訪問模式直接相關,在一些場合中索引會保持在某種穩定狀 態,盡管此時的空間使用率并不高,因此重建索引并不會有太大幫助。例如,在比較均衡的隨機插入-刪除模式中,索引樹在經過一段時間的運行后會趨向于一種穩 定狀態,空間利用率會保持在66%左右。

            1) 創建參數:對于隨機Insert且頻度不大的索引,應根據預期插入的數據量預留一定的空間,即指定合理的PCTFREE,盡量減少葉節點的Split發生;

            2) 需重建索引的情況:

            如果Insert的鍵值位于各索引子樹,由于50-50分割算法,經過一段時間的Insert后,索引塊的空間利用率將下降,須考慮重建索引;

            對于數據插入后又會刪除,既FIFO模式,但刪除不徹底,此時會有許多索引塊只有極少的記錄,定期重建可以提高空間利用率;

            對于不均衡的隨機插入-刪除模式,需定期考慮重組;

            重建索引可以使用Alter Index …Rebuild 命令,同時指定NOLOGGING參數,然后在創建完成后用Alter Index …Logging改回正常模式;這樣可以生成極少的redo log,大大提高創建速度。

            posted on 2004年12月10日 10:46 AM

            Feedback

            # 回復:java.sql.SQLException: ORA-03233: 無法擴展表 SMP.LOG_MT 的子分區 LOG_MT12_OTHERS (由 64),在表空間 SMP 中 2004-12-10 11:00 AM 思春貼調查員(khan)

            Create table log_mt(
            Msg_id number(20) not null,
            Src_id varchar2(21) not null,
            Dest_id varchar2(21) not null,
            Msg_content varchar2(160) not null,
            Log_time number(10) not null,
            Service_id varchar2(10) not null,
            Fee_type varchar2(2) not null,
            Fee_code varchar2(6) not null,
            Fee_id varchar2(21) not null,
            Msg_status varchar2(7) not null,
            Done_time number(10) not null
            )
            partition by range(done_time)
            subpartition by list(msg_status)(
            partition log_mt1 values less than (199999999)(
            subpartition log_mt1_0 values ('0'),
            subpartition log_mt1_1 values ('1'),
            subpartition log_mt1_2 values ('2'),
            subpartition log_mt1_others values (default)
            ),
            partition log_mt2 values less than (299999999)(
            subpartition log_mt2_0 values ('0'),
            subpartition log_mt2_1 values ('1'),
            subpartition log_mt2_2 values ('2'),
            subpartition log_mt2_others values (default)
            ),
            partition log_mt3 values less than (399999999)(
            subpartition log_mt3_0 values ('0'),
            subpartition log_mt3_1 values ('1'),
            subpartition log_mt3_2 values ('2'),
            subpartition log_mt3_others values (default)
            ),
            partition log_mt4 values less than (499999999)(
            subpartition log_mt4_0 values ('0'),
            subpartition log_mt4_1 values ('1'),
            subpartition log_mt4_2 values ('2'),
            subpartition log_mt4_others values (default)
            ),
            partition log_mt5 values less than (599999999)(
            subpartition log_mt5_0 values ('0'),
            subpartition log_mt5_1 values ('1'),
            subpartition log_mt5_2 values ('2'),
            subpartition log_mt5_others values (default)
            ),
            partition log_mt6 values less than (699999999)(
            subpartition log_mt6_0 values ('0'),
            subpartition log_mt6_1 values ('1'),
            subpartition log_mt6_2 values ('2'),
            subpartition log_mt6_others values (default)
            ),
            partition log_mt7 values less than (799999999)(
            subpartition log_mt7_0 values ('0'),
            subpartition log_mt7_1 values ('1'),
            subpartition log_mt7_2 values ('2'),
            subpartition log_mt7_others values (default)
            ),
            partition log_mt8 values less than (899999999)(
            subpartition log_mt8_0 values ('0'),
            subpartition log_mt8_1 values ('1'),
            subpartition log_mt8_2 values ('2'),
            subpartition log_mt8_others values (default)
            ),
            partition log_mt9 values less than (999999999)(
            subpartition log_mt9_0 values ('0'),
            subpartition log_mt9_1 values ('1'),
            subpartition log_mt9_2 values ('2'),
            subpartition log_mt9_others values (default)
            ),
            partition log_mt10 values less than (1099999999)(
            subpartition log_mt10_0 values ('0'),
            subpartition log_mt10_1 values ('1'),
            subpartition log_mt10_2 values ('2'),
            subpartition log_mt10_others values (default)
            ),
            partition log_mt11 values less than (1199999999)(
            subpartition log_mt11_0 values ('0'),
            subpartition log_mt11_1 values ('1'),
            subpartition log_mt11_2 values ('2'),
            subpartition log_mt11_others values (default)
            ),
            partition log_mt12 values less than (1299999999)(
            subpartition log_mt12_0 values ('0'),
            subpartition log_mt12_1 values ('1'),
            subpartition log_mt12_2 values ('2'),
            subpartition log_mt12_others values (default)
            )
            )
            enable row movement;
            create index log_mtindex on log_mt(msg_id) local;


            建立語句如上:


            現在subpartition log_mt12_others 不能擴展了,郁悶啊

            posted on 2004-12-10 18:46 Khan 閱讀(1907) 評論(0)  編輯 收藏 引用 所屬分類: 周邊技術

            久久精品国产亚洲av麻豆色欲 | 久久综合88熟人妻| 亚洲乱码日产精品a级毛片久久 | 狼狼综合久久久久综合网| 久久国产亚洲精品无码| 办公室久久精品| 久久SE精品一区二区| 国产亚洲婷婷香蕉久久精品| 国内精品久久久久久不卡影院 | 久久婷婷午色综合夜啪| 欧美黑人激情性久久| 婷婷久久精品国产| 久久se精品一区精品二区| 国产精品美女久久福利网站| 国产亚洲婷婷香蕉久久精品| 亚洲精品无码久久不卡| 久久99国产精品久久| 亚洲精品国精品久久99热一| 品成人欧美大片久久国产欧美...| 久久亚洲熟女cc98cm| 国产一区二区精品久久岳| 精品久久久久中文字幕日本| 亚洲国产精品无码久久九九| 久久久综合九色合综国产| 日产精品久久久一区二区| 伊人久久五月天| 精品久久国产一区二区三区香蕉| 久久ZYZ资源站无码中文动漫 | 日产久久强奸免费的看| 国产精品久久99| 久久99精品久久久久婷婷| 久久久精品国产免大香伊 | 欧美黑人又粗又大久久久| 久久人人爽人人人人爽AV| 思思久久99热免费精品6| 青青草国产97免久久费观看| 国产亚洲美女精品久久久| 精品久久久无码中文字幕天天| 国产精品久久成人影院| 国产精品久久久久久福利漫画| 亚洲AV无码久久精品蜜桃|