Нужно ли ZeosLib DataSets выполнять метод FetchAll, чтобы возвращать реальные реальные итоговые строки?
В базах данных Firebird/Interbase мы имеем TIBQuery
, TIBTable
а также TIBDataSet
, которые имеют FetchAll
метод подсчета количества строк в этом наборе данных. Если мы не вызываем этот метод, эти наборы данных регистрируются как "общее" количество строк, которые пользователь уже видел TDBGrid
или же TDBNavigator
, Эту "сумму" можно получить, вызвав метод RecordCount для этих наборов данных.
Другой (гораздо более эффективный) способ получить реальное общее количество строк, получить отдельный набор данных и выполнить некоторые SELECT COUNT(*) FROM TABLE_NAME
и применять любые фильтры, которые нам нравятся. Это нормально, безусловно.
Но теперь, когда я работаю с MySQL через ZeosLib, мне стало интересно, нужно ли мне иметь такую проблему, чтобы поместить второй запрос в память.
Мы знаем, что ZeosLib делает свои запросы и может внутренне возвращать статистику этого запроса, которая включает количество возвращаемых строк.
Помещает ли ZeosLib эту информацию в RecordCount
или он работает так же, как Interbase Components?
1 ответ
- Zeos возвращает количество уже извлеченных записей. Не учитывает примененные фильтры и не делает
FetchAll
перед возвращениемRecordCount
, SELECT COUNT(*) ...
не намного более эффективен, поскольку создает дополнительную нагрузку на сервер, которая иногда может быть равна рабочей нагрузке для выполнения исходного запроса.- В общем, библиотека доступа к данным может предлагать 3 режима вычисления количества записей: количество выбранных строк, количество видимых строк (как в первую очередь, но после применения фильтров) и
SELECT COUNT(*)
, FetchAll или нет FetchAll будет лучше контролировать явно. Вот как это делается в AnyDAC ( подробнее).