【问题标题】:Calling Oracle SP with TableAdapter very slow使用 TableAdapter 调用 Oracle SP 非常慢
【发布时间】:2008-12-09 15:00:56
【问题描述】:

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

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

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

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

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

感谢您的帮助!


在 google 中搜索,似乎问题出在 refcursor 上。其他人也面临同样的性能问题,但没有提供解决方案。

【问题讨论】:

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


    【解决方案1】:

    您使用哪个数据提供者?

    您是参考 System.Data.OracleClient 还是使用 odp.net(用于将 .NET 应用程序与 Oracle 连接的 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 数据库。

    【讨论】:

      【解决方案2】:

      使用数据读取器而不是 TableAdaptor 需要多长时间?我会尝试数据阅读器。我从未遇到过数据读取器的问题。

      【讨论】:

        【解决方案3】:

        确保将CommandType 设置为CommandType.StoredProcedure

        例如(来自MSDN):

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

        【讨论】:

          【解决方案4】:

          好的。我发现了问题所在。

          一开始我以为是DataProvided的问题,其实不是。我在 SQLServer 2000 中发现了同样的问题......

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

          问题的简要介绍是,当通过代码执行一个SP时,DBMS的执行计划有些问题,并且没有使用索引......

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

          希望对你有所帮助。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-12-14
            • 2017-06-08
            • 1970-01-01
            • 1970-01-01
            • 2016-05-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多