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

нужно агрегировать часовые данные в дневные.

есть T_HOUR с часовыми данными (RESULT_TIME = 24/05/2017 00:00:00, 24/05/2017 01:00:00, 24/05/2017 02:00:00 и т.д.)
и T_DAY. таблицы партиционированы по RESULT_TIME по дню,
выходит что-то типа (запрос клеится и запускается через execute immediate)

insert RESULT_TIME, F1 into T_DAY
select TRUNC(RESULT_TIME), SUM(F1) from T_DAY
where RESULT_TIME = v_period_list

и вот вопрос как задавать даты.
список дат для агрегирования строится в пакете в виде varchar по алгоритму (определяется какие дни можно/нужно агрегировать)

to_date (''24/05/2017 00:00:00'', ''DD/MM/YYYY HH24:MI:SS''),
to_date (''28/05/2017 00:00:00'', ''DD/MM/YYYY HH24:MI:SS'') ,
to_date (''29/05/2017 00:00:00'', ''DD/MM/YYYY HH24:MI:SS'') ,
to_date (''03/06/2017 00:00:00'', ''DD/MM/YYYY HH24:MI:SS'') ,
to_date (''08/06/2017 00:00:00'', ''DD/MM/YYYY HH24:MI:SS'')

варианты:
1) where TRUNC(RESULT_TIME) in v_period_list - выходит фулскан из-за TRUNC

2) where (RESULT_TIME => to_date ('24/05/2017 00:00:00', 'DD/MM/YYYY HH24:MI:SS') and
RESULT_TIME < to_date ('25/05/2017 00:00:00', 'DD/MM/YYYY HH24:MI:SS')) OR
(RESULT_TIME => to_date ('25/05/2017 00:00:00', 'DD/MM/YYYY HH24:MI:SS') and
RESULT_TIME < to_date ('26/05/2017 00:00:00', 'DD/MM/YYYY HH24:MI:SS')) и так далее
т.е. изменить входящие даты на >=, < тоже фулскан - из за OR

3) where RESULT_TIME in ( to_date ('24/05/2017 00:00:00', 'DD/MM/YYYY HH24:MI:SS'),
to_date ('24/05/2017 01:00:00', 'DD/MM/YYYY HH24:MI:SS'),
to_date ('24/05/2017 02:00:00', 'DD/MM/YYYY HH24:MI:SS') и так далее
т.е. распарсить все входные даты на все входящие часы (по 24 на каждый день)

в теории работает быстро,

есть ли варианты лучше проще?
...
Рейтинг: 0 / 0
производительность
    #39470540
4wel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
insert RESULT_TIME, F1 into T_DAY
select TRUNC(RESULT_TIME), SUM(F1) from T_HOUR
where RESULT_TIME = v_period_list
...
Рейтинг: 0 / 0
производительность
    #39470542
4wel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну еще 4й вариант

insert RESULT_TIME, F1 into T_DAY
select * from (
select TRUNC(RESULT_TIME), SUM(F1) from T_HOUR
where RESULT_TIME = to_date ('24/05/2017 00:00:00', 'DD/MM/YYYY HH24:MI:SS')
union all
insert RESULT_TIME, F1 into T_DAY
select TRUNC(RESULT_TIME), SUM(F1) from T_HOUR
where RESULT_TIME = to_date ('24/05/2017 00:01:00', 'DD/MM/YYYY HH24:MI:SS'))
union all
...

и т.д. по часам
...
Рейтинг: 0 / 0
производительность
    #39470546
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4wel,

Или так:
Код: plsql
1.
2.
3.
4.
5.
with t as (select '01.01.2017' vDate from dual union all
select '02.01.2017' vDate from dual)

select to_date(vDate||HH,'dd.mm.yyyyhh24') as Date_
from t, (select to_char(level-1,'09') HH from dual connect by level <= 24)
...
Рейтинг: 0 / 0
производительность
    #39470547
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4welтоже фулскан - из за ORПри объединении предикатов по диапазонам с помощью OR Oracle может применить concatenation в плане.
Если он этого не делает, а оно имеет смысл, то подскажи ему хинтом use_concat.
И лакониченее использовать литералы

Код: plaintext
1.
 where result_time >= date '2017-05-24' and result_time < date '2017-05-24' + 1
    or result_time >= date '2017-05-26' and result_time < date '2017-05-26' + 1

Если Enterprise edition, то Oracle может сделать (при наличии b-tree index) N range scans + bitmap conversion from rowids + bimap or.
(если _b_tree_bitmap_plans = true)
...
Рейтинг: 0 / 0
производительность
    #39470571
4wel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот через OR план запроса
всего в таблице 117 сабпартиций, я обращаюсь к данным из 17 (17 суток агрегирую).

Plan
SELECT STATEMENT ALL_ROWS
Cost: 138,733 Bytes: 11 Cardinality: 1
4 SORT AGGREGATE Bytes: 11 Cardinality: 1
3 PARTITION LIST SINGLE Cost: 138,733 Bytes: 286,297 Cardinality: 26,027 Partition #: 2 Partitions accessed #2
2 PARTITION RANGE OR Cost: 138,733 Bytes: 286,297 Cardinality: 26,027 Partition #: 3 Partitions accessed #KEY(OR)
1 TABLE ACCESS FULL TABLE NPMS_DETAIL.T_HUAWEI_1275071423 Cost: 138,733 Bytes: 286,297 Cardinality: 26,027 Partition #: 3 Partitions accessed #2 - #61

все ок?)


Если убрать OR'ы и просто ограничить по верхней и нижней дате то план такой - видно что берется 16 партиций - Partitions accessed #41 - #56

Plan
SELECT STATEMENT ALL_ROWS
Cost: 138,742 Bytes: 11 Cardinality: 1
4 SORT AGGREGATE Bytes: 11 Cardinality: 1
3 PARTITION LIST SINGLE Cost: 138,742 Bytes: 286,297 Cardinality: 26,027 Partition #: 2 Partitions accessed #2
2 PARTITION RANGE ITERATOR Cost: 138,742 Bytes: 286,297 Cardinality: 26,027 Partition #: 3 Partitions accessed #41 - #56
1 TABLE ACCESS FULL TABLE NPMS_DETAIL.T_HUAWEI_1275071423 Cost: 138,742 Bytes: 286,297 Cardinality: 26,027 Partition #: 3 Partitions accessed #2 - #61

по скорости выполнения приблизительно одинаково.
count(1) по всей таблице значительно дольше явно (на порядок)
...
Рейтинг: 0 / 0
производительность
    #39470578
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
4wel,

Я правильно понимаю что проблема понять различия "PARTITION RANGE OR" и "PARTITION RANGE ITERATOR"?

Планы выкладывать в читаемом виде религия запрещает или просто пренебрежение к читающим?
...
Рейтинг: 0 / 0
производительность
    #39470740
4wel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshop,

ну как скопировались планы из тоада так и выложил )

между "PARTITION RANGE OR" и "PARTITION RANGE ITERATOR" действительно различий не знаю - не силен в планах запросах пока-что, да и документации особо внятной на нашел про "PARTITION RANGE OR"
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / производительность
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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