2017-02-14 8 views
0

У меня есть запрос, как это:выбрать один раздел, но список использование оптимизатора раздела все

select * from P2P_TST2.kh4rqolog t where t.kh4ldat472 between to_date('20170121120001', 'YYYYMMDDHH24MISS') and 
    to_date('20170121130101', 'YYYYMMDDHH24MISS') 

и тест-таблицы разделов изо дня в день. я выбираю один раздел в моем запросе, но оптимизатор использует список разделов в плане выполнения. Зачем ?

мое определение таблицы:

create table KH4RQOLOG 
(
    ... 
    kh4stdat472  DATE, 
    kh4ldat472  DATE, 
    ...  
) 
partition by range (KH4LDAT472) 
subpartition by list (KH4DBINSTID000) 
(
    partition SYS_P2898 values less than (TO_DATE(' 2016-12-06 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) 
    tablespace KISHTBS 
    pctfree 10 
    initrans 1 
    maxtrans 255 
    ( ... ), 
. 
. 
    partition SYS_P5433 values less than (TO_DATE(' 2017-01-20 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) 
    tablespace KISHTBS 
    ... ( ... ), 
    partition SYS_P5509 values less than (TO_DATE(' 2017-01-21 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) 
    tablespace KISHTBS 
    ... ( ... ), 
    partition SYS_P5548 values less than (TO_DATE(' 2017-01-22 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) 
    tablespace KISHTBS 
    ... ( ... ), 
. 
. 
    partition SYS_P6556 values less than (TO_DATE(' 2017-02-07 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) 
    tablespace KISHTBS 
     ... ( ... ), 
); 
-- Create/Recreate indexes 
create index ESH_KHCHID472 on KH4RQOLOG (KH4BTCHID472) 
    local; 
create index IDX_RQIN on KH4RQOLOG (KH4RECID470) 
    local; 
create index PK_KH4RQOLOG on KH4RQOLOG (KH4RECID472) 
    local; 

и план выполнения является:

PLAN_TABLE_OUTPUT 
-------------------------------------------------------------------------------- 
Plan hash value: 1161379669 
-------------------------------------------------------------------------------- 
| Id | Operation    | Name  | Rows | Bytes | Cost (%CPU)| Time 
-------------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT  |   | 75186 | 24M| 23967 (1)| 00:04: 
| 1 | PARTITION RANGE SINGLE|   | 75186 | 24M| 23967 (1)| 00:04: 
| 2 | PARTITION LIST ALL |   | 75186 | 24M| 23967 (1)| 00:04: 
|* 3 | TABLE ACCESS FULL | KH4RQOLOG | 75186 | 24M| 23967 (1)| 00:04: 
-------------------------------------------------------------------------------- 
Predicate Information (identified by operation id): 
--------------------------------------------------- 
    3 - filter("T"."KH4LDAT472">=TO_DATE(' 2017-01-21 12:00:01', 'syyyy-mm-dd hh2 
       AND "T"."KH4LDAT472"<=TO_DATE(' 2017-01-21 13:01:01', 'syyyy-mm-dd 
16 rows selected 
+0

Похоже, что что-то идет не так, но трудно сказать, что это такое без дополнительной информации. Можете ли вы добавить определение таблицы, а также план объяснения (сгенерированный с помощью команды 'explain plan для select ...;' и 'select * from table (dbms_xplan.display);'. –

+0

@JonHeller Я добавляю информацию о моем вопросе. I can not use sql plus –

+0

У меня есть аналогичная проблема с моими разделами PostgreSQL, она будет искать все разделы, если поставляемое условие не является явным, например, например, 'date = '2017-01-01' :: date' будет работать правильно, но' date = date_trunc ('month', '2017-01-27' :: date) :: date' не будет. Мы обходим это с использованием объявленных переменных, если это возможно, и присваиваем даты, которые мы ищем там. –

ответ

1

Ваш план выполнения выглядит правильно. Вы ищете данные за один день, поэтому у вас есть оператор PARTITION RANGE SINGLE. Поскольку на вашем столбце подразделения нет предиката, у вас есть оператор PARTITION LIST ALL.

 Смежные вопросы

  • Нет связанных вопросов^_^