Как упростить запрос?

savmon
Дата: 24.06.2009 15:15:03
Очень долго выпоняется следующий запрос:
 SELECT a2.n_du, a1.data, sum(a1.summa) FROM 'c:\a1.dbf' INNER JOIN 'C:\a2.dbf' ON (a1.n_ls=a2.n_ls1 OR a1.n_ls=a2.n_ls2 OR a1.n_ls=a2.n_ls3) GROUP BY data, n_du

В a1.n_ls могут содержаться значения a2.n_ls1, a2.n_ls2, a2.n_ls3. Необходимо сгруппировать суммы (a1.summa) по дате(a1.data) и отделениям(a2.n_du).
alextashk
Дата: 24.06.2009 15:32:51
 SELECT a2.n_du, a1.data, sum(a1.summa) 
FROM 'c:\a1.dbf' 
INNER JOIN 'C:\a2.dbf' 
ON INLIST(a1.n_ls, a2.n_ls1, a1.n_ls, a2.n_ls2, a2.n_ls3) 
GROUP BY data, n_du

ну и индексы по полям a1.n_ls, a2.n_ls1, a2.n_Ls2, a2.n_ls3
прошелмимо
Дата: 24.06.2009 16:03:11
INLIST(a1.n_ls, a2.n_ls1, a2.n_ls2, a2.n_ls3)

+ посмотрите уровень оптимизации

SYS(3054,....)
savmon
Дата: 25.06.2009 08:37:38
Спасибо за советы!
Первый запрос выполняется за 53 секунды
SELECT baza.n_du, plategi.n_ls, plategi.data_upl, plategi.uplata, plategi.el_upl, plategi.peni, plategi.antena, plategi.uplata+plategi.el_upl+plategi.peni+plategi.antena as summa, plategi.vid_upl FROM 'c:\plategi.dbf' INNER JOIN 'c:\baza.dbf' ON (plategi.n_ls=baza.oldls OR plategi.n_ls=baza.my_ls OR plategi.n_ls=baza.ooo_ls)
С использованием INLIST за 38 секунд
SELECT baza.n_du, plategi.n_ls, plategi.data_upl, plategi.uplata, plategi.el_upl, plategi.peni, plategi.antena, plategi.uplata+plategi.el_upl+plategi.peni+plategi.antena as summa, plategi.vid_upl FROM 'c:\plategi.dbf' INNER JOIN 'c:\baza.dbf' ON INLIST(plategi.n_ls, baza.oldls, baza.my_ls, baza.ooo_ls)
Таблички большие. В plategi 1500 записей, в baza 75000 записей. Запрос пишу в Delphi через ADOQuery к табличке FoxPro.
Про SYS(3054,....) не понял. Можно по-подробнее?
прошелмимо
Дата: 25.06.2009 10:12:29
SYS(3054,....)

гы, про делфи ничего не говорили ...

это чтобы в среде фокспро посмотреть уровень оптимиз-и запроса

если выполнить такой код из ком-го окошка в фокспро
автор

LOCAL cmemvar

=SYS(3054,11,"cmemvar")

SELECT * FROM HOME()+"labels.dbf"

? cmemvar


мы увидим, что запрос отработал не оптимально.
для того чтобы работал быстро создадим опред-е индексы

для сложных запросов анализируем ситуации
и создаем индексы, либо меняем опред.условия ...
Sergey Ch
Дата: 26.06.2009 09:04:41
Модератор: По просьбе отвечающих переносим из раздела FoxPro в раздел Delphi
Модератор: Тема перенесена из форума "FoxPro, Visual FoxPro".
savmon
Дата: 29.06.2009 09:56:02
Какие идеи будут в делфовской ветке?
Naf
Дата: 29.06.2009 10:01:55
а так:

SELECT a2.n_du, a1.data, sum(a1.summa) 
FROM 'c:\a1.dbf' 
INNER JOIN 'C:\a2.dbf' 
ON a1.n_ls IN(a2.n_ls1, a2.n_ls2, a2.n_ls3) 
GROUP BY data, n_du

С уважением, Naf
Anatoly Podgoretsky
Дата: 29.06.2009 10:02:04
Идея простая, не упоминать слово Дельфи.

--
http://www.podgoretsky.com
RENaissance
Дата: 29.06.2009 10:10:39

А вложенные запросы разрешено использовать?

Posted via ActualForum NNTP Server 1.4