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

Posted

技术标签:

【中文标题】在 oracle sql developer 中加入查询快,在 odp.net 中超慢【英文标题】:Join query fast in oracle sql developer, super slow in odp.net 【发布时间】:2010-12-08 14:56:36 【问题描述】:

我有一个 sql 查询(连接),在 Oracle SQL Developer 上运行时超快(毫秒),但在使用 ODP.net 从 c# 应用程序调用相同查询时超慢(分钟)。对 OracleDataAdapter.Fill(data table) 的调用只是等待 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 基本上是这样的(在 PK 中添加了 Col_TS):

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)

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

附加说明:两个表的唯一索引是 PK。我应该为时间戳列添加索引吗?运行 Oracle 10g、.Net 4。

非常感谢您对此问题的任何见解。

【问题讨论】:

【参考方案1】:

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

来查看数据集有多大吗?
select count(1) from table_2 t2 where t1.col2 = t2.col2 and t1.col3 = t2.col3)

【讨论】:

几千行。但正如我所说,在添加时间戳作为 PK 之前它很快,之后就很慢。 但是如果你把整个数据集拿回来,在 SQL Developer 中会不会很快?【参考方案2】:

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

See details here.

【讨论】:

以上是关于在 oracle sql developer 中加入查询快,在 odp.net 中超慢的主要内容,如果未能解决你的问题,请参考以下文章

oracle sql developer工具 如何给用户分配权限

Oracle SQL Developer 连接 MySQL

ORACLE PL/SQL:在 Oracle SQL Developer 中测试 SELECT FOR UPDATE

如何在oracle的sql语句中加入判断条件

pl/sql developer中文乱码,为啥呢?怎么解决?Oracle问题

pl/sql developer中文乱码,为啥呢?怎么解决?Oracle问题