使用TableAdapter调用Oracle SP非常慢

时间:2008-12-09 15:00:57

标签: .net oracle strongly-typed-dataset tableadapter

我有一个在sql编辑器(oracle)中执行时运行速度超快的查询:1ms。

由DataSet-TableAdapter执行时,相同的查询(作为存储过程)需要2秒。我只是检索了20个。

由于我使用的是TableAdapter,因此返回值存储在引用游标中。

如果我正在获取2,000行,我可以理解构建DataSet需要一些时间,但对于我来说只有20行的2秒似乎太多了。

有一种更好的方法在oracle上执行SP或者这是唯一的方法吗? 我可以尝试做些什么来提高表现?

感谢您的帮助!


在谷歌搜索,似乎问题在于refcursor。其他人遇到了相同的性能问题,但没有提供解决方案。

4 个答案:

答案 0 :(得分:2)

您使用哪种数据提供商?

您是引用System.Data.OracleClient还是使用odp.net(Oracle的数据提供程序将.NET应用程序与Oracle连接),还是使用devart(以前称为corelab)提供程序。

我与odp.net结合Oracle 9有很好的经验。您可以在oracle网站上免费下载odp.net。请参阅:http://www.oracle.com/technology/tech/windows/odpnet/index.html

您可以使用最新版本(11.1.0.6.20)连接到Oracle 9数据库。

答案 1 :(得分:0)

使用datareader而不是TableAdapter需要多长时间?我会试试datareader。我从未遇到过datareader的问题。

答案 2 :(得分:0)

确保您将CommandType设置为CommandType.StoredProcedure

例如(来自MSDN):

OracleCommand cmd = new OracleCommand();
cmd.Connection = conn;
cmd.CommandText = "COUNT_JOB_HISTORY";
cmd.CommandType = CommandType.StoredProcedure;

答案 3 :(得分:0)

确定。我发现了什么问题。

一开始我认为这是DataProvided的问题,但它不是。我在SQLServer 2000中发现了同样的问题......

在谷歌搜索我发现了一些关于执行计划的内容。通过这种方式,我提高了50%的查询性能。

问题的简要回顾是,当通过代码执行SP时,DBMS在执行计划方面存在一些问题,并且不使用索引......

这篇文章中有一个更好的答案: Parameter Sniffing (or Spoofing) in SQL Server

我希望这会对你有所帮助。