2014-09-30 40 views
1

我有一個oracle過程,將「table1 Partition(P1)」中的所有行插入到table2中。我更新了table2中的一個字段,然後將分區交換回table1:Oracle過程中分區交換後的Dbms_Stats.Gather_Table_Stats?

Alter Table table1 Exchange Partition P1 WITH TABLE table2 Including Indexes Without Validation; 

This works。

問題:我需要收集表格統計後?代碼:

EXECUTE Dbms_Stats.Gather_Table_Stats (Ownname => 'MySchema', Tabname => 'Table1', Partname 
=> 'P1, Granularity => 'ALL', Degree => 32); 

需要很長時間才能運行,還有一些其他問題涉及。

非常感謝,我一派,並不能找到一個明確的答案

  • 史蒂夫

Oracle數據庫11g企業版發佈11.2.0.3.0 - 64位生產

回答

2

當您運行exchange partition時,表的統計信息將成爲分區的統計信息,分區的統計信息將成爲表的統計信息,即統計信息也會被交換。

在這裏,我有三個分區的表和原來所有的統計數據有:

0:[email protected]> printStats -p location -- (*) 

Table_Name|object_Type |subobject |last_Analyzed|num_Rows|sample_Size| 
------------------------------------------------------------------------- 
LOCATION |Table   |   |06.04. 15:23 |  817|  817| 
LOCATION |TablePartition|PARTITION_1|06.04. 15:23 |  272|  272| 
LOCATION |TablePartition|PARTITION_2|06.04. 15:23 |  272|  272| 
LOCATION |TablePartition|PARTITION_3|06.04. 15:23 |  273|  273| 

現在換了一個分區和交換回來的:

0:[email protected]> create table xxx as select * from location where par_id=3; 
Table Xxx created. 
0:[email protected]> alter table location exchange partition partition_3 
       with table xxx; 
Table Location altered. 

和統計數據都消失了:

0:[email protected]> printStats -p location 

Table_Name|object_Type |subobject |last_Analyzed|num_Rows|sample_Size| 
------------------------------------------------------------------------- 
LOCATION |Table   |   |06.04. 15:23 |  817|  817| 
LOCATION |TablePartition|PARTITION_1|06.04. 15:23 |  272|  272| 
LOCATION |TablePartition|PARTITION_2|06.04. 15:23 |  272|  272| 
LOCATION |TablePartition|PARTITION_3|    |  |   | 

然而,當我分析的交換表 'XXX'

0:[email protected]> stats -gT xxx -- (*) 

和交換回來,我得到正確的統計再次

0:[email protected]> alter table location exchange partition partition_3 
       with table xxx; 
Table Location altered. 
0:[email protected]> printStats -p location 

Table_Name|object_Type |subobject |last_Analyzed|num_Rows|sample_Size| 
------------------------------------------------------------------------- 
LOCATION |Table   |   |06.04. 15:23 |  817|  817| 
LOCATION |TablePartition|PARTITION_1|06.04. 15:23 |  272|  272| 
LOCATION |TablePartition|PARTITION_2|06.04. 15:23 |  272|  272| 
LOCATION |TablePartition|PARTITION_3|02.10. 18:24 |  273|  273| 

(*)這些命令是由senora工具

+0

你好馬丁,感謝您的指導提供。每個分區都有數以百萬計的行,更新特定字段的邏輯相當複雜。處理分區大約需要10分鐘,數據的最終用戶擔心其可用性。所以... 1)使用「Insert into ... Select ...」插入記錄到Swap表中(連接到其他表...)2)將分區交換回源。我認爲收集統計信息的唯一原因是需要以某種方式「修改」已更改的數據。這就是我無法找到的研究結果... – Steve 2014-10-01 13:02:09

+0

另外,運行該進程的Oracle架構/用戶無權收集駐留在不同架構中的源表上的統計信息。我可以在源表模式中創建一個過程,並將執行授予PROCESS_USER模式,但我需要向數據庫管理員諮詢該權限。再次感謝 - 史蒂夫 – Steve 2014-10-01 13:03:48

+0

我只是跑了一個簡短的測試,發現我的答案是不正確的。我會相應地更新我的答案。 – 2014-10-02 16:28:27