Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Медленно работает метод TIBTable.Locate [D6, FireBird]


XanderMan ©   (2002-04-10 20:38:00) 

На машине работает FireBird. Имеется таблица, в ней порядка 6500 записей. В программе, написанной под D6, необходимо часто производить поиск записи по индексированному полю и делать ее текущей. В TTable есть метод FindKey, который работает достаточно быстро. В TIBTable есть похожий метод Locate. Проблема в том, что он выполняется ну очень медленно (до 20 сек, и это при том, что поиск ведется по индексированному полю). Посмотрел в исходники Delphi. Реализация Locate какая-то невероятная: для поиска нужной записи он производит перебор всех записей таблицы, начиная с первой, пока не найдет нужную:( Простенько, но со вкусом...

Подскажите, пожалуйста, как ускорить процесс поиска в таблице с позиционированием на нужную запись.


alexandr   (2002-04-11 12:03:00) [1]

у меня только-что открылся
а ib.demo.ru ? Это ведь зеркало


Fareader   (2002-04-11 11:39:00) [2]

сайт не открывается а пытается сохранить какой-то файл на винт - сохранил, посмотрел - набор байтов :(


alexandr   (2002-04-11 11:18:00) [3]

а что с ним происходит?


Fareader   (2002-04-11 11:15:00) [4]

Возьми IBQuery и делай локейт у него. правда подтормаживает тоже. Лучше возьми FibPlus он локейтит быстрее, да и если в запросе будет сортировка, то скорость поиска будет ниже, я от этого избавился сделав сортировку через метод DoSortEx - поиск идет очень быстро.

А кто нибудь знает что происходит с www.ibase.ru ?


koks   (2002-04-11 10:11:00) [5]

Конечно, при клиент-сервере использовать старую технологию (Lookup по индексированному полю) - будут тормоза. Судя по всему, мало того что она у тебя перебирает все записи - она их еще и гоняет туда-сюда... Клиент-сервер ориентирован на SQL. Соответственно используй его.. Будет работать в миллион раз быстрее..


alexandr   (2002-04-11 07:43:00) [6]

не используй TIBTable


dymka   (2002-04-10 21:14:00) [7]

Высказываю просто мысли... Может они и не точны...
При открытии набора, клиент фетчит не все записи, а только те которые необходимо вывести на экран, поэтому Locate при проходе чтит с сервера дополнительно каждую запись...
Возможный метод решения - делать FetchAll после открытия...
Открытие будет идти дольше, поиск быстрее...
Хотя не уверен в правильности подхода...
Далее, после FetchAll можно получить размер и адрес каждой записи - т.е. можно искать самому, используя спец алгоритмы (QuickSort итп...).


Наверх

Титульная страница Поиск, карта сайта Написать письмо