Почему виснет ? :(

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Deniska
Сообщения: 15
Зарегистрирован: 28 фев 2005, 01:11

Почему виснет ? :(

Сообщение Deniska » 28 фев 2005, 01:47

Хай 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 висим без всяких признаков жизни

Klyk
Сообщения: 100
Зарегистрирован: 26 окт 2004, 23:28

Сообщение Klyk » 28 фев 2005, 06:50

а почему Where ...=... , .... in (select...) join разве запретили?
или я чего-то опять не так понял?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 28 фев 2005, 09:22

на тему вложенного in select тебе правильно заметили, а по поводу and i.id>0 - скорее всего для I выбираются все записи, соответственно используется еще и индекс по i.id, да потом еще все записи сортируются по distinct...

и вообще, неплохо было бы ВСЕГДА УКАЗЫВАТЬ ВЕРСИЮ СЕРВЕРА.

Deniska
Сообщения: 15
Зарегистрирован: 28 фев 2005, 01:11

Сообщение Deniska » 28 фев 2005, 13:07

Сервер полторушный
Скажем так проблема в том что ,вообще заджоинить мне надо вот эту вещь 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 и убрать джоин
, то всё нормально но мне нужен именно лефт джоин ,
мне нужны пустые суммы

Deniska
Сообщения: 15
Зарегистрирован: 28 фев 2005, 01:11

Сообщение Deniska » 28 фев 2005, 13:09

К стати джоинить cutomer низя так как у меня два поля ссылаются на него
AND c.id = i.RESPONSIBLE_ID
AND i.from_id in (SELECT id FROM customer WHERE type_id=1 AND firm = :firm)

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 28 фев 2005, 14:54

эээээ

1. нельзя мешать явный и неявный join

2. одну и ту же таблицу заджойнить 2 раза элементарно

select ...
from customers sellers, customer buyers, orders
where orders.buyer = buyers.id and orders.seller = sellers.id

пример схематичный.

Deniska
Сообщения: 15
Зарегистрирован: 28 фев 2005, 01:11

Сообщение Deniska » 28 фев 2005, 15:59

Переписал , как правильно , всё равно при добавлении 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 возвращает родителей проплаченных документов

eugeney
Сообщения: 79
Зарегистрирован: 29 окт 2004, 18:51

Сообщение eugeney » 28 фев 2005, 18:20

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)

Deniska
Сообщения: 15
Зарегистрирован: 28 фев 2005, 01:11

Сообщение Deniska » 28 фев 2005, 19:19

Чуть выше я переписал с учётом замечаний, про неправильное использование IN :)

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 28 фев 2005, 19:26

ты лучше вот эту гадость перепиши

Код: Выделить всё

 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.

Ответить