Как предотвратить загрузку Delphi ADO всей таблицы в память? - PullRequest
7 голосов
/ 05 декабря 2008

Я не программист Delphi, но у меня есть старое приложение Delphi 7, которое мне нужно исправить, и оно использует ADO.

Таблица базы данных (MS Access) содержит +100 000 строк, и когда я устанавливаю ADOTable.Active = true, она начинает загружать всю таблицу в ОЗУ, что занимает много памяти и времени.

Как я могу запретить ADO загружать всю таблицу? Я пытался установить MaxRecords, но это не помогает.

По сути, все, что мы делаем, это запускаем программу att:

// Connect to database
DataModule.MyADOConnection.Connected:=true;

DataModule.MeasurementsADOTable.MaxRecords:=1;

// Open datatables
DataModule.MeasurementsADOTable.Active:=true;                  

После установки Active = true он начинает загружать все измерения в ОЗУ и занимает ВРЕМЯ!

Мы используем провайдера MSDASQL.1. Возможно, он не поддерживает свойство MaxRecords?

Как добавить ограничивающий запрос в этот объект данных только для "загрузки TOP 1 * из измерений"?

Ответы [ 7 ]

10 голосов
/ 05 декабря 2008

Вы можете использовать TADOQuery для ограничения результирующего набора с помощью SQL-запроса. Или вы можете использовать TADOTable и установить CursorLocation на курсор на стороне сервера, чтобы клиент не загружал полный набор результатов в память.

5 голосов
/ 10 декабря 2008

Вы можете использовать эту таблицу с курсором OpenForwardOnly сервера и TCLientDataset с PacketRecords, установленным в ненулевое значение. Работал удивительно, когда мне пришлось написать приложение для перекачки данных из MSSQL в Oracle по индивидуальному заказу с таблицами с миллионами записей.

РЕДАКТИРОВАТЬ -> Было бы что-то вроде этого:

procedure ConfigCDSFromAdoQuery(p_ADOQ: TADOQuery; p_CDS: TClientDataset; p_Prov: TDatasetProvider);
begin
  If p_ADOQ.Active then p_ADOQ.Close;
  p_ADOQ.CursorLocation := clServer;
  p_ADOQ.CursorType := ctOpenForwardOnly;
  p_Prov.Dataset := p_ADOQ;
  p_CDS.SetProvider(p_Prov);
  p_CDS.PacketRecords := 100;
  p_CDS.Open; 
end ;

Я сделал все это с помощью кода, но большую часть этого вы можете сделать во время разработки.

1 голос
/ 13 декабря 2008

Эта статья относится к BDE, но относится к ADO или большинству клиентских библиотек доступа к данным.

http://dn.codegear.com/article/28160

Я бы рекомендовал использовать TADODataSet (он «ближе» к слою ADO, чем TADOQuery) и выбирать только те данные, которые нужны клиенту, предоставляя специальную форму поиска (диапазон дат, список определенных элементов и т. Д.)

Удачи

0 голосов
/ 30 декабря 2017

использовать adoquery Если вам не нужна строка и вы хотите вставить новую строку, используйте команду sql 'select * from myTable, где id = -1' Поскольку Id - это число, строки не будут возвращаться. или же 'select * from myTable, где 1 = -1' Но я думаю, что это не очень хороший способ для вставки данных. Использование adocommand намного лучше.

если вы хотите X строк 'выберите топ X * из myTable'

0 голосов
/ 25 октября 2012

Не делайте надстройку активной при запуске, и позже ее можно сделать истинной, но это все равно не поможет ... используйте набор адодатов и заполните его, скорее всего, во время выполнения текстом вашего соединения. Будут получены только релевантные данные, что сделает его намного быстрее.

0 голосов
/ 13 декабря 2008

Я обнаружил, что ADO + Access с Delphi мучительно медленный, для многих вещей (большая таблица читает, как вы описываете, но также вставляет и т.д.). Мой ответ стал «Выйти из ADO и Access в целом».

Никогда не понимал, почему он работал так плохо, особенно когда более ранние технологии казались не очень.

0 голосов
/ 08 декабря 2008
  1. В вашем модуле данных, где в настоящий момент находится «MeasurementsADOTable», поместите TADOQuery и назовите его «MeasurementsADOQuery»
  2. Установите для свойства Connection MeasurementsADOQuery значение MyADOConnection (при условии, что это случай, основанный на предоставленном небольшом фрагменте кода.)
  3. Я также предполагаю, что вы отображаете сетку или иным образом используете DataSource - измените свойство DataSet компонента DataSource с MeasurementsADOTable на MeasurementsADOQuery
  4. Отредактируйте фактический запрос, который будет выполнен, установив свойство SQL MeasurementsADOQuery. (Во время выполнения перед открытием: Measurements.SQL.Text: = 'выбрать первые 10 * из порядка измерений по любому значению')
  5. Анализировать / изменять все ссылки в коде с MeasurementsADOTable на MeasurementsADOQuery
...