2011-04-18 156 views
2

嘗試執行此SQL:的Oracle 10g:查詢從ALL_TAB_COLUMNS鑑於DATA_DEFAULT列需要很長的時間

select OWNER,TABLE_NAME,COLUMN_NAME,DATA_TYPE, 
     DATA_LENGTH,DATA_PRECISION,DATA_SCALE,NULLABLE 
from all_tab_columns 
where owner = 'USER'; 

您需要修改所有者字符串的where子句。執行後,您可能會注意到它運行並不需要很長時間。現在像這樣添加DATA_DEFAULT列:

select OWNER,TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH, 
     DATA_PRECISION,DATA_SCALE,NULLABLE,DATA_DEFAULT 
from all_tab_columns 
where owner = 'USER'; 

這需要永遠。怎麼了DATA_DEFAULT列?

回答

4

我不會在11.2數據庫中發現這種情況,但我會想象它可能很慢的原因是DATA_DEFAULT是一個LONG列。只是一個猜測。

+0

我的測試也導致了這種假設。我剛剛通過創建一個包含288條記錄的表來玩這個遊戲。它有一個VARCHAR2(10)和一個LONG。當我選擇返回VARCHAR2時,花費了0.140秒。但是,當我在選擇中包含LONG列時,需要8.737秒來返回288條記錄。 – oscilatingcretin 2011-08-20 22:36:36

0

有和無專欄的解釋計劃有任何顯着差異嗎? (您可能需要一些額外的權限才能在此視圖上運行解釋計劃。)估計的行數是否在實際行數的大約一個數量級的範圍內?

數據字典對象需要像所有其他對象一樣好的統計信息,但人們往往會忘記它們。

運行一個像這樣的查詢來查看統計信息上次收集的時間。查詢包括ALL_TAB_COLUMNS使用的一些但不是全部的表。如果LAST_ANALYZED爲空或很老了,這是一個不好的兆頭:

select last_analyzed, dba_tables.* 
from dba_tables 
where table_name in ('OBJ$', 'USER$', 'TAB$', 'COL$'); 

而且,託尼·安德魯斯指出,多頭可能會導致一些問題。但是DATA_DEFAULT是那些幾乎總是非常小或爲空的LONG中的一個。這使我 認爲它可能是您的客戶端而不是服務器的問題。嘗試使用不同的工具運行查詢,例如SQL * Plus,SQL Developer等。

+0

我正在使用底層Golden32,但是當我在C#中使用OracleCommand和OracleDataReader對象執行查詢時,它也運行緩慢。這不是一個展示塞或任何東西,但我一定想知道爲什麼它如此緩慢。 – oscilatingcretin 2011-04-20 17:24:37