2010-10-21 59 views
2

我們有一個Oracle 9i數據庫,每個數據庫有7個表,每個表有15 +百萬條記錄。表格之間沒有關係,即沒有外鍵。我們如何優化oracle數據庫?

這裏是表

CREATE TABLE GSS.SHOWPD 
(
    INSERVID   VARCHAR2(7 CHAR)   NOT NULL, 
    CAGEPOS   VARCHAR2(8 CHAR)   DEFAULT NULL, 
    DETAILEDSTATE  VARCHAR2(100 CHAR)   DEFAULT NULL, 
    FAILEDMB   NUMBER      DEFAULT NULL, 
    FREECHUNK   NUMBER      DEFAULT NULL, 
    FREEMB   NUMBER      DEFAULT NULL, 
    FWREV    VARCHAR2(100 CHAR)   DEFAULT NULL, 
    FWSTATUS   VARCHAR2(100 CHAR)   DEFAULT NULL, 
    AID    NUMBER      DEFAULT NULL, 
    LDA    VARCHAR2(100 CHAR)   DEFAULT NULL, 
    MANUF    VARCHAR2(100 CHAR)   DEFAULT NULL, 
    AMODEL   VARCHAR2(4000 CHAR)   DEFAULT NULL, 
    NODEWWN   VARCHAR2(64 CHAR)   DEFAULT NULL, 
    NRMUNUSEDFAIL  VARCHAR2(100 CHAR)   DEFAULT NULL, 
    NRMUNUSEDFREE  VARCHAR2(100 CHAR)   DEFAULT NULL, 
    NRMUNUSEDUNAVAIL VARCHAR2(100 CHAR)   DEFAULT NULL, 
    NRMUSEDFAIL  VARCHAR2(100 CHAR)   DEFAULT NULL, 
    NRMUSEDOK   VARCHAR2(100 CHAR)   DEFAULT NULL, 
    AORDER   VARCHAR2(100 CHAR)   DEFAULT NULL, 
    PATHA0   VARCHAR2(100 CHAR)   DEFAULT NULL, 
    PATHA1   VARCHAR2(100 CHAR)   DEFAULT NULL, 
    PATHB0   VARCHAR2(100 CHAR)   DEFAULT NULL, 
    PATHB1   VARCHAR2(100 CHAR)   DEFAULT NULL, 
    PORTA0   VARCHAR2(100 CHAR)   DEFAULT NULL, 
    PORTA1   VARCHAR2(100 CHAR)   DEFAULT NULL, 
    PORTB0   VARCHAR2(100 CHAR)   DEFAULT NULL, 
    PORTB1   VARCHAR2(100 CHAR)   DEFAULT NULL, 
    RDCERR   VARCHAR2(100 CHAR)   DEFAULT NULL, 
    REUERR   VARCHAR2(100 CHAR)   DEFAULT NULL, 
    SERIAL   VARCHAR2(100 CHAR)   DEFAULT NULL, 
    SIZEMB   NUMBER      DEFAULT NULL, 
    SPARECHUNK  VARCHAR2(100 CHAR)   DEFAULT NULL, 
    SPAREMB   NUMBER      DEFAULT NULL, 
    SPEEDKRPM   VARCHAR2(100 CHAR)   DEFAULT NULL, 
    SPRUNUSEDFAIL  VARCHAR2(100 CHAR)   DEFAULT NULL, 
    SPRUNUSEDFREE  VARCHAR2(100 CHAR)   DEFAULT NULL, 
    SPRUNUSEDUNINIT VARCHAR2(100 CHAR)   DEFAULT NULL, 
    SPRUSEDFAIL  VARCHAR2(100 CHAR)   DEFAULT NULL, 
    SPRUNUSEDOK  VARCHAR2(100 CHAR)   DEFAULT NULL, 
    STATE    VARCHAR2(100 CHAR)   DEFAULT NULL, 
    TEMPDEGC   NUMBER      DEFAULT NULL, 
    TOTALCHUNK  VARCHAR2(100 CHAR)   DEFAULT NULL, 
    ATYPE    VARCHAR2(100 CHAR)   DEFAULT NULL, 
    UNAVAILABLEMB  NUMBER      DEFAULT NULL, 
    VOLUMEMB   NUMBER      DEFAULT NULL, 
    WRCERR   VARCHAR2(100 CHAR)   DEFAULT NULL, 
    WRUERR   VARCHAR2(100 CHAR)   DEFAULT NULL, 
    COMMANDTIMESTAMP TIMESTAMP(6)    DEFAULT NULL NOT NULL, 
    FETCHTIMESTAMP TIMESTAMP(6)    DEFAULT NULL NOT NULL 
) 

注意INSERVID可以是1400種類型之一的一個的例子。因此,可以將每個專用於一個inserv的1400個表分配給不同的服務器。這會是一個瘋狂的事情嗎?我在想。

我們遍歷inservs的no並運行我們所有的查詢。目前我們正在清除數據,所以我們不希望超過1500萬條記錄。

1)我們有不同的查詢,所以它需要全表掃描。 Oracle執行計劃顯示我們正在進行相當全面的表掃描。

select distinct(inservid),commandtimestamp from statpd order by commandtimestamp desc; 

PLAN_TABLE_OUTPUT 
-------------------------------------------------------------------- 
| Id | Operation   | Name  | Rows | Bytes | Cost | 
-------------------------------------------------------------------- 
| 0 | SELECT STATEMENT  |    | 665 | 13300 | 79488 | 
| 1 | SORT UNIQUE   |    | 665 | 13300 | 69088 | 
| 2 | TABLE ACCESS FULL | STATPD  | 4128K| 78M| 19406 | 
-------------------------------------------------------------------- 
Note: cpu costing is off 
10 rows selected. 

2)每個表都有一個inserv id索引。它有助於降低查詢成本,我們可以做甚麼?任何提示/技巧,讓事情變得更快?

3)如果我們將針對每個表運行的sql查詢作爲針對每個表運行的並行腳本運行,是否有意義?這會導致更快完成?

4)我們有足夠的內存來加載整個數據庫。用ORACLE可以做到嗎?

由於提前

+1

我不認爲獨立會導致全表掃描。 – BlackICE 2010-10-21 12:02:04

+0

@David發佈執行計劃輸出以便更好地理解 – 2010-10-21 12:04:12

+0

@David請查看執行計劃輸出以瞭解更多 – 2010-10-21 12:05:48

回答

5

1-2)具有上(inservid,commandtimestamp)的索引將與(FAST)FULL INDEX SCAN取代全表掃描,因爲兩列中的一個是NOT NULL(因此DB可以使用索引而不是表格)。這應該比全表掃描更快,但是所有15+行記錄都將被讀取。

您可以通過預先計算的表(例如快速刷新實體化視圖)獲得更快的響應時間,在這種情況下,您可能會在表上執行DML操作時的性能問題(插入/更新/刪除操作會更慢)

3)查詢並行運行會爲您帶來一些好處,如果您還有一些IO帶寬。現在你的全表掃描可能會從磁盤讀取很多行。除非您的表格駐留在物理上分離的設備上,否則並行獲得的收益會很小。 4)RAM中的加載主要是在Oracle中自動完成的:即在大多數情況下,Oracle在將經常訪問的數據放在內存中做得很好。

+0

在(inservid,commandtimestamp)上有一個索引實際上使我們的經驗在執行計劃中增加了成本 – 2010-10-21 12:20:54

+0

感謝您的額外輸入......需要探索它們:)謝謝 – 2010-10-21 12:25:43

+0

@Ankur Gupta:創建索引,分析表和索引,並測量哪一個是最快的(運行查詢兩次,一次使用完整掃描,另一次使用索引路徑,您可能需要提示查詢強制數據庫使用全面掃描)。這種方法比比較優化器成本更可靠。 – 2010-10-21 12:25:58

2

第4部分,這通常不是必需的。在9i中,您可以設置一個特殊的「保持」緩衝池,以便將索引保存在內存中。 (但是由於目前沒有Oracle提供支持,現在可能不是開始嘗試使用迄今尚未使用的功能的好時機)

您的客戶是否在本地計算機上,如果不是客戶可能會從中受益11g特性將客戶端(側」的結果高速緩存,減少數據庫服務器往返。

Excerpt from Oracle® Database Performance Tuning Guide 11g Release 2 (11.2) Part Number E16638-03

7.6.2.1客戶端結果緩存的工作原理 客戶端結果緩存存儲的最外層查詢的結果,這是由OCI應用程序定義的列。子查詢和查詢塊不被高速緩存。

圖7-4顯示了一個包含數據庫登錄會話的客戶端進程。此客戶端進程在客戶端進程中運行的多個應用程序會話中共享一個客戶端結果緩存。如果第一個應用程序會話運行一個查詢,它將從數據庫中檢索行並將它們緩存在客戶端結果緩存中。如果其他應用程序會話運行相同的查詢,那麼它們還會從客戶端結果緩存中檢索行。

alt text

+0

我們使用9i,並且我們無法升級到10/11 ...必須保持這一點。 – 2010-10-21 12:29:51

+0

Oracle 9i第2版(9.2.0)擴展支持完:2010年7月30日...(或者它們擴展了嗎?) – oluies 2010-10-21 12:34:03

+0

點是我們不能購買10/11,所以我們留下這個。 – 2010-10-21 12:39:16

1

由1),4)我同意文森特。

由2)你有很長的行 - 所以它可能是一個更大的db_block_size - 16Kb或32Kb ,它可能是值得嘗試在你的表上的壓縮。還要檢查你的db_file_multiblock_read_count。可能是它的一部分 - 分佈在儘可能多的硬盤上。 3)你可以玩平行提示,看看它會是怎樣的。

+0

感謝2)會投入時間瞭解我如何做到這一點,並看看它如何提高我的執行速度...謝謝... – 2010-10-21 12:32:47

0

您的數據模型中斷。你能提供關於你運行的查詢的更多細節嗎?添加索引只會幫助你點。