Метка времени Oracle с форматом местного часового пояса CBO - PullRequest
0 голосов
/ 16 мая 2018

Я недавно преобразовал некоторые столбцы «Дата» в «Отметку времени (6) с локальным часовым поясом», чтобы использовать функциональные возможности локализации оракула без изменения существующих корпоративных приложений.

Все работает, как и ожидалось: время сеанса клиента влияет на «часы» данных.

Моя проблема в том, что оптимизатор на основе затрат ORACLE, похоже, больше не понимает формат даты, который мы используем, и вычисляет неверную мощность. Можете ли вы помочь нам?

Чтобы воспроизвести проблему:

ALTER SESSION  SET TIME_ZONE = dbtimezone ;

create table TEST_CBO_TSWLT as (
select 
level as pk,
to_date('01/01/2000','DD/MM/YYYY') + (level/24) as col_date,
to_date('01/01/2000','DD/MM/YYYY') + (level/24) as col_ts_wlt
from dual
connect by level < ((365.25)*24)*10
);

create index TEST_CBO_TSWLT_INDX_DATE on TEST_CBO_TSWLT (col_date);
create index TEST_CBO_TSWLT_INDX_TSWLT on TEST_CBO_TSWLT (col_ts_wlt);

ALTER TABLE TEST_CBO_TSWLT  MODIFY (COL_TS_WLT TIMESTAMP(6) with local time zone );

execute DBMS_STATS.GATHER_TABLE_STATS (OWNNAME =>'MYSCHEMA',TABNAME =>'TEST_CBO_TSWLT');

Затем я копирую параметры NLS базы данных в мой сеанс, чтобы упростить понимание.

select * from nls_session_parameters 
where parameter in ('NLS_DATE_FORMAT','NLS_TIMESTAMP_FORMAT','NLS_TIMESTAMP_TZ_FORMAT');
-->NLS_DATE_FORMAT  DD/MM/RR HH24:MI:SS
-->NLS_TIMESTAMP_FORMAT DD/MM/RR HH24:MI:SSXFF
-->NLS_TIMESTAMP_TZ_FORMAT  DD/MM/RR HH24:MI:SSXFF TZR

ALTER SESSION  SET NLS_DATE_FORMAT = 'DD/MM/RR HH24:MI:SS' ;
ALTER SESSION  SET NLS_TIMESTAMP_FORMAT =  'DD/MM/RR HH24:MI:SSXFF' ;
ALTER SESSION  SET NLS_TIMESTAMP_TZ_FORMAT =  'DD/MM/RR HH24:MI:SSXFF TZR' ;

Test_1 в порядке

select * from TEST_CBO_TSWLT
where col_date >= '01/01/02 00:00:00'
and col_date < '02/01/02 00:00:00';
--CBO compute a cardinality of 24
--24 rows returned

Test_2 - это ко

select * from TEST_CBO_TSWLT
where col_ts_wlt>= '01/01/02 00:00:00'
and col_ts_wlt< '02/01/02 00:00:00';
--CBO compute a cardinality of 219
--24 rows returned

Test_3 - это ко

select * from TEST_CBO_TSWLT
where col_ts_wlt>= '01/01/02 00:00:00,000000000'
and col_ts_wlt< '02/01/02 00:00:00,000000000';
--CBO compute a cardinality of 219
--24 rows returned

Какой ФОРМАТ мне нужно использовать, чтобы иметь правильную мощность в CBO?

PS: инструменты запросов, которые я использую (Business Objects), не могут указывать такие функции, как "to_date" или "cast" на разных сторонах сравнения, поэтому мне приходится управлять символами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...