-
Здравствуйте, мастера программирования.
Выполняется вот такой код
name1:=sEdit3.Text;
name2:=sEdit2.Text;
name3:=sEdit4.Text;
if ((name1='') and (name2='') and (name3='')) then
begin
ShowMessage('Нет данных для поиска');
Exit;
end;
sql:='Select * from citizens INNER JOIN passports ON passports.citizen_id=citizens.citizen_id where citizens.citizen_id>=0';
if name1<>'' then
sql:=sql+' and citizen_name_1 like '''+name1+'%''';
if name2<>'' then
sql:=sql+' and citizen_name_2 like '''+name2+'%''';
if name3<>'' then
sql:=sql+' and citizen_name_3 like '''+name3+'%''';
ADOQuery1.SQL.Text:=sql;
ADOQuery1.Active:=True;
время выполнения этого запроса секунды 3. Программа при этом весит, пока запрос выполняется. В каждой таблице порядка 300 тыс записей.
Можно ли ускорить процесс выборки?
-
1. текст запроса сделать статическим, неизменяемым
2. добавить три параметра
3. создать индекс по всем именам ситизенов
-
4. помнить про людей с фамилией ';DROP TABLE citizens;
-
5. Вывести только те поля, которые необходимы.
-
Спасибо. Все решил.
Подскажите еще немного
есть запрос
select * from citizens
inner join passports on passports.citizen_id=citizens.citizen_id
inner join passport_types on passport_types.passport_type_code=passports.passport_type_code
inner join addresses on addresses.citizen_id=citizens.citizen_id
where citizens.citizen_id=5
access выдает ошибку что пропущен оператор. Не могу понять что за оператор. В MS SQL server все работает, а тут нет
-
там скобки вроде скобки в секции from должны быть. Но как их расставить не скажу.
-
у access-а синтаксис join-ов вложенный друг в друга... в соответствии со справкой в нем же. а еще у него есть графический построитель запросов.
-
Спасибо. Все решил немного по другому
select * from citizens, passports, passport_types, addresses
where (passports.citizen_id=citizens.citizen_id and
passports.passport_type_code=passport_types.passport_type_code and
addresses.citizen_id=citizens.citizen_id and
citizens.citizen_id=658)
order by addresses.address_string desc
Только вот этот запрос в самом access быстро выполняется, а в Delphi секунд 6-7. Не могу понять почему.
-
lewka © (18.01.17 11:17) [7]
У тебя Delphi дожидается полной загрузки записей, а access часть подгружает.
-
Т.е. просто нужно прописать конкретные поля в запросе?
-
нет, запрос возвращает много записей?
-
И не пойму ты из Delphi подключаешься куда?
к Access или MS SQL ?
и как Access к MS SQL подключен?
В общем как организовано подключение к БД ?
-
> нет, запрос возвращает много записей?
порядка 30 полей. Записей одна
-
> lewka © (18.01.17 12:33) [12]
>
> > нет, запрос возвращает много записей?
>
> порядка 30 полей. Записей одна
Тогда не в том проблема, думал много записей.
-
> И не пойму ты из Delphi подключаешься куда?
> к Access или MS SQL ?
> и как Access к MS SQL подключен?
> В общем как организовано подключение к БД ?
к Access подключен
в MS SQL такие же таблицы. Я их от туда перенес в Access из чужой БД. И на их основе делаю свою.
-
lewka © (18.01.17 12:35) [14]
1. Попробуй запрос построить через графический интерфейс и скопируй его в delphi.
2. Сохрани запрос в Access за исключением
Из delphi уже обращайся к запросу а в where citizen_id=658
-
*за исключением citizens.citizen_id=658