Запрос выполняется значительно медленнее при выполнении из веб-приложения ASP.NET MVC по сравнению с непосредственным выC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Запрос выполняется значительно медленнее при выполнении из веб-приложения ASP.NET MVC по сравнению с непосредственным вы

Сообщение Anonymous »

У меня возникла заметная проблема с производительностью SQL-запроса, когда он выполняется из веб-приложения ASP.NET MVC, по сравнению с запуском его непосредственно в базе данных.
Предполагается, что запрос для извлечения примерно 40 000 строк, а при запуске непосредственно в базе данных он выполняется примерно за 5 секунд.
Однако, когда тот же запрос выполняется из моего веб-приложения с использованием следующей функции C#, это занимает около 23 секунд.
Почему такая большая разница?
Шаги уже предприняты:
  • Проверка запроса. Я проверил журнал запросов, чтобы убедиться, что веб-приложение отправляет запрос правильно, включая согласованность типов данных, и все отображается так, как ожидалось.
    < li>Преобразование данных: чтобы определить, замедляет ли преобразование данных работу, я изменил функцию для преобразования всех столбцов непосредственно в строки, минуя какие-либо специальные проверки для столбцов даты/времени, такие как ek_start_datetime. Это изменение улучшило производительность всего примерно на 1,5 секунды.

Код: Выделить всё

public static List GetData(List columns, string query)
{
List data = new List();

using (SqlConnection con = new SqlConnection(CS))
{
SqlCommand cmd2 = new SqlCommand(query, con);
cmd2.CommandType = CommandType.Text;
cmd2.CommandTimeout = 200;

con.Open();

SqlDataReader rdr = cmd2.ExecuteReader();

while (rdr.Read())
{
Dictionary dict = new Dictionary();

foreach (string column in columns)
{
if (rdr[column] == null)
{
dict.Add(column, "");
}
else if (column.Contains("ek_start_datetime"))
{
dict.Add(column, ((DateTime)rdr[column]).ToString("yyyy-MM-dd HH:mm:ss.fff"));
}
else if (column.Contains("_startdatetime") && DateTime.TryParse(Convert.ToString(rdr[column]), out DateTime res))
{
dict.Add(column, ((DateTime)rdr[column]).ToString("yyyy-MM-dd HH:mm:ss.fff"));
}
else if (column.Contains("_datetime") && DateTime.TryParse(Convert.ToString(rdr[column]), out DateTime res2))
{
dict.Add(column, ((DateTime)rdr[column]).ToString("yyyy-MM-dd HH:mm:ss.fff"));
}
else if (column.Contains("_date") && DateTime.TryParse(Convert.ToString(rdr[column]), out DateTime result))
{
dict.Add(column, result.ToString("yyyy-MM-dd"));
}
else
{
dict.Add(column, Convert.ToString(rdr[column]));
}
}

data.Add(dict);
}
}

return data;
}
Изменить
Отправленный мной запрос представляет собой строку с глобальным макетом:

Код: Выделить всё

SELECT
tv.column1,
tv.column2,
-- ...
tv.column80,
FROM
table1 tv
WHERE
tv.actual_flag = CAST(1 AS INT)
AND tv.theme = CAST("theme1" AS varchar(10))
AND tv.year as CAST(2024 AS INT)
Когда я выполняю этот же запрос в SSMS и смотрю на план запроса, он правильно оптимизирован

Подробнее здесь: https://stackoverflow.com/questions/784 ... -web-app-c
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»