Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Почему ORACLE не хранит NULLS в индексах? Какой workaround?  [new]
Ionah
Member

Откуда: Новосибирск
Сообщений: 290
Драссьте всем!

Собственно сабж.

Делаю запрос вида

select * from some_table where f1 is null

Хочется доступ к данным по индексу.


Известные мне опции решения:

1) функциональный индекс по nvl(f1, null_const)

запрос приводится к виду

select * from some_table where nvl(f1, null_const) = null_const

недостаток - нужно знать значение null_const, которого нет и никогда не будет в колонке,
запросы хуже читаются

2) bitmap индекс

недостаток - не канает для OLTP систем из-за большого overhead для поддержки индекса,
ну и вообще, необходимость хранения наллов в индексе - плохой аргумент для создания bitmap индекса

Есть другие решения задачи?
6 сен 07, 14:53    [4630289]     Ответить | Цитировать Сообщить модератору
 Re: Почему ORACLE не хранит NULLS в индексах? Какой workaround?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 64019
Блог
Ionah
Есть другие решения задачи?

user-defined индекс.
6 сен 07, 14:54    [4630299]     Ответить | Цитировать Сообщить модератору
 Re: Почему ORACLE не хранит NULLS в индексах? Какой workaround?  [new]
йфяцыч
Member

Откуда: UA-RU(62-99)-?
Сообщений: 638
Хранить не как NULL
6 сен 07, 14:58    [4630329]     Ответить | Цитировать Сообщить модератору
 Re: Почему ORACLE не хранит NULLS в индексах? Какой workaround?  [new]
Ionah
Member

Откуда: Новосибирск
Сообщений: 290
йфяцыч
Хранить не как NULL


Вот блин к этому и приходим, что настоящие nulls теряют смысл, надо суррогаты хранить.

$&№% Grrrrrrrrr :[

User-defined индексы посмотрю, спасибо
6 сен 07, 15:02    [4630360]     Ответить | Цитировать Сообщить модератору
 Re: Почему ORACLE не хранит NULLS в индексах? Какой workaround?  [new]
Apex
Member

Откуда: Made in USSR
Сообщений: 3909
softwarer
Ionah
Есть другие решения задачи?

user-defined индекс.

Может таки function based indexes?
6 сен 07, 15:03    [4630373]     Ответить | Цитировать Сообщить модератору
 Re: Почему ORACLE не хранит NULLS в индексах? Какой workaround?  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 64019
Блог
Apex
Может таки function based indexes?

Это разные вещи.
6 сен 07, 15:05    [4630391]     Ответить | Цитировать Сообщить модератору
 Re: Почему ORACLE не хранит NULLS в индексах? Какой workaround?  [new]
Apex
Member

Откуда: Made in USSR
Сообщений: 3909
Apex
softwarer
Ionah
Есть другие решения задачи?

user-defined индекс.

Может таки function based indexes?

Пардон. Вопрос снимается.
6 сен 07, 15:06    [4630403]     Ответить | Цитировать Сообщить модератору
 Re: Почему ORACLE не хранит NULLS в индексах? Какой workaround?  [new]
Apex
Member

Откуда: Made in USSR
Сообщений: 3909
softwarer
Apex
Может таки function based indexes?

Это разные вещи.

Да, понял уже, прошу прощения.
6 сен 07, 15:07    [4630408]     Ответить | Цитировать Сообщить модератору
 Re: Почему ORACLE не хранит NULLS в индексах? Какой workaround?  [new]
miksoft
Member

Откуда:
Сообщений: 38555
еще вариант - индекс из двух полей, из которых нужное - первое
6 сен 07, 15:10    [4630435]     Ответить | Цитировать Сообщить модератору
 Re: Почему ORACLE не хранит NULLS в индексах? Какой workaround?  [new]
miksoft
Member

Откуда:
Сообщений: 38555
miksoft
еще вариант - индекс из двух полей, из которых нужное - первое
а второе - NOT NULL
6 сен 07, 15:10    [4630444]     Ответить | Цитировать Сообщить модератору
 Re: Почему ORACLE не хранит NULLS в индексах? Какой workaround?  [new]
nsome
Guest
Ionah
Драссьте всем!

Собственно сабж.

Делаю запрос вида

select * from some_table where f1 is null

Хочется доступ к данным по индексу.



Есть. Сделайте индекс сначала по f1, потом по первичному ключу. Писать надо соответственно - where f1 is null and PK is not null. Сервер вполне может выбрать range scan.
6 сен 07, 15:11    [4630447]     Ответить | Цитировать Сообщить модератору
 Re: Почему ORACLE не хранит NULLS в индексах? Какой workaround?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18398
SQL> create table ane_test(a number, b number not null, constraint ane_test_unq unique(a,b));

Table created

SQL> insert into ane_test select nullif(mod(rownum,1000),0), rownum from dual connect by level < 10000;

9999 rows inserted

SQL> commit;

Commit complete

SQL> exec dbms_stats.gather_table_stats(user,'ANE_TEST',cascade=>true);

PL/SQL procedure successfully completed

SQL> explain plan for select * from ane_test where a is null;

Explained

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
----------------------------------------------------------------------
| Id  | Operation            |  Name         | Rows  | Bytes | Cost  |
----------------------------------------------------------------------
|   0 | SELECT STATEMENT     |               |     9 |    63 |     2 |
|*  1 |  INDEX RANGE SCAN    | ANE_TEST_UNQ  |     9 |    63 |     2 |
----------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - access("ANE_TEST"."A" IS NULL)
Note: cpu costing is off

14 rows selected

SQL>
6 сен 07, 15:13    [4630471]     Ответить | Цитировать Сообщить модератору
 Re: Почему ORACLE не хранит NULLS в индексах? Какой workaround?  [new]
Ionah
Member

Откуда: Новосибирск
Сообщений: 290
Всем спасибо!

Буду подумать какое-то время...
6 сен 07, 15:26    [4630600]     Ответить | Цитировать Сообщить модератору
 Re: Почему ORACLE не хранит NULLS в индексах? Какой workaround?  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18398
Еще вариант:
SQL> alter session set query_rewrite_enabled=true;

Session altered

SQL> alter session set query_rewrite_integrity=trusted;

Session altered

SQL> create table ane_test(a number unique, b number, c char(1000));

Table created

SQL> create materialized view log on ane_test with rowid including new values;

Materialized view log created

SQL> create materialized view ane_test_mw organization heap refresh on commit with rowid enable query rewrite as select * from ane_test where a is null;

Materialized view created

SQL> alter materialized view ane_test_mw enable query rewrite;

Materialized view altered

SQL> insert into ane_test select rownum, 1000, 'x' from dual connect by level < 10000;

9999 rows inserted

SQL> insert into ane_test select null, 10, 'null-val'||rownum from dual connect by level < 10;

9 rows inserted

SQL> commit;

Commit complete

SQL> exec dbms_stats.gather_table_stats(user,'ANE_TEST',cascade=>true);

PL/SQL procedure successfully completed

SQL> exec dbms_stats.gather_table_stats(user,'ANE_TEST_MW',cascade=>true);

PL/SQL procedure successfully completed

SQL> explain plan for select * from ane_test tt where a is null;

Explained

SQL> select * from table(dbms_xplan.display);

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
---------------------------------------------------------------------
| Id  | Operation            |  Name        | Rows  | Bytes | Cost  |
---------------------------------------------------------------------
|   0 | SELECT STATEMENT     |              |     9 |  9153 |     2 |
|   1 |  TABLE ACCESS FULL   | ANE_TEST_MW  |     9 |  9153 |     2 |
---------------------------------------------------------------------
Note: cpu costing is off

9 rows selected

SQL> 
6 сен 07, 18:45    [4632226]     Ответить | Цитировать Сообщить модератору
 Re: Почему ORACLE не хранит NULLS в индексах? Какой workaround?  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
Еще вариант -- DESC индекс
7 сен 07, 03:15    [4633027]     Ответить | Цитировать Сообщить модератору
 Re: Почему ORACLE не хранит NULLS в индексах? Какой workaround?  [new]
Змей Равниныч
Member

Откуда: Из тридевятого царства
Сообщений: 284
Кластерный индекс
7 сен 07, 10:13    [4633664]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить