длительная процедура sql зависает на сайте

У меня есть веб-приложение MVC 4, которое вызывает бизнес-уровень, который асинхронно вызывает метод уровня данных ExecuteSP. Метод уровня данных ExecuteSP вызывает долго выполняющуюся хранимую процедуру следующим образом:

public class MainDataLayer
{
    private Database database;  //Enterprise library 5 
    private DbCommand dbc;
    private List<SPParams> spParams;

    public MainDataLayer()
    {
        _database = DatabaseFactory.CreateDatabase("strConn");

        //set multiple sp params like the one below
         _spParams.Add(new SPParams() { ParamName = "@pID", ParamValue = ID }); 
    }

    public DataSet ExecuteSP()
    {

        dbc = database.GetStoredProcCommand('long_running_sp');
        dbc.CommandTimeout = 300;

        foreach (SPParams p in spParams)
        {
            dbc.Parameters.Add(new SqlParameter(p.ParamName, p.ParamValue));
        }

        DataSet ds = _database.ExecuteDataSet(dbc);

        return ds;
}
}


//this class is used in the class above for setting the sp parameters
public class SPParams
{
    public string ParamName { get; set; }
    public object ParamValue { get; set; }

}

Длительная хранимая процедура имеет несколько вставок и несколько обновлений, а также последний вызов тайм-аута, как показано ниже, для имитации длительного процесса.

WAITFOR DELAY '0:02:00'

Проблема заключается в том, когда я вызываю эту хранимую процедуру через мое веб-приложение, развернутое на моем тестовом сервере с клиентского компьютера A, все дальнейшие вызовы от того же клиента или любого другого пользователя, вызывающего веб-страницу, зависают до 2 минут. в хранимой процедуре. Когда я запускаю хранимую процедуру непосредственно из студии управления sql и параллельно запускаю другую инструкцию sql, выполнение хранимой процедуры занимает 2 минуты, а другая инструкция sql выполняется немедленно. Не похоже, что на стороне базы данных есть что-то, что мне нужно изменить. В чем может быть проблема с моим кодом?

Спасибо


person user20358    schedule 14.05.2013    source источник
comment
Вместо этого использовать AsyncController? Вы также можете проверить его статус во время выполнения, используя что-то вроде этого: stackoverflow.com/questions/2927284/   -  person Brad Christie    schedule 14.05.2013
comment
Похоже, что sql-сервер использует разные планы выполнения, когда вы запускаете запрос напрямую, а не при вызове с веб-сайта, вам может потребоваться немного покопаться с профилировщиком, чтобы увидеть фактически сгенерированные запросы, и использовать что-то вроде OPTION FORCE ORDER для принудительного выполнения определенного план выполнения, кроме того, я думаю, что проблема заключается в коде sql, а не в вызывающем его .net-коде   -  person DrCopyPaste    schedule 14.05.2013
comment
Трудно комментировать, почему, основываясь на этом, но я подозреваю, что у вас плохая индексация. Посмотрите план запроса, исправьте хранимую процедуру   -  person gbn    schedule 14.05.2013
comment
Привет gbn, если бы индексация была плохой, это должно было бы иметь тот же эффект при запуске со стороны клиента sql, верно? Там второй sql в другом окне выполняется быстро, не дожидаясь завершения длительного sql в первом окне...   -  person user20358    schedule 14.05.2013
comment
Привет, Брэд. Я использую .net 4.0   -  person user20358    schedule 15.05.2013
comment
если бы индексация была плохой, это должно было бы иметь тот же эффект при запуске со стороны клиента sql, верно? НЕТ! sql-сервер сам попытается определить наиболее эффективный план выполнения в зависимости от используемых данных, поэтому вам следует взглянуть на фактические запросы, выполняемые в профилировщике, а затем попробовать что-то вроде FORCE ORDER, чтобы обеспечить выполнение того, что, по вашему мнению, происходит. уже ;)   -  person DrCopyPaste    schedule 15.05.2013
comment
о, хорошо .. попробую :) спасибо, Док.   -  person user20358    schedule 15.05.2013