Member 13165845 Ответов: 6

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


Здравствуйте Друзья,

В настоящее время я сталкиваюсь с проблемой загрузки таблицы данных.Мой запрос выполняется быстро ,но возвращает 50000 записей, и когда я отслеживаю свой код, он показывает, что заполнение таблицы данных занимает много времени.Я хочу хранить свои данные в Datatable и хочу экспортировать их в Excel, но это занимает слишком много времени. Пожалуйста, запросите, есть ли у кого - нибудь лучшее решение.

Примечание : Я беру столько данных, потому что они нужны клиенту в excel.

Спасибо,
Чинтан Рана

Что я уже пробовал:

Мой код, как показано ниже
-----------------
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "sp_web_reports";
cmd.Parameters.AddWithValue("@mode", 50);
cmd.Parameters.AddWithValue("@From_Date", Convert.ToDateTime(txt_from_date.Text));
cmd.Parameters.AddWithValue("@TO_Date", Convert.ToDateTime(txt_to_date.Text));
cmd.Parameters.AddWithValue("@GroupCode", drp_vehicle_group.SelectedValue);
conn.Open();
cmd.Connection = conn;
cmd.CommandTimeout = 0;
SqlDataReader reader = cmd.ExecuteReader();
conn.Close();
DataTable dt = new Good_Issue_Vehicle_Report.dt_GoodIssueVehicleDataTable();
dt.Load(reader);   <----- Taking too much time
if (dt.Rows.Count > 0)
{
Export Code in Excel
}

OriginalGriff

Покажите нам соответствующие фрагменты кода - мы понятия не имеем, что вы делаете, или что вы считаете "быстрым" или "медленным"

Member 13165845

Готово,пожалуйста, проверьте мой вышеприведенный вопрос еще раз.

Kornfeld Eliyahu Peter

Вы уверены, что вам нужно 50000 записей в структуре данных, которая в основном была создана для подключения к пользовательскому интерфейсу? Как именно конечный пользователь будет обрабатывать такой объем данных?

Member 13165845

Да, мне нужно столько записей, и в будущем они будут увеличиваться. Пожалуйста, покажи мне, как я справлюсь с этим. Моя главная цель - экспортировать эти данные в excel для моего клиента.

Er. Puneet Goel

пожалуйста, ответьте на вопрос "использует ли ваш sp 'sp_web_reports' динамический запрос? Просто предоставьте нам некоторую информацию."

Кроме того, пожалуйста, сообщите, сколько времени занимает SSMS?

Er. Puneet Goel

ваша СП 'sp_web_reports является использование динамических запросов? Просто предоставьте нам некоторую информацию.

Member 13165845

Нет, это простой запрос соединения двух таблиц, и он дает мне результат данных в течение 0 секунд на моем облачном сервере.Здесь 11 колонн.

Er. Puneet Goel

Затраченное загрузчиком время связано с планом выполнения запроса. Вы можете попробовать использовать опцию(перекомпилировать) или с помощью Compile. Дай ему попробовать.

Member 13165845

Можете ли вы просто поделиться со мной его примером, чтобы я проверил его и обновил вас.

Er. Puneet Goel

Просто просмотрите эту статью: это может вам помочь https://stackoverflow.com/questions/25186380/adapter-fill-takes-long
Для таких вещей мы на самом деле не можем поделиться каким-либо примером, но можем поделиться связанным контентом.

Member 13165845

Я использовал его,поставил "OPTION(RECOMPILE)" в последнем своем запросе, но та же проблема. Если есть какое-то другое решение, то поделитесь со мной.

#realJSOP

Вместо 1-голосующих честных попыток помочь, покажите нам свой сохраненный proc.

6 Ответов

Рейтинг:
2

Dave Kreskowiak

DataTable изначально медленен по своей природе. Вы мало что можете сделать, чтобы сделать это быстрее.

Проблема может быть в том, что ваш запрос не оптимизирован. Мы не знаем, потому что не видим этого в том, что вы опубликовали.

Но вы также сказали, что 50 000 записей, с которыми вы имеете дело, могут быть больше. Использование DataTable накладывает ограничение на количество записей, с которыми вы можете иметь дело. Вы пытаетесь загрузить весь набор записей в память одновременно из-за ограничения оперативной памяти в машине. Это действительно плохая идея - загружать такое количество записей в память.

Поскольку вы экспортируете данные в Excel, не используйте DataTable. Вместо этого используйте DataReader. это позволит загружать в память только одну запись за раз. Загрузите запись, экспортируйте ее в свой лист Excel, загрузите следующую и повторяйте до тех пор, пока не закончите. У вас нет никаких проблем с ограничением памяти, чтобы иметь дело с ними.


Рейтинг:
2

Patrice T

Насколько я могу судить:
1) Вы забыли сказать, как долго это "долго".
2) то, как ваша хранимая процедура присоединяется к 2 таблицам, влияет на время выполнения, но вы не показали эту процедуру.
3) структура базы данных и индексы тоже имеют значение, но это тоже тайна.

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


Рейтинг:
1

#realJSOP

Попробуйте сделать это таким образом:

SqlConnection  conn      = null;
SqlCommand     cmd       = null;
SqlDataAdapter adapter   = null;
DataSet        dataset   = null;
DataTable      dataTable = null;

try
{
    using (conn = new SqlConnection("connection string"))
    {
        conn.Open();
        using (cmd = new SqlCommand("sp_web_reports", conn) { CommandType = CommandType.StoredProcedure })
        {
            cmd.Parameters.AddWithValue("@mode",      50);
            cmd.Parameters.AddWithValue("@From_Date", Convert.ToDateTime(txt_from_date.Text));
            cmd.Parameters.AddWithValue("@TO_Date",   Convert.ToDateTime(txt_to_date.Text));
            cmd.Parameters.AddWithValue("@GroupCode", drp_vehicle_group.SelectedValue);
            using (adapter = new SqlDataAdapter(cmd))
            {
                dataset = new DataSet();
                adapter.Fill(dataset);
                dataTable = dataset.Tables[0];
            }
        }
    }
}
catch (Exception ex)
{
    // handle the exception
}

// if you get here without an exception, you can work with your dataTable object.


То using оператор имеет преимущество очистки объектов адаптера, команды и соединения без написания кода для конкретной обработки этого. Кроме того, вы должны обернуть ВСЕ Код ADO с try/catch блокирует и обрабатывает исключения соответствующим образом. Определение различных объектов перед первым using оператор позволяет проверить их в отладчике в случае возникновения исключения.

Если вы хотите экспортировать в Excel, все, что вам нужно сделать, это позвонить dataTable.WriteXML("filename"), и Excel 2007+ может прочитать его.


Kornfeld Eliyahu Peter

Почему вы думаете, что он будет работать лучше?
Как я вижу (из кода), оба DbAdapter.Заполнение и Датируемость.Загрузить сделать то же самое - с помощью считывателя...

#realJSOP

Просто бросаю дротики. У меня нет никаких проблем с лагом, делая это таким образом. Даже если он не работает лучше, чем его исходный код, по крайней мере, у него есть лучший код, который все еще работает, по крайней мере, так же хорошо. 1-й голос не подходит.

Kornfeld Eliyahu Peter

Без сомнения, ваш код очень удобочитаем... Мне просто было любопытно, может быть, у вас здесь есть секрет... Слишком плохой... Может быть, ОП попытается подтвердить - или нет :-)

#realJSOP

Он был бы неосторожен, если бы не попытался это сделать. Ему нечего терять. Я работаю программистом всего 40 лет, так что же я знаю? Кроме того, мы до сих пор не видели его сохраненный proc, и в этом, вероятно, заключается проблема.

[no name]

Почему только ваше решение заслуживает понижения?

#realJSOP

Почему небо голубое?

Рейтинг:
1

Simon_Whale

Вы проверили свою индексацию по этим таблицам?
Есть ли в вашем SQL - операторе "select *"?

c# - DataTable Load very slow - переполнение стека[^]
c# - SQL-запрос, который отлично работает в SSMS, работает очень медленно. ASP.NET - переполнение стека[^]


Рейтинг:
0

Kornfeld Eliyahu Peter

Здесь вы можете сделать не так уж много, если используете DataTable, которая является несвязанной структурой (это означает, что она будет загружать все данные из SQL в одном цикле)...
Поскольку кажется, что ваша конечная цель-экспорт в Excel (CSV?), вы можете использовать DataReader (у вас уже есть один), зацикливаться на нем и экспортировать данные запись за записью... В этом случае вы можете получить огромную производительность...
Также учтите, чтобы не принести ничего лишнего из SQL - он занимает больше памяти!


Рейтинг:
0

Gerry Schmitz

Вы должны использовать функцию Excel "данные" для импорта непосредственно в Excel из SQL Server.

В противном случае слишком много промежуточных шагов.

Или экспортировать из SQL Server в формате CSV; открыть в Excel.

и т.д.