我有一个在sql编辑器(oracle)中执行时运行速度超快的查询:1ms。
由DataSet-TableAdapter执行时,相同的查询(作为存储过程)需要2秒。我只是检索了20个。
由于我使用的是TableAdapter,因此返回值存储在引用游标中。
如果我正在获取2,000行,我可以理解构建DataSet需要一些时间,但对于我来说只有20行的2秒似乎太多了。
有一种更好的方法在oracle上执行SP或者这是唯一的方法吗? 我可以尝试做些什么来提高表现?
感谢您的帮助!
在谷歌搜索,似乎问题在于refcursor。其他人遇到了相同的性能问题,但没有提供解决方案。
答案 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
我希望这会对你有所帮助。