2011-04-18 157 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