在oracle sql developer中快速加入查询,在odp.net中超级慢

时间:2010-12-08 14:56:37

标签: c# oracle odp.net

我有一个sql查询(一个连接),当在Oracle SQL Developer上运行时超快(毫秒)但超慢(分钟),当使用ODP.net从c#app调用相同的查询时。对OracleDataAdapter.Fill(数据表)的调用只是等待oracle。 奇怪的是,以前在c#中加入的速度非常快。

查询:

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。

非常感谢对这个问题的任何见解。

2 个答案:

答案 0 :(得分:1)

SQL Developer仅显示前50条记录(默认选项),您感兴趣的数据集足够大,这可能是.Fill(数据集)的较长时间的原因。 你能看到运行

的数据集有多大
select count(1) from table_2 t2 where t1.col2 = t2.col2 and t1.col3 = t2.col3)

答案 1 :(得分:0)

我遇到了慢OracleDataAdapter.Fill()运行的问题,并将更大的值设置为OracleCommand.FetchSize有助于解决它们(至少减少了执行时间)。

See details here