![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Query
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-).