Вы должны изменить разделение в соответствии с вашими запросами, а не изменять запросы в соответствии с разделением. В большинстве случаев нам не нужно указывать, с каких разделов читать. Oracle может автоматически определять способ сокращения разделов во время выполнения.
Например, с этой таблицей:
create table table1
(
table_id varchar2(32 byte),
table_date date,
table_name varchar2(2 byte)
)
partition by range (table_date)
(
partition p1 values less than (date '2019-05-06'),
partition p2 values less than (maxvalue)
);
Практически никогда не нужно напрямую ссылаться на раздел в запросе. Это дополнительная работа, и если мы укажем неправильное имя раздела, запрос не будет работать правильно.
Мы можем увидеть сокращение раздела в действии, используя EXPLAIN PLAN
, например:
explain plan for
SELECT * FROM TABLE1 p
WHERE p.TABLE_DATE > (SYSDATE - 90) ;
select *
from table(dbms_xplan.display);
В результатах мы видим разбиение в столбцах Pstart
и Pstop
. KEY
означает, что раздел будет определен во время выполнения. В этом случае начальный раздел основан на значении SYSDATE
.
Plan hash value: 434062308
---------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
---------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 30 | 2 (0)| 00:00:01 | | |
| 1 | PARTITION RANGE ITERATOR| | 1 | 30 | 2 (0)| 00:00:01 | KEY | 2 |
|* 2 | TABLE ACCESS FULL | TABLE1 | 1 | 30 | 2 (0)| 00:00:01 | KEY | 2 |
---------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("P"."TABLE_DATE">SYSDATE@!-90)
Note
-----
- dynamic statistics used: dynamic sampling (level=2)