В MS Access получить количество записей в таблице можно множеством способов. Вопрос в том, какой способ самый быстрый.

На время получения результата могут влиять многие факторы:

  • находится файл базы данных на локальном или сетевом диске;
  • используются обычные или связанные таблицы;
  • используются ли в таблицах индексы;
  • количество записей в таблицах.

Существуют и другие факторы, такие как частота процессора и производительность системы ввода/вывода, но их не будем брать в расчет, поскольку тестирование всех способов будет производиться в одинаковых условиях.

Я выбрал таблицу, содержащую порядка 10 млн. записей (индексы используются). Создал вторую базу данных, к которой прилинковал выбранную таблицу – необходимо для тестирования подключаемых таблиц. Вторую базу данных разместил на другом компьютере 100-мегобитной локальной сети.

Тестировались следующие методы получения количества строк в таблице:

  1. Агрегатная функция VBA DCount.
  2. Агрегатная функция SQL Count.
  3. Свойство Recordcount объекта DAO, возвращаемое функцией OpenRecordset.

Будут использованы разные варианты. Результаты тестирования привожу в таблице:

Метод Обычная таблица Связанная таблица
lntCount = DCount("*", "MyTable")
12,2 с. 12,3 с.
lntCount = DCount("ID", "MyTable")
11,7 с. 13,1 с.
lntCount = CurrentDb.OpenRecordset _
("SELECT Count(*) AS [CountOfID] FROM MyTable;") _
![CountOfID]
12,5 с. 12,5 с.
lntCount = CurrentDb.OpenRecordset _
("SELECT Count([ID]) AS [CountALL] FROM MyTable;") _
![CountALL])
12,3 с. 12,4 с.
lntCount = CurrentDb.OpenRecordset("Count_Query") _
![CountOfID]
12 с. 11,9 с.
lntCount = CurrentDb. _
OpenRecordset("Mytable").RecordCount
0,1 с. невозможен
lntCount = OpenDatabase _
("c:\My Documents\LinkedDatabase.mdb"). _
OpenRecordset("Mytable").RecordCount
невозможен 0,1 с.

Как выяснилось, использование «*» или название поля в агрегатных функциях DCount и Count на времени получения количества строк сказывается незначительно. Также не намного отличаются результаты для «родных» и связанных таблиц. Ну а свойство RecordCount объекта Recordset приятно удивило. Беру на замету!