2016-12-16 6 views
1

У меня есть база данных с ~ 50000 строк и 16 столбцов (по крайней мере пока). Когда кнопка нажата в основной форме приложения, программа выполняет некоторые вычисления, из которых вычисляется результат. Мне нужно поместить текущую запись таблицы в качестве вычисленного результата.Быстрое позиционирование в таблице базы данных

пример: у меня есть результат 35500. Мне нужно установить позицию на номер записи 35500 в таблице. Как я могу это сделать быстро? Я работаю с ADO (без SQL), и я попытался с инструкциями, как

table.First; 
table.MoveBy(35500); 

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

+0

Возможно, из-за того, что вы просите драйверы Microsoft ADO выполнять операции 35500 «перемещать следующую запись» один за другим. Если вам действительно нужны операции ISAM вместо SQL (но почему ???), возможно, вам повезло бы с некоторым движком Delphi (tdbf.sf.net, nexusDB или что-нибудь из Torry.net), где вы могли бы сделать что-то вроде 'DataSetObject.RecNo: = 12345;'? –

+1

Использование ClientDataSet – FLICKER

+0

@FLICKER: Фактически, при таблице, размер которой упоминается OP на сервере базы данных, ADO намного быстрее, чем TClientDataSet, особенно на этапе поиска. – MartynA

ответ

3

Я понимаю, что вы говорите, что никаких элементов управления db, подключенных к вашему набору данных , но попробовали ли вы сравнить время, чтобы сделать MoveBy(50000), и без него были окружены звонки на .DisableControls и .EnableControls? Вы можете подумать, что без каких-либо компонентов, поддерживающих db, использование .DisableControls и .EnableControls или не будет иметь никакого значения, но на самом деле это так.

В моей системе, делая MoveBy(50000) против Sql Server (2014) занимает 19+ секунд без .DisableControls и .EnableControls и 0,2 секунды с, что огромная разница.

Я думаю, что мой ответ на этот предыдущий д может иметь отношение: Why does scrolling through ADOTable get slower and slower?

Btw, MoveBy() в основном полезен, когда лучший способ идти в строку, которую можно выразить его параметром Distance. Как было отмечено в комментарии Кристин Росс, если вы знаете значение одного или нескольких полей в строке вы хотите перейти, он может быть гораздо быстрее использовать булеву Locate функцию, так как в

if AdoQuery1.Locate('CountryCode', 'US', []) then 

Locate позволяет указать несколько полей в соответствии с

if AdoQuery1.Locate('CountryCode;Surname', VarArrayOf(['US', 'Smith']), []) then 
+0

благодарю вас за помощь! –

+0

Когда вы знаете поле и контент, вы можете использовать «locate», в котором используются индексы –