Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Query


Страницы:   1 2

TL ©   (2004-04-20 11:15:00) 

Доброго времени суток!
У меня вот такой глупый вопрос:
Работаю с  интербейзовской базой (5), создаю представление, записей в котором порядка 53117. Пишу вот такие запросы :
1) select a.*
from view_l a, view_l b
where
(a.num_doc = b.num_doc) and
(a.num_nfl<>b.num_nfl) and
(a.date_fl between :db and :de) and (b.date_fl between :db and :de)
2)
SELECT view_l.*
FROM view_l
WHERE view_l.num_doc in
(select  num_doc from view_l
where (view_l.routes =5905) and (view_l.date_fl between :db and :de))
and (view_l.date_fl <> 5905)
and (view_l.date_fl between :db and :de)

По своей сути смысл этих запросов один и тот же : получить все записи с одинаковыми num_doc, но разными date_fl.
Так вот, эти запросы отрабатывают ооооооооооочень долго, ПОЧЕМУ? Неужели для такие простеньких запросиков количество записей в 51000 слишком много ?
Может кто подскажет как оптимизировать их ...


TL   (2004-04-21 07:39:00) [21]

Прошу прощения за неясно выраженную постановку задачи. Так вот есть такая выборка ( из document  d,flights f,pmntype p,transp t,package pac,route rou,nflight nf):

d.doc_num d.doc_ser d.doc_date f.fl_date nf.nfl_num
450000000 А         15.01.04   15.01.04  730
450000001 Е         15.01.04   17.01.04  5905
450000001 Е         15.01.04   18.01.04  729
520000111 Р         16.01.04   17.01.04  1000
520000111 Р         16.01.04   17.01.04  1001
520000112 А         17.01.04   17.01.04  5905
520000113 В         17.01.04   18.01.04  5905
620000000 291       17.01.04   19.01.04  5905
620000000 291       17.01.04   20.01.04  101

Необходимо получить :
450000001 Е         15.01.04   17.01.04  5905
450000001 Е         15.01.04   18.01.04  729
620000000 291       17.01.04   19.01.04  5905
620000000 291       17.01.04   20.01.04  101
То есть наобходимо получить все записи с  одинаковыми номерами , они парные, причем чтобы nf.nfl_num у одной записи  был 5905, а у другой, равной ей по номеру, nf.nfl_num  <> 5905.


ЮЮ   (2004-04-21 04:08:00) [22]

1) ???
and (f.fl_date between :db and :de) and (nflight.nfl_num = 5905))
and (nflight.nfl_num <>5905)

>TL   (20.04.04 12:05) [6]
Всё-таки лучше структуру, в не запрос

>Необходимо получить все записи с одинаковыми doc_num , но разными nfl_num.

Насколько можно увидеть невооруженным взглядом, одной записи в document соответствует несколько записей во flights с некоторыми, возможно даже повторяющимися, значениями id_nfl, указывающие на записи в nflight, у которых, в свою очередь возможны одинаковые значения поля nfl_num ?  

Необходимо показать что имеешь и что хочешь получить, т.к. судя по 1) ты получить ничего не хочешь


TL   (2004-04-20 12:17:00) [23]

Подскажите идею, а то кроме как подзапроса и открытия таблиц в разных областях, ничего не могу придумать


Johnmen   (2004-04-20 12:16:00) [24]

см. свой вопрос, пункт 1)
where (a.num_doc = b.num_doc) and (a.num_nfl<>b.num_nfl)


TL   (2004-04-20 12:10:00) [25]

Необходимо получить все записи с одинаковыми doc_num , но разными nfl_num.


Johnmen   (2004-04-20 12:09:00) [26]

Однозначно надо избавляться от вложенного запроса.
Как ? Зависит от конкретно того, что надо получить...


TL   (2004-04-20 12:05:00) [27]

О-хо-хо , стыдобень , вот собсвенна :
select d.doc_num,d.doc_ser, d.doc_date,f.fl_date,d.doc_farecalc ,
t.trp_farebase , p.pmt,d.doc_ag,rou.route,nf.nfl_num
from
document  d,
flights f,
pmntype p,
transp t,
package pac,
route rou,
nflight nf
where
(d.id_pk = pac.id_pk)
and (pac.id_fl = f.id_fl)
and (t.id_trp = d.id_trp)
and (p.id_pmt = d.id_pmt)
and (f.id_rt=rou.id_rt)
and (f.id_nfl= nf.id_nfl)
and (f.fl_date between :db and :de)
and d.doc_num in
(select
d.doc_num
from
document  d,
flights f,
pmntype p,
transp t,
package pac,
route rou,
nflight nf
where
(d.id_pk = pac.id_pk)
and (pac.id_fl = f.id_fl)
and (t.id_trp = d.id_trp)
and (p.id_pmt = d.id_pmt)
and (f.id_rt=rou.id_rt)
and (f.id_nfl= nf.id_nfl)
and (f.fl_date between :db and :de) and (nflight.nfl_num= 5905))
and (nflight.nfl_num<>5905)


Johnmen   (2004-04-20 12:01:00) [28]

Код в студию !
:)


TL   (2004-04-20 11:59:00) [29]

теперь выбор делаю напрямую из таблиц , в которых все необходимые индексы определены - быстрее на стало работать


Johnmen   (2004-04-20 11:36:00) [30]

>ПОЧЕМУ?

Потому, что перебор.
Оптимизировать - делать селекты из таблиц, в которых есть индексы на соответствующие поля...


sniknik   (2004-04-20 11:33:00) [31]

> view_l
это то о чем я думаю? представление? ну тогда ограничения(в where) "сверху" в запросе на него не действуют, выборка в представлении будет полной (причем двойной в первом случае с самообьеденением, обьеденение кстати построит временные индексы по полям...) а уже после "обрежется" по датам и т.д (по тому что в where).

+ (или минус ;о) если это всетаки таблицы то значит нет индексов, по полям в выборке на которые условия, что дает прогон по всей базе..

и подзапрос похоже делается при получении каждой строки... тоже скорости не добавит.

> Может кто подскажет как оптимизировать их ...
может и подскажет. ;о)
ввиду ограниченности знаний по IB это буду не я :), мне это довольно долго делать.


Sergey13   (2004-04-20 11:32:00) [32]

Посмотри планы, поиграй индексами. Посмотри планы на вьюшные селекты. Попробуй без вьюх, напрямую к таблицам. До фига чего смотреть можно. Даже на смену сервера (пора бы с 5 то уходить 8-).


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо