Форум: "Базы";
Текущий архив: 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