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 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, а только пара как показано. (остальные ограничители только запутывают селект, попробуй сначала так)


Страницы:   1 2

Наверх

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