Предполагается, что запрос для извлечения примерно 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)
Подробнее здесь: https://stackoverflow.com/questions/784 ... -web-app-c