IBQuery->Locate(...)
При 30 записях ищет прекрасно а при 8000 вешает программу (или ищет так долго) - как ускорить?
Какой запрос в Query и какой Locate? Попробуй в запросе написать select * from .... order by field1, field2...
Поля в order by - те по которым делаешь Locate.
Какой запрос в Query и какой Locate? Попробуй в запросе написать select * from .... order by field1, field2...
Поля в order by - те по которым делаешь Locate.
Спасибо за совет, но... по первому символу прыгнул резво а дальше как всегда
Спасибо за совет, но... по первому символу прыгнул резво а дальше как всегда
Покажи запрос и Locate(код)
select ID_TOVAR, ID_GROUP, ID_PGROUP, ID_PRODUCER, NAME, TECHE, KOEF, ID_STATUS, ID_POST, TIP,enter_nds, NP,ALTER_POST from TOWAR order by id_tovar, name, ID_GROUP, ID_PGROUP
Locate
TLocateOptions op;
op.Clear();
op<<loPartialKey;
op<<loCaseInsensitive;
if(DBGrid1->SelectedIndex == 1)
IBQuery1->Locate("NAME", Label4->Caption, op);
if(DBGrid1->SelectedIndex == 0)
IBQuery1->Locate("ID_TOVAR", Label4->Caption, op);
В Label4 Накапливается строка для поиска
Запрос
select ID_TOVAR, ID_GROUP, ID_PGROUP, ID_PRODUCER, NAME, TECHE, KOEF, ID_STATUS, ID_POST, TIP,enter_nds, NP,ALTER_POST from TOWAR order by id_tovar, name, ID_GROUP, ID_PGROUP
Locate
TLocateOptions op;
op.Clear();
op<<loPartialKey;
op<<loCaseInsensitive;
if(DBGrid1->SelectedIndex == 1)
IBQuery1->Locate("NAME", Label4->Caption, op);
if(DBGrid1->SelectedIndex == 0)
IBQuery1->Locate("ID_TOVAR", Label4->Caption, op);
В Label4 Накапливается строка для поиска
А в базе у тебя индексы созданы по тем полям, где ты поиск делаешь?
Но вот ID_TOVAR вообще ключевое поле - так по нему ищет долще чем по NAME - которое без индекс
Я где то читал что LOCATE не пользуется индексами
TDateTime lcDate = MonthCalendar1->Date;
int lcAfsId = StrToInt(edAfsId->Text);
AnsiString lcTime = edTime->Text;
TLocateOptions Flags;
Variant Locvalues[] = {lcAfsId, lcDate, lcTime};
qu->Locate("AFS_ID;DATA;TIM",
VarArrayOf(Locvalues,2), Flags);
Работает первый раз порядка 2-х сек, потом проядка 0.5 сек. База на томже компе, где и программа. В таблице более 70 000 строк.
AFS_ID;DATA;TIM - primary key.
Более того ID_TOVAR integer - программа долго думает и никуда не двигается
Если база не секретная и не очень большая (меньше 20 метров), пришли на [email]gray_k@front.ru[/email]. Покопаюсь, когда время будет. А то даже самому интересно в чём проблема может быть.
Но вот что я подумал - чем отличается Locate и LoacateNext и во вторых влияет ли Количество связей таблицы на скорось поиска. Та таблица про которую ты говорил - связана с тругими таблицами или нет. Моя имеет связи с 4 таблицами - общее число строк которых 400000
Спасибо за предложение но база секретная и в back up занимает больше 30 метров
Но вот что я подумал - чем отличается Locate и LoacateNext и во вторых влияет ли Количество связей таблицы на скорось поиска. Та таблица про которую ты говорил - связана с тругими таблицами или нет. Моя имеет связи с 4 таблицами - общее число строк которых 400000
Locate находит ПЕРВУЮ строку в наборе данных, удовлетворяющую условию поиска, а LocateNext находит первую запись от ПОЗИЦИИ КУРСОРА в наборе данных. Моя таблица не связана с другими. А каким образом связана твоя. Если это просто выборка из нескольких таблиц, то на сам процесс поискаэто влиять не должно, а должно влиять на скорость открытия НД. Кстати может у тебя потому и медленно ищет. Ведь IBQuery сразу качает с сервера не всю выборку а только необходимую часть, отбражающуюся в контролле. А потом докачивает. Попробуй после IBQuery->Open(); сделать IBQuery->Last(); и увидишь скорость.
Ведь IBQuery сразу качает с сервера не всю выборку а только необходимую часть, отбражающуюся в контролле. А потом докачивает. Попробуй после IBQuery->Open(); сделать IBQuery->Last(); и увидишь скорость.
А как сделать что бы она все данные загрузила?
Может быть дело в настройках IBQuery
IBQuery->Last() - занимает примерно 1 секунду
Может быть дело в настройках IBQuery
Сделать чтобу грузило всё сразу нельзяю Я делаю при открытиии таблицы сначала Last() потом First(). После этого набор оказывается в памяти.
А почему у тебя медленно ищет не знаю даже. А как у тебя осуществляется связь с другими таблицами. Да и ещё можно поробовать так:
IBQuyery->DisableControls();
IBQuery->Locate(......)
IBQuery->EnableControls();
Кстати второй параметр в Locate имеет тип variant, поэтому его надо приводить к тому типу, какого типа у тебя поле поиска. Т.е. если ID_TOVAR - integer, то вместо
надо писать
IBQuery1->Locate("ID_TOVAR", StrToInt(Label4->Caption), op);
А как у тебя осуществляется связь с другими таблицами.
4 лук ап поле и одно вычисляемое
1. Перенес запрос на DataSet
2. Все лукапы и вычисления возложил на сервак - сделал прививы
Вот теперь летает как заведенный
Если интересно то ускорил я поиск таким вот образом
1. Перенес запрос на DataSet
2. Все лукапы и вычисления возложил на сервак - сделал прививы
Вот теперь летает как заведенный
Я думаю второе более критично чем первое. Не проверял? Прививы - это view?
Я думаю второе более критично чем первое. Не проверял? Прививы - это view?
Ну да
Как пишет господин Архангельский DataSet - дословно - Обеспечивает наиболее эффективный досту к данным
Ты случаем не знаешь как Prepare влияет на скорость запроса
Ну да
Как пишет господин Архангельский DataSet - дословно - Обеспечивает наиболее эффективный досту к данным
Ты случаем не знаешь как Prepare влияет на скорость запроса
Влияет. Насколько ускоряет не проверял. В хелпе написано, что если ты используешь один и тот же запрос, то после Prepare запрос будет выполняться сразу, а не проверятся на корректность.