Самый быстрый способ получить количество записей в таблице MS Access
В MS Access получить количество записей в таблице можно множеством способов. Вопрос в том, какой способ самый быстрый.
На время получения результата могут влиять многие факторы:
- находится файл базы данных на локальном или сетевом диске;
- используются обычные или связанные таблицы;
- используются ли в таблицах индексы;
- количество записей в таблицах.
Существуют и другие факторы, такие как частота процессора и производительность системы ввода/вывода, но их не будем брать в расчет, поскольку тестирование всех способов будет производиться в одинаковых условиях.
Я выбрал таблицу, содержащую порядка 10 млн. записей (индексы используются). Создал вторую базу данных, к которой прилинковал выбранную таблицу – необходимо для тестирования подключаемых таблиц. Вторую базу данных разместил на другом компьютере 100-мегобитной локальной сети.
Тестировались следующие методы получения количества строк в таблице:
- Агрегатная функция VBA DCount.
- Агрегатная функция SQL Count.
- Свойство 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 приятно удивило. Беру на замету!
