SQL.RU
 client/server technologies
 
 Главная | Документация | Статьи | Книги | Форум | Опросы | Рассылка | Работа | Поиск | FAQ |

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

Откуда:
Сообщений: 9
Здравствуйте!
В запросе нужно отобрать все проводки от даты последнего нуля на счете (acc_accounts.amount = 0) или от даты открытия счета (ra.acc_open_date), если нулевых остатков вообще не было, и до отчетной даты (p_end_date). В подзапросе получаем дату последнего нуля или, если не было таких остатков дату - '01.01.1700', которая нужна только лишь для определения того, с какой датой сравнивать дату проводки (с датой открытия или с датой последнего нуля на счете).

SELECT  act.trns_code, act.trns_db, act.trns_ref_acc_db_id, ra.acc_currency, ra.acc_branch 
FROM acc_transactions act, (SELECT ref_acc_id, MAX(DECODE(amount,0,as_of_date,to_date('01.01.1700','DD.MM.YYYY'))) max_date
                            FROM acc_accounts 
                            WHERE as_of_date < :p_end_date
		            GROUP BY ref_acc_id) acc, ref_accounts ra
 WHERE act.trns_ref_acc_db_id = acc.ref_acc_id
     AND ra.ref_acc_id = act.trns_ref_acc_db_id
     AND ra.acc_no LIKE '603%'
     AND ra.acc_type_ap LIKE 'A'
     AND act.as_of_date >= DECODE(acc.max_date,to_date('01.01.1700','DD.MM.YYYY'),ra.acc_open_date,acc.max_date)
     AND act.as_of_date < :p_end_date
     AND act.trns_ref_acc_db_id = 65105488

По одному счету время выполнения приемлимое, стоимость запроса 539.
Необходимо этим запросом обработать все счета '603', то есть последнее условие на id счета нужно убрать. Запрос в результате чего работает очень долго. Подскажите, пожалуйста, как можно его ускорить. Буду рада любому дельному совету.
15 дек 06, 20:06    [3544585] Ответить | Цитировать    Сообщить модератору

 Вопрос по оптимизации запроса   [new]
assoli
Member

Откуда:
Сообщений: 9
Да, еще маленькое замечание.
При соединении таблиц используется MERGE JOIN CARTESIAN. Что плохо и не очень понятно почему оптимизатор так делает. На хинты USE_HASH и NO_USE_MERGE никак не реагирует.
15 дек 06, 20:16    [3544620] Ответить | Цитировать    Сообщить модератору

 Re: Вопрос по оптимизации запроса   [new]
*Tank*
Member

Откуда: Москва
Сообщений: 3150
Может сначала обрезать таблицы.т.е decode потом like в условие. И сделать индексы по like.
15 дек 06, 21:35    [3544783] Ответить | Цитировать    Сообщить модератору

 Re: Вопрос по оптимизации запроса   [new]
evostr
Member

Откуда: Е-бург
Сообщений: 1271
assoli
Да, еще маленькое замечание.
При соединении таблиц используется MERGE JOIN CARTESIAN. Что плохо и не очень понятно почему оптимизатор так делает. На хинты USE_HASH и NO_USE_MERGE никак не реагирует.

План запроса приведите
15 дек 06, 22:42    [3544934] Ответить | Цитировать    Сообщить модератору

 План запроса   [new]
assoli
Member

Откуда:
Сообщений: 9


К сообщению приложен файл (Plan.doc - 31Kb) cкачать
15 дек 06, 23:32    [3545028] Ответить | Цитировать    Сообщить модератору

 Re: Вопрос по оптимизации запроса   [new]
Коклюш Дифтериевич
Guest
assoli
to_date('01.01.1700','DD.MM.YYYY')

Редко удается увидеть базуху, работающую со времен Ивана Грозного
16 дек 06, 11:10    [3545483] Ответить | Цитировать    Сообщить модератору

 Re: Вопрос по оптимизации запроса   [new]
aars
Member

Откуда:
Сообщений: 242
Чего то у меня подозрение что вы план приложили для sql-я с "AND trns_ref_acc_db_id = 65105488"
Проверьте пожалуйста.

PS
И план-то неплохой. Чего вы MERGE JOIN CARTESIAN на десятке строк испугались?
если стоимость сканироания (при возврате 5-и строк) по уникальному индексу =221, то почему вас удивляет стоимость 536 всего запроса?
16 дек 06, 11:56    [3545513] Ответить | Цитировать    Сообщить модератору

 Re: Вопрос по оптимизации запроса   [new]
Volder
Member

Откуда: Москва
Сообщений: 471
2 assoli
а по каким полям у вас индексы ACC_TRNS_REF_ACC_DB_ID_IDX и ACC_ACC_UQ1?

кстати, на скорость наверно не повлияет, но вместо:
assoli
     AND act.as_of_date >= DECODE(acc.max_date,to_date('01.01.1700','DD.MM.YYYY'),ra.acc_open_date,acc.max_date)

можно
AND act.as_of_date >= greatest(ra.acc_open_date,acc.max_date)
16 дек 06, 12:40    [3545549] Ответить | Цитировать    Сообщить модератору

 Вопрос по оптимизации запроса   [new]
assoli
Member

Откуда:
Сообщений: 9
Может можно как-нибудь аналитическими функциями воспользоваться для поиска последнего нулевого остатка, чтобы не перебирать все записи, а, допустим, брать частями по 30 записей и находить среди них нулевой остаток, если нет, брать следующие? Обрабатываемый набор будет уже меньше...Только как бы это записать?
17 дек 06, 23:26    [3547798] Ответить | Цитировать    Сообщить модератору

 Re: Вопрос по оптимизации запроса   [new]
eml78
Member

Откуда:
Сообщений: 546
Коклюш Дифтериевич
assoli
to_date('01.01.1700','DD.MM.YYYY')

Редко удается увидеть базуху, работающую со времен Ивана Грозного

Будьте точны, уважаемый, Грозный умер в 1584 году.
В 1700 на престоле был Петр I, так что вполне реально :)

Кстати имено этот год начался с 1 января, а до этого на Руси новый год праздновали 1 сентября.
18 дек 06, 10:56    [3548670] Ответить | Цитировать    Сообщить модератору

 Re: Вопрос по оптимизации запроса   [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 6209
aars
Чего то у меня подозрение что вы план приложили для sql-я с "AND trns_ref_acc_db_id = 65105488"
Проверьте пожалуйста.
Подтверждаю подозрение, что это план от другого запроса.
Например, в запросе используются три таблицы, а в плане их всего две...
Пожалуйста, проверьте и пришлите соответствующий план.
18 дек 06, 11:04    [3548710] Ответить | Цитировать    Сообщить модератору

 Re: Вопрос по оптимизации запроса   [new]
Я и ёжик
Member

Откуда: СПб
Сообщений: 1511
assoli
Да, еще маленькое замечание.
При соединении таблиц используется MERGE JOIN CARTESIAN. Что плохо и не очень понятно почему оптимизатор так делает.

В некоторых случаях Oracle преобразует предикаты при наличии фильтра с константой на поле из предиката соединения и теряет сам предикат соединения ( см. книгу Льюиса по CBO).
т.е.
было t1.a = t2.a and t1.a=const
после преобразования
t2.a = const and t1.a=const
предикат соединения пропал, ничего кроме cartesian не остается.
Можно попробовать продублировать предикат соединения или вручную прописать все дополниетльные производные предикаты.
18 дек 06, 11:40    [3548997] Ответить | Цитировать    Сообщить модератору

 Re: Вопрос по оптимизации запроса   [new]
Jannny
Member

Откуда: Спб
Сообщений: 6425
Я и ёжик
было t1.a = t2.a and t1.a=const
после преобразования
t2.a = const and t1.a=const
предикат соединения пропал, ничего кроме cartesian не остается.
Можно попробовать продублировать предикат соединения
Думаешь, он не во всех подменит в такой ситуации?
18 дек 06, 11:43    [3549012] Ответить | Цитировать    Сообщить модератору

 Re: Вопрос по оптимизации запроса   [new]
Я и ёжик
Member

Откуда: СПб
Сообщений: 1511
Jannny
Я и ёжик
было t1.a = t2.a and t1.a=const
после преобразования
t2.a = const and t1.a=const
предикат соединения пропал, ничего кроме cartesian не остается.
Можно попробовать продублировать предикат соединения
Думаешь, он не во всех подменит в такой ситуации?

Вроде должен только один отбросить, но сам не проверял. И начиная с 10-ки ( а может и раньше )опять же вроде уже не отбрасывает, это вроде бага было. Проверить не могу, дома чаек пью :)
18 дек 06, 11:55    [3549097] Ответить | Цитировать    Сообщить модератору

 Re: Вопрос по оптимизации запроса   [new]
Jannny
Member

Откуда: Спб
Сообщений: 6425
Я и ёжик
Вроде должен только один отбросить, но сам не проверял. И начиная с 10-ки ( а может и раньше )опять же вроде уже не отбрасывает, это вроде бага было.
В книге написано, что должен. Пытаюсь экспериментировать. Но получить cartesian не удается, но у меня нет указанной 9.2.0.6 (так что видимо все-таки раньше поправили).

А кто-нибудь попробовать на 6ке может? (может даже автор, если проявится и ситуация именно такая ) Хотя, конечно, грешно не доверять Льюису :)

Я и ёжик
Проверить не могу, дома чаек пью :)
Хорошо тебе :)
18 дек 06, 12:13    [3549238] Ответить | Цитировать    Сообщить модератору

 План запроса (2)   [new]
assoli
Member

Откуда:
Сообщений: 9


К сообщению приложен файл (План.doc - 35Kb) cкачать
18 дек 06, 12:28    [3549338] Ответить | Цитировать    Сообщить модератору

 Re: План запроса (2)   [new]
Jannny
Member

Откуда: Спб
Сообщений: 6425
assoli
Как насчет предикатов?
18 дек 06, 14:38    [3550355] Ответить | Цитировать    Сообщить модератору

 Re: Вопрос по оптимизации запроса   [new]
Fucker
Member

Откуда:
Сообщений: 1527
Я и ёжик
Проверить не могу, дома чаек пью :)
А ёжику налил?

Fucker
18 дек 06, 14:50    [3550439] Ответить | Цитировать    Сообщить модератору

 Re: Вопрос по оптимизации запроса   [new]
assoli
Member

Откуда:
Сообщений: 9
Продублирование предикатов помогло.
18 дек 06, 14:51    [3550445] Ответить | Цитировать    Сообщить модератору

 План запроса (3)   [new]
assoli
Member

Откуда:
Сообщений: 9
План запроса после дублирования предикатов.

К сообщению приложен файл (План3.doc - 34Kb) cкачать
18 дек 06, 14:53    [3550454] Ответить | Цитировать    Сообщить модератору

 Re: Вопрос по оптимизации запроса   [new]
Jannny
Member

Откуда: Спб
Сообщений: 6425
Jannny
assoli
Как насчет предикатов?

assoli
Продублирование предикатов помогло.
На самом деле предлагалось просто более полный план выложить :) Но помогло, так помогло. А версия кстати какая?
18 дек 06, 14:55    [3550472] Ответить | Цитировать    Сообщить модератору

 Re: Вопрос по оптимизации запроса   [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 8335
assoli
Продублирование предикатов помогло.

а это?
t1.a = t2.a+0
или
t1.a = t2.a||null
(попробовать самому - нынче негде :)
18 дек 06, 15:03    [3550514] Ответить | Цитировать    Сообщить модератору

 Re: Вопрос по оптимизации запроса   [new]
_AndreyP
Member

Откуда: Krsk-->SPb
Сообщений: 429
Я и ёжик
Проверить не могу, дома чаек пью :)


В то время, как космические корабли, бороздят просторы вселенной.....
18 дек 06, 15:42    [3550818] Ответить | Цитировать    Сообщить модератору

 Версия   [new]
assoli
Member

Откуда:
Сообщений: 9
Версия - 9.2.0.7.0

Это
t1.a = t2.a+0
или
t1.a = t2.a||null
не попробовала. Нет возможности на данный момент. А почему в таком виде будет работать быстрее?
18 дек 06, 15:48    [3550870] Ответить | Цитировать    Сообщить модератору

 Re: Версия   [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 8335
assoli
..А почему в таком виде будет работать быстрее?

Что быстрее - совсем не факт.. (но бывает == от конкретики вашей зависит).
Вообще, я имел ввиду исключительно вопрос подавления бажного картезианца
18 дек 06, 17:02    [3551472] Ответить | Цитировать    Сообщить модератору

Все форумы / Oracle Ответить
Generated time: 234ms.
Rambler's Top100 Powered by ActualForum 1.5.3 [s1] Copyright (c) Alex Sibilev 2000-2010