![]() |
| ||
|
|
Новости |
Поиск |
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 13:38:00) [1]Всем - всем -всем , кто помогал , огромное СПАСИБО , отдельное СПАСИБО Johnmen!!!
Ура - все получилось!
Johnmen (2004-04-21 13:05:00) [2]Да откуда же я знаю про твою логику ???????????????
TL (2004-04-21 13:04:00) [3]хм, то есть
and (f.id_nfl= nf.id_nfl) and (f.id_nfl= nf1.id_nfl) - верно ? так эту срочку и оставить ?
Johnmen (2004-04-21 13:00:00) [4]>TL
>а где вторая часть ?
Начиная с третьей строки... :)
TL (2004-04-21 12:59:00) [5]Johnmen, а где вторая часть ?
Johnmen (2004-04-21 12:50:00) [6]В посте [26] вторую часть не читать, как содержащую ошибочную инфу...:)
Johnmen (2004-04-21 12:44:00) [7]Значит данных для вывода нет !
В соответствии с условиями отбора...
>and (f.id_nfl= nf.id_nfl) and (f.id_nfl= nf1.id_nfl)
отсюда следует, чтоnf.id_nfl=nf1.id_nfl!!!
но у тебя тут же
>and (nf.nfl_num <> nf1.nfl_num)
М-дя...
TL (2004-04-21 12:35:00) [8]ну вобще этот запрос ничего не выводит . Хотя данные для вывода есть
Johnmen (2004-04-21 12:32:00) [9]>TL
>результа никакого.
В смысле ?
TL (2004-04-21 12:24:00) [10]Johnmen добавляю : and (d.doc_num = d1.doc_num), результа никакого.
Johnmen (2004-04-21 12:18:00) [11]>что я недопонимаю???
То, что необходимо указать связь d с d1.
TL (2004-04-21 12:14:00) [12]Делаю, в соответствии с советами - ничего не получается.
Вот :
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,
document d1,
flights f,
pmntype p,
transp t,
package pac,
route rou,
nflight nf,
nflight nf1
where
(d.id_pk = pac.id_pk) and (d1.id_pk = pac.id_pk)
and (pac.id_fl = f.id_fl)
and (t.id_trp = d.id_trp) and (t.id_trp = d1.id_trp)
and (p.id_pmt = d.id_pmt) and (p.id_pmt = d1.id_pmt)
and (f.id_rt=rou.id_rt)
and (f.id_nfl= nf.id_nfl) and (f.id_nfl= nf1.id_nfl)
and (nf.nfl_num <> nf1.nfl_num)
and (f.fl_date between :db and :de)
order by d.doc_num
В результате ничего не выходит, что я недопонимаю???
ЮЮ (2004-04-21 09:56:00) [13][9] where (a.num_doc = b.num_doc) and (a.num_nfl<>b.num_nfl)
[1]
where
(a.num_doc = b.num_doc) and
(a.num_nfl<>b.num_nfl) and ...
и где отличие?
TL (2004-04-21 09:54:00) [14]А связей там неочень много получается?
если определяю их так :
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, document d1
flights f,
pmntype p,
transp t,
package pac,
route rou,
nflight nf, nflight nf1
where
(d.id_pk = pac.id_pk) and (d1.id_pk = pac.id_pk)
and (pac.id_fl = f.id_fl)
and (t.id_trp = d.id_trp) and (t.id_trp = d1.id_trp)
and (p.id_pmt = d.id_pmt)and (p.id_pmt = d1.id_pmt)
and (f.id_rt=rou.id_rt)
and (f.id_nfl= nf.id_nfl)and (f.id_nfl= nf1.id_nfl)
Johnmen (2004-04-21 09:40:00) [15]Нет, не рекомендация, а именно ответ...
ЮЮ (2004-04-21 09:31:00) [16]в [9] была только рекомендация:
см. свой вопрос,пункт 1)
where (a.num_doc = b.num_doc) and (a.num_nfl<>b.num_nfl)
Johnmen (2004-04-21 09:18:00) [17]Может я чего не понял, но однозначный ответ уже прозвучал в [9]
ЮЮ (2004-04-21 08:31:00) [18]К сожалению в IB нет таких подзапросов, как в MS SQL :-(
Если устроит так:
450000001 Е 15.01.04 5905 17.01.04 729 18.01.04
620000000 291 17.01.04 5905 19.01.04 101 20.01.04
то начни с отбора нужных записей в flights:
SELECT
nf5905.num, f5905.fl_date, nf.num, f.fl_date
FROM
flights f5905
LEFT JOIN nflight nf5905 ON f5905.id_nfl= nf5905.id_nfl
LEFT JOIN package pac ON f5905.id_fl = pac.id_fl
LEFT JOIN flights f ON pac.id_fl = f.id_fl
LEFT JOIN nflight nf ON f.id_nfl= nf.id_nfl
WHERE
(nf5905.num = 5905) AND NOT (nf.num IS NULL)
AND NOT (nf.num = 5905)
Если в приемлимое время получишь
5905 17.01.04 729 18.01.04
5905 19.01.04 101 20.01.04
тогда посмотрим дальше :-)
TL (2004-04-21 08:29:00) [19]sniknik
надо получить поля не только из document
sniknik (2004-04-21 08:20:00) [20]а по моему должно быстро сработать,...
SELECT *
FROM document
WHERE num_doc in (select num_doc from document where nfl_num = 5905)
при условии конечно что есть индес у полей nfl_num и num_doc, ну и конечно не вся таблица имеет значение в nfl_num 5905, а только пара как показано. (остальные ограничители только запутывают селект, попробуй сначала так)