Изменить запрос

Оптимизировать SQL
Дата: 13.11.2008 11:22:49
Имеется запрос , в результате работы которого получается табличка с полями № счета, обороты по кредиту, обороты по дебиту.
select счет, кредит, дебит
from
(select кредит, счет from ....) cr
full outer join
(select дебит, счет from ....) db
on
cr.счет = db.счет


Можно ли уйти от full outer join ?
ога
Дата: 13.11.2008 11:40:02
select счет, кредит, дебит
from
(select кредит, счет from ....) cr
, (select дебит, счет from ....) db
where
cr.счет = db.счет
tru55
Дата: 13.11.2008 11:44:43
ога
select счет, кредит, дебит
from
(select кредит, счет from ....) cr
, (select дебит, счет from ....) db
where
cr.счет = db.счет


Как я понял, могут быть счета, у которых (по крайней мере, за некоторый период) оборот только по дебету или только по кредиту, отсюда и OUTER JOIN
Оптимизировать SQL
Дата: 13.11.2008 11:44:49
ога
select счет, кредит, дебит
from
(select кредит, счет from ....) cr
, (select дебит, счет from ....) db
where
cr.счет = db.счет


Если были по счету обороты по дебету, а по кредиту не было, тогда в данном случае в выборку они не попадут.

Запросы (select кредит, счет from ....) cr, (select дебит, счет from ....) db по отдельности очень хорошо работают, а вот в конструкции full outer join очень много времени занимают
Оптимизировать SQL
Дата: 13.11.2008 11:45:52
tru55


Как я понял, могут быть счета, у которых (по крайней мере, за некоторый период) оборот только по дебету или только по кредиту, отсюда и OUTER JOIN


совершенно верно
Cartesian
Дата: 13.11.2008 13:13:38
Избавиться от full outer join навряд ли удастся по самой логике запроса. Приблизительный план, думается, использует конструкции HASH JOIN (OUTER / ANTI). Попробуй поиграться с ручными настройками размеров рабочих областей сессии (workarea_size_policy=manual; hash_area_size=[чего-нибудь до 100 МБайт]). Возможно, хэш-соединение для твоих размеров таблиц многопроходным получается. Как минимум до однопроходного уменьшишь, как максимум - до оптимального.
Добрый Э - Эх
Дата: 13.11.2008 13:20:54
2 автор.
Надо думать, что где-то ещё есть таблица со счетами?
Кто мешает использовать её в запросе, присоединяя к ней дебит/кредит по левому соединению?
Добрый Э - Эх
Дата: 13.11.2008 13:21:55
Оптимизировать SQL
Можно ли уйти от full outer join ?
Как вариант - заменить его на самодельную реализацию через UNION ALL двух левых соединений.
типа так?
Дата: 13.11.2008 14:06:12
Оптимизировать SQL,

select счет, sum(кредит), sum(дебит)
from
(select кредит, 0 дебит счет from ....
union all
select 0, дебит, счет from ....
) db
group by Счет
Оптимизировать SQL
Дата: 13.11.2008 14:17:19
Добрый Э - Эх
2 автор.
Надо думать, что где-то ещё есть таблица со счетами?
Кто мешает использовать её в запросе, присоединяя к ней дебит/кредит по левому соединению?

Спаисбо, помогло.