【问题标题】:Oracle Procedure runs slow in ASP but fast in TOADOracle 过程在 ASP 中运行缓慢,但在 TOAD 中运行很快
【发布时间】:2014-09-22 08:10:31
【问题描述】:

我在以下过程中遇到了这个问题。 当我在 TOAD for Oracle 中运行它时,它非常快。但是当它从我的asp应用程序中调用时,返回数据确实需要很长时间。

感谢任何帮助。

PROCEDURE Getdruminfo --get list of drums details
                     (
  Pvessel_id               Ccmsdba.Barcode.Vessel_id%TYPE,
  Pbarcode_status_id       CCMSDBA.BARCODE.BARCODE_STATUS_ID%TYPE,
  Pagingfrom               INTEGER,
  Pagingto                 INTEGER,
  Pdrum_type               VARCHAR2,
  Plocation_id             CCMSDBA.LOCATION.LOCATION_ID%TYPE,
  Pgroup_by                VARCHAR2,
  Sa_return            OUT Ref_cv_type
)
IS
BEGIN
  IF Pgroup_by IS NOT NULL
  THEN
     IF Pgroup_by = 'BARCODE_STATUS_ID'
     THEN
        BEGIN
           OPEN Sa_return FOR
                SELECT COUNT (*) AS COUNT,
                       Bdd.Aging_cat_min_days AS Aging,
                       Bdd.Status AS Category,
                       Bdd.Barcode_status_id AS Id
                  FROM Ccmsdba.Vw_barcode_drilldown_drum Bdd
                 WHERE Bdd.Location_id =
                          NVL (Plocation_id, Bdd.Location_id)
                       AND Bdd.Aging <= NVL (Pagingto, Bdd.Aging)
                       AND Bdd.Aging >= NVL (Pagingfrom, Bdd.Aging)
                       AND Bdd.Drum_type = NVL (Pdrum_type, Bdd.Drum_type)
                       AND Bdd.Barcode_status_id =
                              NVL (Pbarcode_status_id,
                                   Bdd.Barcode_status_id)
                       AND Bdd.Vessel_id = NVL (Pvessel_id, Bdd.Vessel_id)
              GROUP BY Bdd.Status,
                       Bdd.Aging_cat_min_days,
                       Bdd.Barcode_status_id
              ORDER BY Bdd.Aging_cat_min_days;
        END;

【问题讨论】:

  • 这可能是其中的一部分吗? stackoverflow.com/questions/3655399/…
  • @Kritner 谢谢。我去看看。
  • 您使用的是什么适配器?您没有使用 System.Data.OracleClient,是吗?
  • @Hambone 是的,我正在使用 System.Data.OracleClient 并且必须使用它。适配器是 OracleDataAdapter。
  • System.Data.OracleClient 有问题。切换到 ODP.net(或托管 ODP.net),我敢打赌你的问题会消失。

标签: asp.net oracle stored-procedures oracle10g package


【解决方案1】:

我知道这听起来过于简单化了,但您需要切换到非贬低的 Oracle 驱动程序。 System.Data.OracleClient 上次是用 .NET 2.0 打包的,甚至微软都说要使用 ODP.net。还有托管的 ODP.net 和 devArt dotConnect,不依赖本地 Oracle 客户端工作。

您可能认为这不会导致延迟,我承认我尚未设置和测试您的程序,但我可以与您分享这一经验。

大约在 2008 年左右,我们有一个简单的查询,它在 System.Data.OracleClient 和 ODP.net 上运行良好。但是,当我们在查询中添加一个参数(绑定变量)时,ODP.net 查询运行正常——眨眼间,微软版本却在“执行”(ExecuteDataReader)上出现了莫名其妙的 17 秒延迟阶段。当切换到文字时,一切都运行良好。

鼓励使用绑定变量,并且实际上应该有助于提高性能,但在这种情况下它会受到伤害。这没有任何意义。我们发现在其他情况下也是如此。并不总是 17 秒,但总是莫名其妙。

尝试改用 ODP.net,如果它不起作用,我会吃掉我的帽子。

您提到您必须使用 Microsoft 驱动程序...您能解释一下吗?

-- 编辑--

这是使用文字:

string sql = "insert into foo values ({0})";
OracleCommand cmd = new OracleCommand(String.Empty, connection);
foreach (string value in values)
{
    cmd.CommandText = string.Format(sql, value);
    cmd.ExecuteNonQuery();
}

您在查询中传递文字值,这反过来又成为每次对 Oracle 的新查询——它必须在执行之前对其进行解析和编译。

这是使用绑定变量:

OracleCommand cmd = new OracleCommand("insert into foo values (:BAR)",
    connection);
cmd.Parameters.Add(new OracleParameter("BAR", DbType.String));

foreach (string value in values)
{
    cmd.Parameters[0].Value = value;
    cmd.ExecuteNonQuery();
}

:BAR 是绑定变量。

语句被解析一次,编译一次,并以不同的值多次执行。它对共享池(以及因此该数据库的所有其他用户)更加高效和友好。

【讨论】:

  • 我的也是 17 秒。当它运行到 oracle 数据适配器并尝试用从 oracle 包过程返回的数据集填充它时。你是对的,这总是莫名其妙的。 “绑定变量”是什么意思?
  • 绑定变量的解释太长,无法在评论中发表——我编辑了这篇文章。当我使用绑定变量时,System.Data.OracleClient 会发疯。当我使用文字时,这很好(但它会破坏共享池并且通常是一种不好的做法)。切换到 Oracle 的 ODP.net 会有什么问题?
猜你喜欢
  • 1970-01-01
  • 2023-03-31
  • 2010-10-13
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 2019-11-18
  • 2012-04-27
相关资源
最近更新 更多