Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.16;
Скачать: CL | DM;

Вниз

Query   Найти похожие ветки 

 
TL   (2004-04-20 11:15) [0]

Доброго времени суток!
У меня вот такой глупый вопрос:
Работаю с  интербейзовской базой (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 слишком много ?
Может кто подскажет как оптимизировать их ...


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

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


 
sniknik ©   (2004-04-20 11:33) [2]

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

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

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

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


 
Johnmen ©   (2004-04-20 11:36) [3]

>ПОЧЕМУ?

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


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

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


 
Johnmen ©   (2004-04-20 12:01) [5]

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


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

О-хо-хо , стыдобень , вот собсвенна :
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:09) [7]

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


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

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


 
Johnmen ©   (2004-04-20 12:16) [9]

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


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

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


 
ЮЮ ©   (2004-04-21 04:08) [11]

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-21 07:39) [12]

Прошу прощения за неясно выраженную постановку задачи. Так вот есть такая выборка ( из 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.


 
sniknik ©   (2004-04-21 08:20) [13]

а по моему должно быстро сработать,...
SELECT *
FROM document
WHERE num_doc in (select num_doc from document where nfl_num = 5905)

при условии конечно что есть индес у полей nfl_num и num_doc, ну и конечно не вся таблица имеет значение в nfl_num 5905, а только пара как показано. (остальные ограничители только запутывают селект, попробуй сначала так)


 
TL   (2004-04-21 08:29) [14]

sniknik
надо получить поля не только из document


 
ЮЮ ©   (2004-04-21 08:31) [15]

К сожалению в 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
тогда посмотрим дальше :-)


 
Johnmen ©   (2004-04-21 09:18) [16]

Может я чего не понял, но однозначный ответ уже прозвучал в [9]


 
ЮЮ ©   (2004-04-21 09:31) [17]

в [9] была только рекомендация:

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


 
Johnmen ©   (2004-04-21 09:40) [18]

Нет, не рекомендация, а именно ответ...


 
TL   (2004-04-21 09:54) [19]

А связей там неочень много получается?
если определяю их так :
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)


 
ЮЮ ©   (2004-04-21 09:56) [20]

[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 12:14) [21]

Делаю, в соответствии с советами - ничего не получается.
Вот :
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
В результате ничего не выходит, что я недопонимаю???


 
Johnmen ©   (2004-04-21 12:18) [22]

>что я недопонимаю???

То, что необходимо указать связь d с d1.


 
TL   (2004-04-21 12:24) [23]

Johnmen добавляю :  and (d.doc_num = d1.doc_num), результа никакого.


 
Johnmen ©   (2004-04-21 12:32) [24]

>TL
>результа никакого.

В смысле ?


 
TL   (2004-04-21 12:35) [25]

ну вобще этот запрос ничего не выводит . Хотя данные для вывода есть


 
Johnmen ©   (2004-04-21 12:44) [26]

Значит данных для вывода нет !
В соответствии с условиями отбора...
>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)

М-дя...


 
Johnmen ©   (2004-04-21 12:50) [27]

В посте [26] вторую часть не читать, как содержащую ошибочную инфу...:)


 
TL   (2004-04-21 12:59) [28]

Johnmen, а где вторая часть ?


 
Johnmen ©   (2004-04-21 13:00) [29]

>TL
>а где вторая часть ?

Начиная с третьей строки... :)


 
TL   (2004-04-21 13:04) [30]

хм, то есть
and (f.id_nfl= nf.id_nfl) and (f.id_nfl= nf1.id_nfl) - верно ? так эту срочку и оставить ?


 
Johnmen ©   (2004-04-21 13:05) [31]

Да откуда же я знаю про твою логику ???????????????


 
TL   (2004-04-21 13:38) [32]

Всем - всем -всем , кто помогал ,  огромное СПАСИБО , отдельное СПАСИБО Johnmen!!!
Ура - все получилось!



Страницы: 1 вся ветка

Текущий архив: 2004.05.16;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.025 c
4-1080683067
tux
2004-03-31 01:44
2004.05.16
Как получить информацию из консоли?


1-1083011006
MadSliMX
2004-04-27 00:23
2004.05.16
RxRichEdit. Глюки с кодировкой.


4-1079947689
Rem
2004-03-22 12:28
2004.05.16
Что такое OLE_HANDLE?


3-1082445302
TL
2004-04-20 11:15
2004.05.16
Query


1-1083288886
saNat
2004-04-30 05:34
2004.05.16
Реестр