Хранимая процедура Oracle занимает гораздо больше времени в пользовательском интерфейсе MVC, чем в SQL Developer. - PullRequest
1 голос
/ 21 мая 2019

Итак, я пытаюсь реализовать вызов хранимой процедуры через мое веб-приложение ASP.Net MVC.Вызов хранимой процедуры не является проблемой.Когда я вручную запускаю процедуру в 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.Я не уверен, что именно мне не хватает, так как у меня есть два отдельных метода, которые делают то же самое без этой проблемы.

Редактировать: я вижу ту же проблему с другим вызовом хранимой процедуры, котораяраньше бегал очень быстро.Так что, похоже, это не единичный случай.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...