2010-12-08 226 views
1

我有一个SQL查询(一个连接),它在Oracle SQL Developer(毫秒)上运行时速度超快,而在相同查询时速度超慢(分钟)从使用ODP.net的ac#应用程序调用。对OracleDataAdapter.Fill(数据表)的调用只是等待oracle。 奇怪的是之前的连接在c#中也是超快的。在oracle sql developer中加入查询速度很快,在odp.net中速度很慢

查询:

select t1.col2, t1.col3 from table_1 t1 where exists (select t2.col2, t2.col3 from table_2 t2 where t1.col2 = t2.col2 and t1.col3 = t2.col3) 

经过一番调查后,我意识到做出的唯一改变是增加了现有的时间戳列作为两个TABLE_1和TABLE_2主键的一部分。

基本上TABLE_1的PK看起来像这样(Col_TS加入PK):

Col1 (varchar2), Col2 (varchar2), Col3 (number), Col4 (number), Col_TS (timestamp) 

而且TABLE_2的PK(Col_TS加入PK):

Col1 (varchar2), Col2 (varchar2), Col3 (number), Col_TS (timestamp) 

但事实是,我根本没有在我的连接中使用timestamp列:我只是将table_1 Col2连接到table_2 Col2和table_1 Col3连接到table_3 Col3。为什么添加时间戳作为PK的一部分会影响来自C#的查询调用?

其他注意事项:两个表的唯一索引是PK。我应该为时间戳列添加一个索引吗?运行Oracle 10g,.Net 4.

对此问题的任何深入了解都非常感谢。

回答

1

SQL Developer仅显示前50条记录(默认选项),您感兴趣的数据集足够大,可能会导致.Fill(数据集)更长的时间。 你能看到有多大是通过运行

select count(1) from table_2 t2 where t1.col2 = t2.col2 and t1.col3 = t2.col3) 
+0

这是几千行。但是正如我所说的那样,在添加时间戳作为PK之前,速度很快,之后又很慢。 – cks 2010-12-08 15:24:43

0

我曾与慢OracleDataAdapter.Fill()运行的问题和更大的值设置为OracleCommand.FetchSize帮助解决他们的数据集(至少减少执行的时间)。

See details here

相关问题