Запрос занимает 1,5 секунды в SSMS, но время ожидания при запуске из приложения Windows .NET? - PullRequest
1 голос
/ 28 марта 2011

У меня есть запрос, который истекает при запуске из приложения Windows.Однако он работает нормально, менее чем за 2 секунды, когда я запускаю его непосредственно в SSMS.Все остальные запросы нормально работают в приложении.Я также запустил профилировщик и подтвердил, что приложение действительно выполняет запрос, который я ожидаю (когда я беру код, который показывает профилировщик, был запущен приложением и запускаю его в SSMS, это занимает менее 2 секунд).

Длительные запросы не прерываются в приложении.

Что происходит?

    string result = dbHelper.GetTypedDataTable(dtMyProjects, "sp_get_DashboardPMMyProjects", MyUtility.DWConnection, new string[] { "'" + shortNTID + "'" });

    static public string GetTypedDataTable(DataTable dt, string sSPName, string connectionName, string[] arrayParameters)
    {
        if (connectionName == "default")
        {
            SetUpConnection(sSPName, "sqlConn.ConnectionString", "SP");
        }
        else
        {
            SetUpConnection(sSPName, connectionName, "SP");
        }

        cmdSELECT.CommandText += " " + arrayParameters[0].ToString();

        int countParameters = arrayParameters.Length;

        for (int i = 1; i < countParameters; i++)
        {
            cmdSELECT.CommandText += ", " + arrayParameters[i].ToString();
        }

        return FillDataTable(dt);
    }

    private static void SetUpConnection(string sSPName, string connectionName, string sqlType)
    {
        //sqlConn.ConnectionString = ((string)(configurationAppSettings.GetValue("sqlConn.ConnectionString", typeof(string))));

        sqlConn.ConnectionString = ((string)(configurationAppSettings.GetValue(connectionName, typeof(string))));
        daHlpr.SelectCommand = cmdSELECT;
        cmdSELECT.Connection = sqlConn;

        if (sqlType == "SP")
        {
            cmdSELECT.CommandText = "EXEC " + sSPName;
        }
        else
        {
            cmdSELECT.CommandText = sSPName;
        }
    }

    private static string FillDataTable(DataTable dt)
    {
        try
        {
            daHlpr.SelectCommand.CommandTimeout = 60;
            daHlpr.Fill(0, 1000000000, dt);
        }
        catch (Exception ex)
        {
            return ex.Message.ToString();
        }
        return dt.Rows.Count.ToString(); //return the count of rows in the table being returned
    }

Ответы [ 4 ]

4 голосов
/ 28 марта 2011

В наши дни две секунды - это довольно много времени, поэтому требуется достаточное количество обработки.

Если вы используете хранимую процедуру, вам может потребоваться отключить анализ параметров.

В основном, сохраняйте каждый параметр SP во вновь созданной переменной сразу после выполнения SP. Вот ссылка с более подробной информацией:

http://sqlserverperformance.wordpress.com/2007/06/07/how-to-disable-parameter-sniffing-in-sql-server-2005/

Кроме того, хотя это может показаться очевидным, иногда это легко забыть. Эти проблемы могут испаряться при перезагрузке Dev Machine, перезапуске Sql Server Service или перезагрузке Sql Server Machine.

2 голосов
/ 28 марта 2011

попробуйте сбросить и заново создать хранимую процедуру.

Мой аналогичный пост

1 голос
/ 29 марта 2011

SQL Server работал с максимальной оперативной памятью, и с каждым днем ​​все больше и больше запросов выполнялось вечно. В конце концов никто не будет работать. Переработал SQL Server, чтобы восстановить память, и теперь мне придется диагностировать, почему он использовал так много оперативной памяти. Спасибо всем!

1 голос
/ 28 марта 2011

Вы правильно выполняете команду чтения или не чтения? Такая простая опечатка может привести к тайм-ауту ожидания ответа на запрос вставки или обновления. Некоторый код может также помочь найти проблему.

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