Как ВЫБРАТЬ данные СУБД для разных значений столбца Раздел - PullRequest
0 голосов
/ 06 мая 2019

У меня есть таблица Oracle, как показано ниже:

CREATE TABLE "TABLE1" 
(   
"TABLE_ID" VARCHAR2(32 BYTE), 
"TABLE_DATE" DATE, 
"TABLE_NAME" VARCHAR2(2 BYTE) 
)
PARTITION BY RANGE ("TABLE_DATE")

Полагаю, эта таблица содержит данные, разделенные столбцом TABLE_DATE.

Как я могу использовать этот столбец разделения для более быстрого извлечения данных из этой таблицы в предложении WHERE, например ...

SELECT * FROM TABLE1 PARTITION (P1) p
WHERE p.TABLE_DATE > (SYSDATE - 90) ;

1 Ответ

0 голосов
/ 07 мая 2019

Вы должны изменить разделение в соответствии с вашими запросами, а не изменять запросы в соответствии с разделением. В большинстве случаев нам не нужно указывать, с каких разделов читать. 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)
...