у меня проблема с получением данных с помощью Delphi TClientDataSet
Код с ADO:
ADOQuery1.SQL.Text:='SELECT * FROM Table1 WITH (NoLock)';
DataSource1.DataSet:=ADOQuery1;
DataSource1.DataSet.Open;
DataSource1.DataSet.Last;
Приведенный выше код возвращает более 180 тыс. строк за 3-6 секунд при использовании чистого ADO.
Тот же код с TClientDataSet:
ADOQuery1.SQL.Text:='SELECT * FROM Table1 WITH (NoLock)';
CDS1.SetProvider(ADOQuery1);
DataSource1.DataSet:=CDS1;
DataSource1.DataSet.Open;
DataSource1.DataSet.Last;
Следующий код возвращает такое же количество строк (более 180 тыс.), Но в течение 3-4 минут.
Что не так с CDS? Это примерно в 100 раз медленнее, чем при использовании ADO. Можно ли это исправить?
CursorLocation
, вы можете получить только несколько первых и несколько последних строк. Существуют также другие параметры, которые могут дать ADO возможность реализовать определенные улучшения эффективности. Например. Если настроить чтение только вперед, ADO не нужно будет хранить или обрабатывать какие-либо промежуточные строки при выполненииDataSet.Last
. - person Disillusioned   schedule 15.01.2015TClientDataSet
, вероятно, не лучший инструмент для ваших требований.) - person Disillusioned   schedule 15.01.2015TDataSet
потомки медленные в целом. Для извлечения оптимизируйте запрос, чтобы использовать прямой курсор только для чтения и доступ к базовому интерфейсуRecordset
. @mjn, это не задокументировано, а также не задокументировано, сколько элементов разумно использовать, например. сTList
. - person TLama   schedule 15.01.2015