Следующий базовый код занимает около 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);
извините, обновленный OP... его 210 столбцов и 37 строк. Я проверю одну строку, хотя.
2300 мс для верхнего 1 и 53 мс для верхнего 1 одиночного столбца
У меня возникает соблазн сказать, используйте «современный» формат базы данных, но я полагаю, что это устаревшее приложение, которое вы не можете обновить?
Точно. Миграция баз данных доступа на SQL Server через .netcore ODBC
Если это миграция, имеет ли значение ее медлительность? Вы сделаете это только один раз.
@Neil Это не одна база данных. Существуют сотни пользовательских баз данных, с которыми «пользователи» будут связываться и в которые будут мигрировать. При такой скорости другая таблица с 10 000 строк займет больше часа только для этой таблицы.





Доступ намного медленнее, когда несколько пользователей обращаются к базе данных. Убедитесь, что ваше приложение не подключено, и проверьте наличие файла .ldb в каталоге доступа. Если он есть, значит, он открыт кем-то другим (или вылетел, оставив замки). Если это так, попробуйте компактный и ремонтный вариант в меню. (По умолчанию он запускается, когда последний человек выходит из базы данных, но если кто-то выходит из строя, база данных никогда не уплотняется).
Спасибо за советы. Это просто автономный .mdb, и никто не использует его, кроме меня локально. У меня даже не установлен доступ, только драйверы для его открытия... Драйверы Access 2016
Access — это интерфейсная база данных, а это означает, что таблицы, по сути, пассивны — в некотором смысле мало чем отличаются от CSV-файла.
Access действительно имеет максимальное количество полей 255, поэтому при 210 вы приближаетесь к этому - и хотя, возможно, это проблема, вы можете проверить меньшее количество полей, чтобы быть уверенным - но я сомневаюсь, что это так. Запросы набора записей выполняются быстро. Выполнение запроса на выборку в Access для этой таблицы будет выполнено в мгновение ока — но вы настраиваете соединение вне Access, как кажется — так где же находится этот код… который вызывает читатель ODBC? Будет ли этот же код подключения работать быстрее, если он нацелен на другой формат набора данных, отличный от Access mdb? ….
Мне понравилось наблюдать за скоростью миграции, которая происходит, когда я напрямую импортирую базы данных Access в SQL Server. Вся база данных с 12 таблицами импортируется в новую оболочку БД максимум за 60 секунд. Я думаю, что использует OleDb/Jet, а не ODBC.
Нашел это, и это исправило мою проблему! Теперь потрясающие результаты... 327 миллисекунд, включая накладные расходы на вызовы метода EF.core в одном и том же вызове (целевое соединение).
Какая скорость, когда вы выбираете только 1 строку «SELECT * FROM fields TOP 1», какая скорость, когда вы выбираете только 1 столбец «SELECT Id FROM fields».