powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Экспоненциальный рост времени выполнения отчета
33 сообщений из 33, показаны все 2 страниц
Экспоненциальный рост времени выполнения отчета
    #39453732
AntSol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Отцы приветствую.


Есть следующая проблема: скрипт считает среднее значение использования карт в течении определенной даты(фильтр). С какого то момента подсчет за месяц стал занимать очень много времени. Раньше час-два. Теперь сутки\полтора. Опытным путем установил, что за день считаем 5 секунд, за 5 дней 10 минут. За 15 дней 11 часов и тд...Я вот думаю может есть какая то проблема с пространством TEMP или ему надо добавить еще один REDO файлик. Можете что то посоветовать?
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453734
londinium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntSol,
А есть все необходимые индексы?
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453740
AntSol,

а мне думается что у вас там slow-by-slow построчная обработка в многократно вложенных друг в друга циклах.
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453748
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntSol,

То есть сначала предполагает угадать код, а потом куда уходит время.
Ждем телепатов.
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453751
AntSol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
londinium,

С индексами все в порядке. Конечно попробую перестроить, но не думаю что причина в этом.
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453752
AntSol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop,

Код чего? Запроса?
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453758
AntSol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

Скрипт простой:


with mainselect as(
select t_data.*, division.code as dcode, operator.code as ocode
from t_data
join division on (division.id = t_data.id_division)
join operator on (operator.id = division.id_operator)
where t_data.kind in (16,17,34)
and nvl(t_data.card_series, t_data.new_card_series) in (11,20,21,30,36,40,50,60)
and t_data.date_of between TO_DATE('01.10.2016 00:00:00', 'dd.mm.yyyy hh24:mi:ss')
and TO_DATE('01.11.2016 00:00:00', 'dd.mm.yyyy hh24:mi:ss')
order by nvl(t_data.card_series, t_data.new_card_series), t_data.card_num
)
select nvl(ms.card_series, ms.new_card_series) as "серии", ms.card_num "Номер карты", COUNT(ms.id) "Среднее",
(SELECT COUNT(mainselect.id) from mainselect where dcode = 0001 and ms.card_num = mainselect.card_num) as "0001",
(SELECT COUNT(mainselect.id) from mainselect where dcode = 0101 and ms.card_num = mainselect.card_num) as "0101",
(SELECT COUNT(mainselect.id) from mainselect where dcode = 0102 and ms.card_num = mainselect.card_num) as "0102",
(SELECT COUNT(mainselect.id) from mainselect where dcode = 0103 and ms.card_num = mainselect.card_num) as "0103"
from mainSelect ms
group by nvl(ms.card_series, ms.new_card_series), ms.card_num
order by nvl(ms.card_series, ms.new_card_series), ms.card_num
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453771
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntSol,

1) Условия из where перекинь в join:
Код: plsql
1.
2.
3.
4.
select t_data.*, division.code as dcode, operator.code as ocode
from t_data
join division on (division.id = t_data.id_division) and  t_data.kind in (16,17,34)
and nvl(t_data.card_series, t_data.new_card_series) in (11,20,21,30,36,40,50,60) 



2) Order из with убирай.

3) (SELECT COUNT(mainselect.id) from mainselect where dcode = 0001 and ms.card_num = mainselect.card_num) as "0001",
(SELECT COUNT(mainselect.id) from mainselect where dcode = 0101 and ms.card_num = mainselect.card_num) as "0101",
(SELECT COUNT(mainselect.id) from mainselect where dcode = 0102 and ms.card_num = mainselect.card_num) as "0102",
(SELECT COUNT(mainselect.id) from mainselect where dcode = 0103 and ms.card_num = mainselect.card_num) as "0103"

заменяем на
Код: plsql
1.
2.
3.
4.
sum(case when dcode = '0001' /*нет такого числа как ноль-ноль-ноль-один*/ then 1 else 0 as "0001",
sum(case when dcode = '0101' then 1 else 0 as "0101",
sum(case when dcode = '0102' then 1 else 0 as "0102",
sum(case when dcode = '0103' then 1 else 0 as "0103"
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453781
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DshedooУсловия из where перекинь в joinПросвети теперь как это отразиться на плане.

PS. Переписывание коррелированных скаляров в case - совет по делу.
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453788
AntSol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возможно переписывание скрипта даст некоторый прирост производительности, но у меня все ощущение, что где то ему не хватает пространства....так не думаете?
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453789
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntSol,

посмотреть типы t_data.kind, t_data.card_series, t_data.new_card_series если они не number перевести in в строки (('16','17','34'))
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453791
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntSolу меня все ощущениеЧто-то вас много повылазило на форум в последнее время с ощущениями.
Использовать мозг и куда уходит время становится все менее популярным.
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453792
AntSol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXL,

number
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453793
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntSol,

operator.code as ocode в дальнейшем не используется, может не надо добавлять таблицу
Код: plsql
1.
join operator on (operator.id = division.id_operator)
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453796
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntSol,

Я бы вообще переписал это чудо без with mainselect as(
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453801
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntSol,

1) В with'е сразу определи nvl(ms.card_series, ms.new_card_series), причём лучше через case.

2) В with'e условие
Код: plsql
1.
 and nvl(t_data.card_series, t_data.new_card_series) in (11,20,21,30,36,40,50,60) 

замени на

Код: plsql
1.
and (t_data.card_series (11,20,21,30,36,40,50,60) or (t_data.card_seriesis null and  t_data.new_card_series in (11,20,21,30,36,40,50,60) )



3) COUNT(ms.id) замени на sum(1).
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453810
AntSol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dshedoo,

в написании запросов я не очень, больше админю оракл пойду к разрабам тогда. Спасибо.
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453811
Alexander Ryndin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntSolDshedoo,

в написании запросов я не очень, больше админю оракл пойду к разрабам тогда. Спасибо.Админу неплохо было бы взять SQL Monitoring скрипта и глянуть на что время уходит. Я бы сильно подозревал, что резкий рост времени обусловлен вылезанием в Temp
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453814
AntSol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexander Ryndin,


Мое чутье говорит о том же. Да и TEMP у меня уже на краю. Просто не хочется сразу стопать БД и удалять его, создав новый. Хоть это и не сложно.
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453821
Q.Tarantino
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntSolПросто не хочется сразу стопать БД и удалять его, создав новый.
а что это даст и зачем стопать БД???
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453828
AntSol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Q.Tarantino,


Мне казалось из mount или nomount необходимо делать. Хотя возможно переключить и так можно. Обычно стопал во избежание проблем...
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453830
AntSol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AntSol,

Ну и сделаю его побольше. Со стандартным развером в 30 гигов точно испытывал проблемы но при индексации
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453836
Alexander Ryndin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntSolAntSol,

Ну и сделаю его побольше. Со стандартным развером в 30 гигов точно испытывал проблемы но при индексацииЕще раз.
Админу неплохо было бы взять SQL Monitoring скрипта и глянуть на что время уходит. Я бы сильно подозревал, что резкий рост времени обусловлен вылезанием в Temp
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453840
AntSol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alexander Ryndin,


Окей, попробую. Ни разу не использовал данный инструмент, так как кроме простейших запросов ничего не пишу.
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453852
Фотография Vladimir Filin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntSol,
Alexander Ryndin... Я бы сильно подозревал, что резкий рост времени обусловлен вылезанием в Temp
Если вылезание в TEMP имеет место быть и не уйдёт после оптимизации , несколько доков для подумать/попробовать:
tablespace_group_clause for temporary tablespaces

Temporary tablespace group tips

Storage Management for OLAP (не совсем в тему, но почитать стоит)
Oracle 11R2A tablespace group lets you assign multiple temporary tablespaces to a single user and increases the addressability of temporary tablespaces.
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453893
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DshedooAntSol,

1) В with'е сразу определи nvl(ms.card_series, ms.new_card_series), причём лучше через case.

2) В with'e условие
Код: plsql
1.
 and nvl(t_data.card_series, t_data.new_card_series) in (11,20,21,30,36,40,50,60) 

замени на

Код: plsql
1.
and (t_data.card_series (11,20,21,30,36,40,50,60) or (t_data.card_seriesis null and  t_data.new_card_series in (11,20,21,30,36,40,50,60) )



3) COUNT(ms.id) замени на sum(1).Хоспаде индусский тюнинг оказывается процветает и среди русско-язычных.
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453901
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntSol,

Для того чтоб определить факт вылезания в темп (даже после окончания выполнения) - вовсе необязательно смотреть SQL monitor.

1) Можно в v$active_session_history глянуть для твоего sql_id наиличие событий ожидания direct path read temp/direct path write temp или просто посмотреть колонку temp_space_allocated.
2) Либо table(dbms_xplan.display_cursor('8xtskaq5f0000', format => 'MEMSTATS LAST')) и смотреть колонку Used-Mem.
3) v$sql_workarea
etc

Но тебе стоит начать с избавления от коррелированных скаляров.
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453904
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В display_cursor, ясное дело, sql_id заменить на свой.
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453930
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopDshedooAntSol,

1) В with'е сразу определи nvl(ms.card_series, ms.new_card_series), причём лучше через case.

2) В with'e условие
Код: plsql
1.
 and nvl(t_data.card_series, t_data.new_card_series) in (11,20,21,30,36,40,50,60) 

замени на

Код: plsql
1.
and (t_data.card_series (11,20,21,30,36,40,50,60) or (t_data.card_seriesis null and  t_data.new_card_series in (11,20,21,30,36,40,50,60) )



3) COUNT(ms.id) замени на sum(1).Хоспаде индусский тюнинг оказывается процветает и среди русско-язычных.

Спасибо, конечно, но я просто считаю, что каждый дельный совет должен сопровождаться бесполезным)
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453935
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo,

Дельный совет: тебе лучше сидеть в read-only, чтоб на форуме было меньше чепухи.
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453968
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntSolDshedoo,

в написании запросов я не очень, больше админю оракл пойду к разрабам тогда. Спасибо.

Тогда попробуй вот такое, тоже тормозить будет за 5-10 дней

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select nvl(t_data.card_series, t_data.new_card_series) as "серии", 
t_data.card_num "Номер карты", 
COUNT(t_data.id) "Среднее",
Count(decode(division.code,'0001',1)) as "0001",
Count(decode(division.code,'0101',1)) as "0101",
Count(decode(division.code,'0102',1)) as "0102",
Count(decode(division.code,'0103',1)) as "0103"
from from t_data , division
where division.id = t_data.id_division
and t_data.kind in (16,17,34)
and nvl(t_data.card_series, t_data.new_card_series) in (11,20,21,30,36,40,50,60) 
and t_data.date_of between TO_DATE('01.10.2016 00:00:00', 'dd.mm.yyyy hh24:mi:ss') 
                                 and TO_DATE('01.11.2016 00:00:00', 'dd.mm.yyyy hh24:mi:ss') 

group by nvl(t_data.card_series, t_data.new_card_series), t_data.card_num
order by nvl(t_data.card_series, t_data.new_card_series), t_data.card_num
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39453972
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MaximaXXL,

from from написать как один from =) sorry
...
Рейтинг: 0 / 0
Экспоненциальный рост времени выполнения отчета
    #39454075
AntSol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaximaXXL,

Бро, ты полковник, ты на белом коне, ты командуешь парадом!!))))) Твой скрипт отработал за 2,5 минуты в промежутке месяца.


Всем остальным небезучастным и сочувствующим тоже спасибо!!
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Экспоненциальный рост времени выполнения отчета
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]