ODBCDataReader очень медленный - PullRequest
       8

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

0 голосов
/ 05 февраля 2019

Следующий базовый код занимает около 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);

Ответы [ 3 ]

0 голосов
/ 05 февраля 2019

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

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

0 голосов
/ 06 февраля 2019

Нашел это и исправил мою проблему!Потрясающие результаты теперь ... 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

enter image description here

0 голосов
/ 05 февраля 2019

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

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