Oracle Procedure在ASP中运行缓慢但在TOAD中运行速度很快

时间:2014-07-30 15:35:17

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

我遇到了以下程序的问题。 当我在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;

1 个答案:

答案 0 :(得分:0)

我知道这听起来过于简单化,但您需要切换到未经过删除的Oracle驱动程序。 System.Data.OracleClient最后使用.NET 2.0打包,甚至微软也说使用ODP.net。还有管理的ODP.net和devArt dotConnect,不依赖本地Oracle客户端工作。

您可能认为这不会导致延误,我承认我没有设置和测试您的程序,但我可以与您分享这些经验。

大约2008年左右,我们有一个简单的查询,它与System.Data.OracleClient和ODP.net都运行良好。但是,当我们向查询添加一个参数(绑定变量)时,ODP.net查询正常运行 - 眨眼之间,但是Microsoft版本在&#34;执行&#上有一个莫名的17秒延迟34; (ExecuteDataReader)阶段。当切换到文字时,一切都运行良好。

鼓励绑定变量并且实际上应该有助于提高性能,但在这种情况下会受到影响。没有意义。我们发现在其他情况下这是真的。它并不总是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是绑定变量。

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