Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.05.16;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.036 c
3-1082112624
T{}r(l-l
2004-04-16 14:50
2004.05.16
BDE отваливается


3-1082283525
Viktor
2004-04-18 14:18
2004.05.16
ограничение кол-ва записей


6-1080561800
Ламеридзэ
2004-03-29 16:03
2004.05.16
РФЦ


3-1082087860
Dark Man
2004-04-16 07:57
2004.05.16
А вот акаунт какой???


14-1083049988
JibSkeart
2004-04-27 11:13
2004.05.16
Генеалогическое дерево языков :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский