|
|
|
производительность
|
|||
|---|---|---|---|
|
#18+
простая тема но решения не могу найти... нужно агрегировать часовые данные в дневные. есть 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 на каждый день) в теории работает быстро, есть ли варианты лучше проще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2017, 16:51 |
|
||
|
производительность
|
|||
|---|---|---|---|
|
#18+
insert RESULT_TIME, F1 into T_DAY select TRUNC(RESULT_TIME), SUM(F1) from T_HOUR where RESULT_TIME = v_period_list ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2017, 16:54 |
|
||
|
производительность
|
|||
|---|---|---|---|
|
#18+
ну еще 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 ... и т.д. по часам ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2017, 16:59 |
|
||
|
производительность
|
|||
|---|---|---|---|
|
#18+
4wel, Или так: Код: plsql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2017, 17:14 |
|
||
|
производительность
|
|||
|---|---|---|---|
|
#18+
4welтоже фулскан - из за ORПри объединении предикатов по диапазонам с помощью OR Oracle может применить concatenation в плане. Если он этого не делает, а оно имеет смысл, то подскажи ему хинтом use_concat. И лакониченее использовать литералы Код: plaintext 1. Если Enterprise edition, то Oracle может сделать (при наличии b-tree index) N range scans + bitmap conversion from rowids + bimap or. (если _b_tree_bitmap_plans = true) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2017, 17:17 |
|
||
|
производительность
|
|||
|---|---|---|---|
|
#18+
вот через 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) по всей таблице значительно дольше явно (на порядок) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2017, 18:21 |
|
||
|
производительность
|
|||
|---|---|---|---|
|
#18+
4wel, Я правильно понимаю что проблема понять различия "PARTITION RANGE OR" и "PARTITION RANGE ITERATOR"? Планы выкладывать в читаемом виде религия запрещает или просто пренебрежение к читающим? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.06.2017, 18:38 |
|
||
|
производительность
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop, ну как скопировались планы из тоада так и выложил ) между "PARTITION RANGE OR" и "PARTITION RANGE ITERATOR" действительно различий не знаю - не силен в планах запросах пока-что, да и документации особо внятной на нашел про "PARTITION RANGE OR" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2017, 10:50 |
|
||
|
|

start [/forum/topic.php?fid=52&tid=1885768]: |
0ms |
get settings: |
8ms |
get forum list: |
17ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
177ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 244ms |
| total: | 498ms |

| 0 / 0 |
