Конференция "Начинающим" » Время выполнения запроса
 
  • lewka © (16.01.17 12:53) [0]
    Здравствуйте, мастера программирования.
    Выполняется вот такой код

    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 тыс записей.

    Можно ли ускорить процесс выборки?
  • rrrrr © (16.01.17 13:02) [1]
    1. текст запроса сделать статическим, неизменяемым
    2. добавить три параметра
    3. создать индекс по всем именам  ситизенов
  • megavoid © (16.01.17 13:58) [2]
    4. помнить про людей с фамилией  ';DROP TABLE citizens;
  • stas © (16.01.17 18:41) [3]
    5. Вывести только те поля, которые необходимы.
  • lewka © (17.01.17 16:06) [4]
    Спасибо. Все решил.
    Подскажите еще немного
    есть запрос

    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 все работает, а тут нет
  • stas © (17.01.17 16:52) [5]
    там скобки вроде скобки в секции from должны быть. Но как их расставить не скажу.
  • sniknik © (17.01.17 20:50) [6]
    у access-а синтаксис join-ов вложенный друг в друга... в соответствии со справкой в нем же. а еще у него есть графический построитель запросов.
  • lewka © (18.01.17 11:17) [7]
    Спасибо. Все решил немного по другому

    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. Не могу понять почему.
  • stas © (18.01.17 11:22) [8]
    lewka ©   (18.01.17 11:17) [7]
    У тебя Delphi дожидается полной загрузки записей, а access часть подгружает.
  • lewka © (18.01.17 11:56) [9]
    Т.е. просто нужно прописать конкретные поля в запросе?
  • stas © (18.01.17 12:20) [10]
    нет, запрос возвращает много записей?
  • stas © (18.01.17 12:23) [11]
    И не пойму ты из Delphi подключаешься куда?
    к Access или MS SQL ?
    и как Access к MS SQL подключен?
    В общем как организовано подключение к БД ?
  • lewka © (18.01.17 12:33) [12]

    > нет, запрос возвращает много записей?

    порядка 30 полей. Записей одна
  • stas © (18.01.17 12:35) [13]

    > lewka ©   (18.01.17 12:33) [12]
    >
    > > нет, запрос возвращает много записей?
    >
    > порядка 30 полей. Записей одна


    Тогда не в том проблема, думал много записей.
  • lewka © (18.01.17 12:35) [14]

    > И не пойму ты из Delphi подключаешься куда?
    > к Access или MS SQL ?
    > и как Access к MS SQL подключен?
    > В общем как организовано подключение к БД ?


    к Access подключен

    в MS SQL такие же таблицы. Я их от туда перенес в Access из чужой БД. И на их основе делаю свою.
  • stas © (18.01.17 12:44) [15]
    lewka ©   (18.01.17 12:35) [14]
    1. Попробуй запрос построить через графический интерфейс и скопируй его в delphi.
    2. Сохрани запрос в Access за исключением
    Из delphi уже обращайся к запросу а в where citizen_id=658
  • stas © (18.01.17 12:47) [16]
    *за исключением citizens.citizen_id=658
 
Конференция "Начинающим" » Время выполнения запроса
Есть новые Нет новых   [118238   +18][b:0][p:0.001]