Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как ускорить процесс поиска 
:(
    Опции темы
marhatter
Дата 18.1.2010, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 8.5.2008

Репутация: нет
Всего: нет



Здравствуйте. Тип базы данных - dBase, способ доступа к базе - BDE. Есть 7 таблиц. В первой хранится общее количество искомых значений (их количество - 556320). Остальные 6 разбиты по 2 таблицы, то есть существует 3 района. у каждого района по 2 таблицы. По выбранному значению из первой таблицы(она является 7-ой таблицей), ищем соответствующие значения по первой таблице района, то есть дубликаты этих значений. Если такое значение есть в первой таблице района, смотрим что бы поле вторую таблицу района. Например:
Выбранное значение из общей таблицы - 1234567, в цикле проверяем это значение в первых таблицах всех районов, если нашли в каком то районе, то идем во вторую таблицу и смотри там поле ххх, его значение может быть - 1, 2, 6. Если для найденного значения, поля ххх, в разных районах, одинаковы или или в пределах 1, 2, то он нам нужен. Таблицы районов связываются по полю ууу. 
Например :
1)
1 - ый район - значение - 1234567, ххх - 1
2 - ой район - значение - 1234567, ххх - 1
значение 1234567 нужно.
2) 
1 - ый район - значение - 9876543, ххх - 1
2 - ой район - значение - 9876543, ххх - 6
значение 9876543 не нужно.
Делаю вот так
Код

procedure TForm1.N1Click(Sender: TObject);
begin
  t1 := 'C:\1.dbf'
  Query1.Close;
  Query1.SQL.Clear;
  Query1.SQL.Add('SELECT DISTINCT t.PERS_NUM AS CHET');
  Query1.SQL.Add('FROM ''' + t1 + ''' AS t');
  Query1.Open;
  Query1.First;
  while not Query1.Eof do
  begin
    chet := Query1.FieldByName('chet').AsString;
    if (chet <> '') then
    begin
      find(chet, 0);
    end;
    Query1.Next;
  end;
end;
procedure TForm1.Find(num_pers: string; count : Integer);
begin
 str := '';
 if (FindFirst('C:\' + '*.*', faDirectory, sr) = 0) then
      begin
        repeat
          begin
            if ((sr.Name = '.') or (sr.Name = '..') or (sr.Name = '4')) then continue;
            t2 := 'C:\base\' + sr.Name + '\2.dbf';
            t3 := 'C:\base\' + sr.Name + '\3.dbf';
            Query2.Close;
            Query2.SQL.Clear;
            Query2.SQL.Add('SELECT t2.PERS_NUM AS CHET');
            Query2.SQL.Add('FROM ''' + t2 +''' AS t2');
            Query2.SQL.Add('WHERE (t2.PERS_NUM = :par) AND (t2.NUM IN (');
            Query2.SQL.Add('SELECT t3.NUM AS NUM');
            Query2.SQL.Add('FROM ''' + t3 + ''' AS t3');
            Query2.SQL.Add('WHERE (t3.SV IN(1,2) ) and (t3.NUM = :par)');
            Query2.ParamByName('par').Value := num_pers;
            Query2.Open;
            chet1 := Query2.FieldByName('CHET').AsString;
            if (chet1 <>  '') then
            begin
              count := count + 1;
              str := str + ', ' + sr.Name;
            end;
          end;
        until FindNext(sr) <> 0;
      end;
      if (count >= 2) then
      begin
        Memo1.Lines.Add('');
        Memo1.Lines.Add('----- ЛИЦЕВОЙ СЧЕТ ' + num_pers + ' НАЙДЕН в ' + str);
      end;
end;


Пробывал искусственно вводить такое значение в начало общей таблицы, все находит. Но если оно не в начале... Значения из общей таблицы перебирает примерно - одно значение в 5 секунд, всего значений 556320, ну соответсвтенно если вычислить время завершения...очень долго придется ждать. Как ускорить перебор значений? Что я неправильно делаю? Заранее спасибо.
PM MAIL   Вверх
Vas
Дата 18.1.2010, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Иднексы + SQL запросы, должно быть быстрее, чем в цикле. И вложенные запросы попробуйте вынести отдельно, выполнить его, получить значения, а потом вставить ввиде строки со значениями для нахождения вхождения в множество (то бишь IN).
Просто одному борланду известно как БДЕ работает со вложенными запросами, но что-то мне кажется что для каждой строки таблицы пытается выполняться подзапрос.

Это сообщение отредактировал(а) Vas - 18.1.2010, 19:28


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
marhatter
Дата 18.1.2010, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 8.5.2008

Репутация: нет
Всего: нет



Цитата(Vas @ 18.1.2010,  19:22)
Иднексы + SQL запросы, должно быть быстрее, чем в цикле.

то есть примерно так
Код

Query2.Close;
Query2.SQL.Clear;
Query2.SQL.Add('SELECT t2.PERS_NUM AS CHET, t2.NUM  AS NUM');
Query2.SQL.Add('FROM ''' + t2 +''' AS t2');
Query2.SQL.Add('WHERE (t2.PERS_NUM = :par)');
Query2.Open;
num := Query2.FieldByName('num').AsInteger;
Query3.Close;
Query3.SQL.Clear;
Query3.SQL.Add('SELECT t3.NUM AS NUM');
Query3.SQL.Add('FROM ''' + t3 + ''' AS t3');
Query3.SQL.Add('WHERE (t3.SV IN(1,2) ) and (t3.NUM IN (:par1))');
Query3.ParamByName('par1').Value := num;
Query3.Open;

????

Это сообщение отредактировал(а) marhatter - 18.1.2010, 19:40
PM MAIL   Вверх
marhatter
Дата 18.1.2010, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 8.5.2008

Репутация: нет
Всего: нет



Цитата(marhatter @ 18.1.2010,  19:27)
Цитата(Vas @ 18.1.2010,  19:22)
Иднексы + SQL запросы, должно быть быстрее, чем в цикле.

то есть примерно так
Код

Query2.Close;
Query2.SQL.Clear;
Query2.SQL.Add('SELECT t2.PERS_NUM AS CHET, t2.NUM  AS NUM');
Query2.SQL.Add('FROM ''' + t2 +''' AS t2');
Query2.SQL.Add('WHERE (t2.PERS_NUM = :par)');
Query2.Open;
num := Query2.FieldByName('num').AsInteger;
Query3.Close;
Query3.SQL.Clear;
Query3.SQL.Add('SELECT t3.NUM AS NUM');
Query3.SQL.Add('FROM ''' + t3 + ''' AS t3');
Query3.SQL.Add('WHERE (t3.SV IN(1,2) ) and (t3.NUM IN (:par1))');
Query3.ParamByName('par1').Value := num;
Query3.Open;

????

Не совсем понял, что вы имели в виду.
PM MAIL   Вверх
Vas
Дата 19.1.2010, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Да примерно так, и еще для полей по которым делается отбор, создать индексы.


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
marhatter
Дата 19.1.2010, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 41
Регистрация: 8.5.2008

Репутация: нет
Всего: нет



Цитата(Vas @ 19.1.2010,  08:12)
Да примерно так, и еще для полей по которым делается отбор, создать индексы.

Для полей созданы индексы
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1118 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.