Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 SYS_OP_UNDESCEND и ORA-01428  [new]
artemg
Member

Откуда: Санкт-Петербург
Сообщений: 593
жила-была табличка t1 с колонкой типа date
и было по этой колонке непонятно зачем два индекса
один обычный, а второй desc
табличку понемногу читали и даже иногда в неё писали
в один прекрасный день (вернее ночь) собрал шедулер статистику, и оптимизатор по утру осенило что у старого доброго запроса, которым табличку читали, образовался новый прекрасный план выполнения, который мастерски использует сразу два индекса

одно плохо - падает такой запрос с ошибкой ORA-01428 argument '786a0a18010101' is out of range

посмотрели план - а там всякие системные функции из пустого в порожнее переливают

SQL> select id from t1 where ts='24.10.2006 00:00:00';
select id from t1 where ts='24.10.2006 00:00:00'
*
ERROR at line 1:
ORA-01428: argument '786a0a18010101' is out of range

SQL> set autotrace traceonly explain;
SQL> select id from t1 where ts='24.10.2006 00:00:00';

Execution Plan
----------------------------------------------------------
Plan hash value: 3218555164

------------------------------------------------------------
| Id  | Operation         | Name   | Rows  | Bytes | Cost  |
------------------------------------------------------------
|   0 | SELECT STATEMENT  |        |     3 |    54 |     1 |
|*  1 |  AND-EQUAL        |        |       |       |       |
|*  2 |   INDEX RANGE SCAN| TSASC  |     3 |       |     1 |
|*  3 |   INDEX RANGE SCAN| TSDESC |     3 |       |     1 |
------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(SYS_OP_UNDESCEND(SYS_OP_DESCEND("TS"))=TO_DATE('2006-10-24
               00:00:00', 'yyyy-mm-dd hh24:mi:ss') AND
              SYS_OP_DESCEND("TS")=HEXTORAW('8795F5E7FEF8FEFAFF') )
   2 - access(SYS_OP_UNDESCEND(SYS_OP_DESCEND("TS"))=TO_DATE('2006-10-24
               00:00:00', 'yyyy-mm-dd hh24:mi:ss'))
   3 - access(SYS_OP_DESCEND("TS")=HEXTORAW('8795F5E7FEF8FEFAFF') )



если один из индексов убить - AND-EQUAL пропадает, происходит обычный INDEX RANGE SCAN и TABLE ACCESS BY INDEX ROWID, запрос выполняется успешно

SQL> drop index TSASC;

Index dropped.

SQL> select id from t1 where ts='24.10.2006 00:00:00';

                ID
------------------
         9511679208


Execution Plan
----------------------------------------------------------
Plan hash value: 385659728

----------------------------------------------------------------------
| Id  | Operation                   | Name   | Rows  | Bytes | Cost  |
----------------------------------------------------------------------
|   0 | SELECT STATEMENT            |        |     3 |    54 |     5 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T1     |     3 |    54 |     5 |
|*  2 |   INDEX RANGE SCAN          | TSDESC |     3 |       |     1 |
----------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - access(SYS_OP_DESCEND("TS")=HEXTORAW('8795F5E7FEF8FEFAFF') )
       filter(SYS_OP_UNDESCEND(SYS_OP_DESCEND("TS"))=TO_DATE('2006-10-24
               00:00:00', 'yyyy-mm-dd hh24:mi:ss'))

хотелось бы в общих чертах понять, что это за аргумент 786a0a18010101, какой у него range, и почему в первом случае он из свое range вылазит.
Если подскажете где про это почитать - буду очень благодарен.
28 июн 08, 20:50    [5861291]     Ответить | Цитировать Сообщить модератору
 Re: SYS_OP_UNDESCEND и ORA-01428  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
Для начала, как выполнится запрос, если уйти от неявного приведения типов и воспользоваться to_date?
29 июн 08, 01:23    [5861532]     Ответить | Цитировать Сообщить модератору
 Re: SYS_OP_UNDESCEND и ORA-01428  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 7422
artemg
Если подскажете где про это почитать - буду очень благодарен.
Не стоит багодарностей
29 июн 08, 03:23    [5861627]     Ответить | Цитировать Сообщить модератору
 Re: SYS_OP_UNDESCEND и ORA-01428  [new]
wurdu
Member

Откуда: Владивосток
Сообщений: 4441
artemg
что это за аргумент 786a0a18010101
Судя по всему, аргумент получается так:
SQL> SELECT SYS_OP_UNDESCEND(sys_op_descend(TO_DATE('2006-10-24 00:00:00', 'yyyy-mm-dd hh24:mi:ss'))) FROM dual;

SYS_OP_UNDESCE
--------------
786A0A18010101
При чем интересен вот такой эффект
SQL> SELECT SYS_OP_UNDESCEND(sys_op_descend(to_date('29.06.2008','dd.mm.yyyy'))), SYS_OP_UNDESCEND(sys_op_descend(trunc(sysdate))) from dual;

SYS_OP_UNDESCE SYS_OP_UN
-------------- ---------
786C061D010101 29-JUN-08
А в общем, это очень похоже на Bug 2670788, только там диагностика другая. Ну и действительно, использовать неявное приведение к дате - это ни в какие ворота.
29 июн 08, 08:24    [5861753]     Ответить | Цитировать Сообщить модератору
 Re: SYS_OP_UNDESCEND и ORA-01428  [new]
artemg
Member

Откуда: Санкт-Петербург
Сообщений: 593
да, да
я в курсе, что неявное преобразование типов в запросах - зло
конечно же, первым делом, когда я воспроизвёл ситуацию в сторонке, я начал с явного приведения
там правда изначально был timestamp и я, признаюсь, грешил на то, что возможно драйвер что-то неправильно засунул, оракл схавал, а поперхнулся только на обратном преобразовании из desc индекса
потому я сделал табличку с date и перекинул туда данные через trunc(ts, 'MI') чтобы отсечь наносекундную часть, но это не особо помогло

SQL> select id from t1 where ts=to_date('24.10.2006 00:00:00', 'dd.mm.yyyy HH24:MI:SS');
select id from t1 where ts=to_date('24.10.2006 00:00:00', 'dd.mm.yyyy HH24:MI:SS')
               *
ERROR at line 1:
ORA-01428: argument '786a0a18010101' is out of range
29 июн 08, 12:45    [5861876]     Ответить | Цитировать Сообщить модератору
 Re: SYS_OP_UNDESCEND и ORA-01428  [new]
artemg
Member

Откуда: Санкт-Петербург
Сообщений: 593
>> При чем интересен вот такой эффект

ага, теперь ясно
этот аргумент типа raw, он так эту дату в индексе хранит, да?
я тоже пытался переводить туда-сюда, но у меня что-то не получалось

>>А в общем, это очень похоже на Bug 2670788, только там диагностика другая.

похоже очень, да
только там
Range of versions believed to be affected Versions < 10.1.0.2

а у меня

SQL> select banner from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit
PL/SQL Release 10.2.0.3.0 - Production
CORE    10.2.0.3.0      Production
TNS for Linux: Version 10.2.0.3.0 - Production
NLSRTL Version 10.2.0.3.0 - Production
29 июн 08, 12:55    [5861885]     Ответить | Цитировать Сообщить модератору
 Re: SYS_OP_UNDESCEND и ORA-01428  [new]
............
Guest
убить статистку не пробовали?
29 июн 08, 13:16    [5861906]     Ответить | Цитировать Сообщить модератору
 Re: SYS_OP_UNDESCEND и ORA-01428  [new]
wurdu
Member

Откуда: Владивосток
Сообщений: 4441
Очень странно. Вроде как в 10g уже AND-EQUAL можно только хинтом включить
Jonathan Lewis
However, with the arrival of 10g, the optimizer no longer considers the and_equal mechanism
unless hinted—and the hint is deprecated. The mechanism has been largely superseded
by the index_combine mechanism.
Там случаем optimizer_features_enable не выставлен в 9-ку?
29 июн 08, 13:18    [5861911]     Ответить | Цитировать Сообщить модератору
 Re: SYS_OP_UNDESCEND и ORA-01428  [new]
artemg
Member

Откуда: Санкт-Петербург
Сообщений: 593
статистику убить чтобы другой план был?
да, если план каким-то образом изменить (убрать AND-EQUAL) - всё нормально становится
29 июн 08, 13:21    [5861916]     Ответить | Цитировать Сообщить модератору
 Re: SYS_OP_UNDESCEND и ORA-01428  [new]
...........
Guest
artemg
статистику убить чтобы другой план был?
да, если план каким-то образом изменить (убрать AND-EQUAL) - всё нормально становится


ога
29 июн 08, 13:26    [5861921]     Ответить | Цитировать Сообщить модератору
 Re: SYS_OP_UNDESCEND и ORA-01428  [new]
artemg
Member

Откуда: Санкт-Петербург
Сообщений: 593
> Там случаем optimizer_features_enable не выставлен в 9-ку?

хм...
случаем выставлен, а я и не заметил
в понедельник буду узнавать с какой целью
29 июн 08, 13:26    [5861922]     Ответить | Цитировать Сообщить модератору
 Re: SYS_OP_UNDESCEND и ORA-01428  [new]
artemg
Member

Откуда: Санкт-Петербург
Сообщений: 593
перекинул на десятку где optimizer_features_enable 10.2.0.3, там всё ок
поменял там же на 9.2.0 - ORA-01428: argument '786c051a010101' is out of range

значит таки Bug 2670788 ударил в спину
29 июн 08, 13:48    [5861948]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить