Страница 1 из 1
Почему виснет ? :(
Добавлено: 28 фев 2005, 01:47
Deniska
Хай All
Вот этот запросец выыполняется 16 секунтд
FOR SELECT DISTINCT i.id, i.TO_ID, i.USER_ID, i.DOC_TYPE, cast((i.doc_sum*i.currency_value) as numeric(16,2)) r_sum, cast(ot.DOC_SUM as numeric(16,2)), ot.THE_DATE, cast(opl.DOC_SUM as numeric(16,2)), opl.THE_DATE, c.name, i.DOC_NO, i.THE_DATE, i.CURRENCY_ID, i.CURRENCY_VALUE
FROM invoices i, pid p, GET_DOC_SUM_SEB ot, GET_DOC_SUM_SEB_OPL opl, customer c
WHERE i.interval_id <> 9000
AND i.doc_type in (1, 5, 11)
AND ot.PARENT_ID=i.id
AND i.CURRENCY_ID = 1
AND opl.PARENT_ID=i.id
AND p.pid=i.id
AND c.id = i.RESPONSIBLE_ID
AND i.from_id in (SELECT id FROM customer WHERE type_id=1 AND firm = :firm)
но если добавить хотя бы and i.id>0 висим без всяких признаков жизни
Добавлено: 28 фев 2005, 06:50
Klyk
а почему Where ...=... , .... in (select...) join разве запретили?
или я чего-то опять не так понял?
Добавлено: 28 фев 2005, 09:22
kdv
на тему вложенного in select тебе правильно заметили, а по поводу and i.id>0 - скорее всего для I выбираются все записи, соответственно используется еще и индекс по i.id, да потом еще все записи сортируются по distinct...
и вообще, неплохо было бы ВСЕГДА УКАЗЫВАТЬ ВЕРСИЮ СЕРВЕРА.
Добавлено: 28 фев 2005, 13:07
Deniska
Сервер полторушный
Скажем так проблема в том что ,вообще заджоинить мне надо вот эту вещь GET_DOC_SUM_SEB_OPL по parent_id
пишу
FOR SELECT DISTINCT i.id, i.TO_ID, i.USER_ID, i.DOC_TYPE, cast((i.doc_sum*i.currency_value) as numeric(16,2)) r_sum, cast(ot.DOC_SUM as numeric(16,2)), ot.THE_DATE, cast(opl.DOC_SUM as numeric(16,2)), opl.THE_DATE, c.name, i.DOC_NO, i.THE_DATE, i.CURRENCY_ID, i.CURRENCY_VALUE
FROM invoices i left join GET_DOC_SUM_SEB_OPL opl on (opl.parent_id=i.id) , pid p, GET_DOC_SUM_SEB ot, customer c
WHERE i.interval_id <> 9000
AND i.doc_type in (1, 5, 11)
AND ot.PARENT_ID=i.id
AND i.CURRENCY_ID = 1
AND p.pid=i.id
AND c.id = i.RESPONSIBLE_ID
AND i.from_id in (SELECT id FROM customer WHERE type_id=1 AND firm = :firm)
результат - виснет хотя если просто i.id=opl.parent_id и убрать джоин
, то всё нормально но мне нужен именно лефт джоин ,
мне нужны пустые суммы
Добавлено: 28 фев 2005, 13:09
Deniska
К стати джоинить cutomer низя так как у меня два поля ссылаются на него
AND c.id = i.RESPONSIBLE_ID
AND i.from_id in (SELECT id FROM customer WHERE type_id=1 AND firm = :firm)
Добавлено: 28 фев 2005, 14:54
kdv
эээээ
1. нельзя мешать явный и неявный join
2. одну и ту же таблицу заджойнить 2 раза элементарно
select ...
from customers sellers, customer buyers, orders
where orders.buyer = buyers.id and orders.seller = sellers.id
пример схематичный.
Добавлено: 28 фев 2005, 15:59
Deniska
Переписал , как правильно , всё равно при добавлении invoices i left join GET_DOC_SUM_SEB_OPL OPL on (i.id=OPL.parent_id) вместо and i.id=OPL.parent_id висит
SELECT DISTINCT i.id, i.TO_ID, i.USER_ID, i.DOC_TYPE, cast((i.doc_sum*i.currency_value) as numeric(16,2)) r_sum, cast(ot.DOC_SUM as numeric(16,2)), ot.THE_DATE, cast(opl.DOC_SUM as numeric(16,2)), opl.THE_DATE, resp.name, i.DOC_NO, i.THE_DATE, i.CURRENCY_ID, i.CURRENCY_VALUE
FROM invoices i left join GET_DOC_SUM_SEB_OPL OPL on (i.id=OPL.parent_id), pid p, GET_DOC_SUM_SEB ot, customer resp,customer post
WHERE i.interval_id <> 9000
AND i.doc_type in (1, 5, 11)
AND ot.PARENT_ID=i.id
AND i.CURRENCY_ID = 1
AND p.pid=i.id
AND i.RESPONSIBLE_ID=resp.id
AND i.from_id=post.id and post.type_id=1 AND post.firm = :firm
что на это скажете ?
самое главное в том что мне надо, по каким документам не было проплат или суммы не сходятся , GET_DOC_SUM_SEB_OPL возвращает родителей проплаченных документов
Добавлено: 28 фев 2005, 18:20
eugeney
Deniska писал(а):К стати джоинить cutomer низя так как у меня два поля ссылаются на него
AND c.id = i.RESPONSIBLE_ID
AND i.from_id in (SELECT id FROM customer WHERE type_id=1 AND firm = :firm)
Попробуй
AND exists (SELECT id FROM customer WHERE type_id=1 AND firm = :firm and id=i.from_id)
Добавлено: 28 фев 2005, 19:19
Deniska
Чуть выше я переписал с учётом замечаний, про неправильное использование IN

Добавлено: 28 фев 2005, 19:26
kdv
ты лучше вот эту гадость перепиши
Код: Выделить всё
FROM invoices i left join GET_DOC_SUM_SEB_OPL OPL on (i.id=OPL.parent_id), pid p, GET_DOC_SUM_SEB ot, customer resp,customer post
нельзя мешать в кучу явные и неявные join. написал left join, будь добер все остальные таблицы объединить тоже явно по join.