Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 пролема с 1  [new]
supersn
Member

Откуда:
Сообщений: 58
Проблема... есть запрос... внутри запроса вычисляется суммы... при добавлении к сумме 1 запрос выполняется в 2 раза больше. (не 4 сек, а 8)
with   docs AS  
        (SELECT doc.ID, (el_timedepend_additional.get_timedep_vat_rate(dd.vat_type_id,doc.document_date)/100) AS vat
          FROM doc_document doc, doc_debit dd
         WHERE dd.ID = doc.ID
           and doc.STATUS_ID = 3    
           AND doc.document_date BETWEEN '01.02.2008' AND '29.02.2008'),
  tovar AS  
        (SELECT   ddr.good_id, SUM (ddr.sum_client) AS sum_client,
                 SUM (ROUND ( ddr.sum_client *d.vat, 2)) AS sum_with_vat_4, --так 8 секунд
                 SUM (ROUND ( ddr.sum_client *(1+ d.vat), 2)) AS sum_with_vat_8,  -- а так 4 секунди
                 SUM (ROUND (ddr.sum_client * d.vat, 2)) AS vat
            FROM doc_debit_record ddr, docs d
           WHERE ddr.document_id = d.ID AND ddr.sum_client <> 0
        GROUP BY ddr.good_id)
SELECT vdg.NAME   ,tovar.sum_with_vat_4, tovar.vat
  FROM tovar, v_dic_good vdg
 WHERE tovar.good_id = vdg.ID
31 мар 08, 20:01    [5483722]     Ответить | Цитировать Сообщить модератору
 Re: пролема с 1  [new]
supersn
Member

Откуда:
Сообщений: 58
упс... комментарии перепутал...
Подскажите ,плз, почему так и как можно обойти?!
31 мар 08, 20:04    [5483729]     Ответить | Цитировать Сообщить модератору
 Re: пролема с 1  [new]
concepts
Member

Откуда: из засады
Сообщений: 279
Описание с комментарием расходятся
31 мар 08, 20:04    [5483730]     Ответить | Цитировать Сообщить модератору
 Re: пролема с 1  [new]
Leonid Gurevich
Member

Откуда:
Сообщений: 2242
Сравните планы выполнения этих двух запросов. Вероятно они разные.
31 мар 08, 20:17    [5483778]     Ответить | Цитировать Сообщить модератору
 Re: пролема с 1  [new]
supersn
Member

Откуда:
Сообщений: 58
план совершенно одинаковый
1 апр 08, 10:51    [5485189]     Ответить | Цитировать Сообщить модератору
 Re: пролема с 1  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
А Вы время мерили сколько раз? :)
1 апр 08, 11:00    [5485295]     Ответить | Цитировать Сообщить модератору
 Re: пролема с 1  [new]
wth
Guest
Подозрение, что "docs" два раза вычисляется. Первый раз сам по себе, а второй раз в "tovar", для того чтобы 1 прибавить. А если +1 перенести в docs?
1 апр 08, 11:01    [5485305]     Ответить | Цитировать Сообщить модератору
 Re: пролема с 1  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5964
Попробуй так

SUM (ROUND ( ddr.sum_client + ddr.sum_client * d.vat, 2)) AS sum_with_vat_8,  

Если ddr.sum_client округлять не нужно, то можно сделать и так:


SUM(ddr.sum_client) + SUM (ROUND (ddr.sum_client * d.vat, 2)) 

Если не ошибаюсь, ты добавляешь ещё один SUM, а это не самая простая функция.

Собственно SUM(ddr.sum_client) у тебя уже вычисляется в другой колонке, так что не надо дважды вычислят SUM. Просто сложи sum_client и vat во внешнем запросе.
1 апр 08, 11:08    [5485367]     Ответить | Цитировать Сообщить модератору
 Re: пролема с 1  [new]
supersn
Member

Откуда:
Сообщений: 58
mcureenab
Попробуй так

SUM (ROUND ( ddr.sum_client + ddr.sum_client * d.vat, 2)) AS sum_with_vat_8,  

Если ddr.sum_client округлять не нужно, то можно сделать и так:


SUM(ddr.sum_client) + SUM (ROUND (ddr.sum_client * d.vat, 2)) 

Если не ошибаюсь, ты добавляешь ещё один SUM, а это не самая простая функция.

Собственно SUM(ddr.sum_client) у тебя уже вычисляется в другой колонке, так что не надо дважды вычислят SUM. Просто сложи sum_client и vat во внешнем запросе.


К сожалению это бухгалтерия и так считается НДС... поэтому округлять нужно каждый результат.
эту ... единицу куда только не пробовал засунуть(и в with отдельным полем, ивнешний селект на with...), результат тот же - 8 сек.
1 апр 08, 13:25    [5486537]     Ответить | Цитировать Сообщить модератору
 Re: пролема с 1  [new]
stax..
Guest
увеличится ли на 4 сек если добавить?
                 SUM (ROUND ( ddr.sum_client *(2+ d.vat), 2))+
                 SUM (ROUND ( ddr.sum_client *(1+ d.vat), 2)) AS sum_with_vat_8,  
                 SUM (ROUND (ddr.sum_client * d.vat, 2)) AS vat

.....
stax
1 апр 08, 16:17    [5487895]     Ответить | Цитировать Сообщить модератору
 Re: пролема с 1  [new]
Leonid Gurevich
Member

Откуда:
Сообщений: 2242
wth
Подозрение, что "docs" два раза вычисляется. Первый раз сам по себе, а второй раз в "tovar", для того чтобы 1 прибавить. А если +1 перенести в docs?


Добавьте в DOCS хинт /*+ materialize */ или ROWNUM() в третье поле, чтобы материализовать это представление. Тогда этот подзапрос будет выполняться только один раз.
1 апр 08, 18:23    [5488894]     Ответить | Цитировать Сообщить модератору
 Re: пролема с 1  [new]
supersn
Member

Откуда:
Сообщений: 58
Leonid Gurevich
wth
Подозрение, что "docs" два раза вычисляется. Первый раз сам по себе, а второй раз в "tovar", для того чтобы 1 прибавить. А если +1 перенести в docs?


Добавьте в DOCS хинт /*+ materialize */ или ROWNUM() в третье поле, чтобы материализовать это представление. Тогда этот подзапрос будет выполняться только один раз.


Ухх... ЕЩЁ И КАК ПОМОГЛО... результат - 1 сек! Спасибо ...
2 апр 08, 11:06    [5490778]     Ответить | Цитировать Сообщить модератору
 Re: пролема с 1  [new]
supersn
Member

Откуда:
Сообщений: 58
Вот только я всегда думал ЧТО WITH и должен выполняться 1 раз... Или я что-то не так думал?!
2 апр 08, 11:12    [5490823]     Ответить | Цитировать Сообщить модератору
 Re: пролема с 1  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
supersn
Вот только я всегда думал ЧТО WITH и должен выполняться 1 раз... Или я что-то не так думал?!
Не так :)
2 апр 08, 11:21    [5490886]     Ответить | Цитировать Сообщить модератору
 Re: пролема с 1  [new]
Leonid Gurevich
Member

Откуда:
Сообщений: 2242
supersn
Вот только я всегда думал ЧТО WITH и должен выполняться 1 раз... Или я что-то не так думал?!

Не обязательно. Oracle может трансформировать запрос.
2 апр 08, 17:35    [5494060]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить