ODBCDataReader очень медленный

Следующий базовый код занимает около 35 секунд для завершения dt.load(reader). База данных представляет собой базу данных MS Access .mdb с примерно 210 «столбцами» и, возможно, 37 строками.

Я видел много блогов и сообщений об этом, где «это медленно», «есть ли другой способ» и т. д. и т. д. Это всего 200 или около того строк … может быть, максимум 1 секунда, верно?

string connectionString = "Driver = {Microsoft Access Driver (*.mdb, *.accdb)}; Dbq = " + file;
_conn = new OdbcConnection(connectionString);

string sql = "select * from fields";

OdbcCommand command = new OdbcCommand(sql, _conn);
OdbcDataReader reader = command.ExecuteReader();
DataTable dt = new DataTable();

dt.Load(reader); // 30+ seconds to complete

foreach (DataRow row in dt.Rows)
{
    ...

Также попробовал следующее... та же 35-секундная задержка на Fill()

        OdbcDataAdapter adapter = new OdbcDataAdapter();
        DataSet ds = new DataSet();
        ds.Clear();

        adapter.SelectCommand = command;
        adapter.Fill(ds);

Какая скорость, когда вы выбираете только 1 строку «SELECT * FROM fields TOP 1», какая скорость, когда вы выбираете только 1 столбец «SELECT Id FROM fields».

Neil 05.02.2019 17:59

извините, обновленный OP... его 210 столбцов и 37 строк. Я проверю одну строку, хотя.

kenyu73 05.02.2019 18:07

2300 мс для верхнего 1 и 53 мс для верхнего 1 одиночного столбца

kenyu73 05.02.2019 18:11

У меня возникает соблазн сказать, используйте «современный» формат базы данных, но я полагаю, что это устаревшее приложение, которое вы не можете обновить?

Neil 05.02.2019 18:16

Точно. Миграция баз данных доступа на SQL Server через .netcore ODBC

kenyu73 05.02.2019 18:16

Если это миграция, имеет ли значение ее медлительность? Вы сделаете это только один раз.

Neil 05.02.2019 18:18

@Neil Это не одна база данных. Существуют сотни пользовательских баз данных, с которыми «пользователи» будут связываться и в которые будут мигрировать. При такой скорости другая таблица с 10 000 строк займет больше часа только для этой таблицы.

kenyu73 05.02.2019 19:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
613
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Спасибо за советы. Это просто автономный .mdb, и никто не использует его, кроме меня локально. У меня даже не установлен доступ, только драйверы для его открытия... Драйверы Access 2016

kenyu73 05.02.2019 18:12

Access — это интерфейсная база данных, а это означает, что таблицы, по сути, пассивны — в некотором смысле мало чем отличаются от CSV-файла.

Access действительно имеет максимальное количество полей 255, поэтому при 210 вы приближаетесь к этому - и хотя, возможно, это проблема, вы можете проверить меньшее количество полей, чтобы быть уверенным - но я сомневаюсь, что это так. Запросы набора записей выполняются быстро. Выполнение запроса на выборку в Access для этой таблицы будет выполнено в мгновение ока — но вы настраиваете соединение вне Access, как кажется — так где же находится этот код… который вызывает читатель ODBC? Будет ли этот же код подключения работать быстрее, если он нацелен на другой формат набора данных, отличный от Access mdb? ….

Мне понравилось наблюдать за скоростью миграции, которая происходит, когда я напрямую импортирую базы данных Access в SQL Server. Вся база данных с 12 таблицами импортируется в новую оболочку БД максимум за 60 секунд. Я думаю, что использует OleDb/Jet, а не ODBC.

kenyu73 05.02.2019 19:49
Ответ принят как подходящий

Нашел это, и это исправило мою проблему! Теперь потрясающие результаты... 327 миллисекунд, включая накладные расходы на вызовы метода EF.core в одном и том же вызове (целевое соединение).

https://answers.microsoft.com/en-us/office/forum/office_2010-access/my-solution-to-access-being-slow-with-odbc/a5a6522f-a70f-421e-af1b-48327075e010

Другие вопросы по теме