因此,我正在尝试通过ASP.Net MVC Web应用程序实现对存储过程的调用。调用存储过程不是问题。当我在SQL Developer中手动运行该过程时,大约需要15秒,但是,在我的应用程序后端调用它会产生截然不同的结果。甚至更小的数据集也可能花费大约20分钟。
我尝试了以下两个c#示例的少数排列,但是没有运气;以及尝试在过程中设置局部变量,并在整个脚本中使用该局部变量而不是参数。 (可能值得注意的是,我在代码的不同部分还有其他两个操作,它们或多或少是这些示例的镜像)。
using (var context = new DbContext())
{
var connStr = context.Database.Connection.ConnectionString;
using (var conn = new OracleConnection(connStr))
{
conn.Open();
var cmd = conn.CreateCommand();
cmd.CommandText = "PROCEDURE_NAME";
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(":in_val", OracleDbType.Int32, val, ParameterDirection.Input); // val is an int that is passed to the method
cmd.ExecuteNonQuery();
conn.Close();
}
}
和
var in_val = new OracleParameter("in_val", OracleDbType.Long, val, ParameterDirection.Input);
context.Database.SqlQuery<object>("BEGIN PROCEDURE_NAME(:in_val); end;", in_val);
这是存储过程(已编辑空格):
create or replace PROCEDURE PROCEDURE_NAME (in_val IN NUMBER)
IS
BEGIN
DELETE FROM "SOME_TABLE"
WHERE CAST_RUN_ID = in_val;
INSERT INTO "SOME_TABLE"
("col1",
"col2",
"col3")
SELECT distinct
sot."col1",
sot."col2",
sot."col3"
FROM SOME_OTHER_TABLE sot
WHERE sot.col1 = in_val AND sot.col4 IN
(SELECT col4 FROM (
SELECT sot1.*
FROM SOME_OTHER_TABLE sot1
WHERE sot1.col3 =
(SELECT MAX(sot2.col3) KEEP (DENSE_RANK FIRST ORDER BY col2 DESC NULLS LAST)
FROM SOME_OTHER_TABLE sot2
WHERE sot2.col1 = sot1.col1)));
end;
长或短的地方是该过程对数据进行分组并从每个组中获取少量行。我并不完全相信问题出在存储过程中,因为它在SQL Developer中表现得非常好。我不确定我到底缺少什么,因为我有两个单独的方法可以在没有出现此问题的情况下执行相同的操作。
编辑:我看到相同的问题是对以前运行非常快的存储过程的不同调用。因此,这似乎不是一个孤立的事件。