Фильтрация в компонентах доступа к данным (Delphi)
В Delphi для доступа к данным БД используется, в основном, компонент TTable (или его аналоги TADOTable, TSQLTable и пр.). У этих компонентов есть свойства Filter и Filtered, отвечаючие за фильтрацию выборки по строкам. Итак,
1) Я создаю пустое приложение, ложу туда, например TADOTable
2) Настраиваю подключение к серверу БД (у меня - SQL Server)
3) Выбираю имя таблицы в свойстве TableName, напр., MyTable
4) Задаю фильтр, например, "DocCode>='25.12.2003'" и устанавливаю свойство Filtered в True
5) Открываю таблицу
6) Если на шаге 5 посмотреть Trace-лог SQL-Server'а (я для этого пользуюсь утилитой MS SQL Profiler), то в нем будет не строка вида "SELECT * FROM MyTable WHERE DocCode>='25.12.2003'", а "SELECT * FROM MyTable", т.е. с сервера производится выборка не отфильтрованного набора данных, а полного.
7) Эксперименты с CursorType, LockType, другими библиотеками компонентов (TTable, TSQLSimpleTable) ничего не дали.
ИТОГ: Если у меня есть таблица с огромным числом записей, а я хочу открыть только небольшое их количество с исп. фильтра, то компонент доступа к данным все равно вытянет с сервера полный (неотфильтрованный) набор данных, а потом отфильтрует его локально. Тормоза при этом такие же, как если бы фильтра не было вообще. Побороть это невозможно, разве что пользоваться TQuery. Но это не подходит, т.к. там не свойств Filtered, Sort, MasterSource, которые так нужны! А писать своего наследника от TQuery некогда. :-( ...
Кто может хоть что-нибудь подсказать по этому поводу?
2.Впервые слышу что в основном используется TTable :), имхо в основном используются как раз аналоги TQuery, так как дают куда большую функциональность.
3. У TQuery есть filter\filtered по причине описанной выше - он потомок TDataSet'a. Sort'a и MasterSource конечно нет... но это вполне покрывается языком SQL. А filter позволяет делать лишь относительно слабые условия выборки, ни о каких подзапросах там речи идти не может
4. Если сильно некогда, точно знаю, что в оракловых компонентах есть свойства которые позволяют добавлять вещи типа сортировки/упорядочивания к существующему запросу налету в полуавтоматическом режиме, возможно что-то подобное есть и для SQLServer'a, но имхо быстрее написать самому
Если нужна фильтрация - используй связку TADO...- TDataProvider - TClientDataSet - но имей ввиду - фильтрация данных буде на клиенте - если объем не большой - т.е. он НИКОГДА не превысит 15000 записей - то будет нормально. Если более 15000 - это ж0па. В противном случае использу то что тебе посоветовали - с одним уточнением - обязательно используй хранимые процедуры - и при этом учитывай - WITH RECOMPILE....