在 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 PL/SQL:在 Oracle SQL Developer 中测试 SELECT FOR UPDATE