我遇到了以下程序的问题。 当我在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;
答案 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
是绑定变量。
语句被解析一次,编译一次并使用不同的值执行多次。它对共享池(以及该数据库的所有其他用户)更有效,更友好。