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

Откуда: Москва
Сообщений: 2
Приветсвую!

есть таблица:

set SERVEROUTPUT ON 
declare
  is_exists pls_integer;
begin


select count(*) 
into is_exists
from all_tables where table_name = 'TEST__CODE_DATA';
if is_exists != 0 then
  execute immediate 'drop table TEST__CODE_DATA';

  execute immediate 'create table TEST__CODE_DATA(
    ID integer, -- PK
    CODE varchar(7),
    INDICATOR varchar(5)
  )';  
  
  execute immediate 'create index IDX_TEST__VALUE_CODE on TEST__CODE_DATA (CODE)';
  execute immediate 'create index IDX_TEST__VALUE_INDICATOR on TEST__CODE_DATA (INDICATOR)';
end if; 

-- на самом деле строк 4 с лишним миллиона
insert into TEST__CODE_DATA (ID, CODE, INDICATOR) VALUES (1, '023874', 'J');
insert into TEST__CODE_DATA (ID, CODE, INDICATOR) VALUES (2, '234444', NULL);
insert into TEST__CODE_DATA (ID, CODE, INDICATOR) VALUES (3, '332443', NULL);
insert into TEST__CODE_DATA (ID, CODE, INDICATOR) VALUES (4, '234342', 'N');
insert into TEST__CODE_DATA (ID, CODE, INDICATOR) VALUES (5, '234233', 'N');
insert into TEST__CODE_DATA (ID, CODE, INDICATOR) VALUES (6, '234444', NULL);
insert into TEST__CODE_DATA (ID, CODE, INDICATOR) VALUES (7, '200044', NULL);
insert into TEST__CODE_DATA (ID, CODE, INDICATOR) VALUES (8, '298774', NULL);
insert into TEST__CODE_DATA (ID, CODE, INDICATOR) VALUES (9, '298333', 'J');
insert into TEST__CODE_DATA (ID, CODE, INDICATOR) VALUES (10, '334443', 'J');
commit;


end;
/



у нас есть запрос


select * from TEST__CODE_DATA
where INDICATOR = 'J';


Вопрос, действительно ли индекс IDX_TEST__VALUE_INDICATOR на текстовое поле INDICATOR, которое содержит всего три значения NULL, J и N - больше вереден чем полезен? B точный поиск будет работать медленее, с индексом чем без? Но почему?
16 фев 17, 10:54    [20216818]     Ответить | Цитировать Сообщить модератору
 Re: Индексы  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром началась. КЯЗ
Сообщений: 26616
Андрей Сызранов
if is_exists != 0 then
  execute immediate 'drop table TEST__CODE_DATA';

  execute immediate 'create table TEST__CODE_DATA(
Быдлокод.
Андрей Сызранов
действительно ли индекс IDX_TEST__VALUE_INDICATOR на текстовое поле INDICATOR, которое содержит всего три значения NULL, J и N - больше вереден чем полезен?
Зависит от соотношения их количеств.
16 фев 17, 11:16    [20216892]     Ответить | Цитировать Сообщить модератору
 Re: Индексы  [new]
Андрей Сызранов
Member

Откуда: Москва
Сообщений: 2
Elic,

примерно 4,5 строк, предположим, соотношение 50% NULL, 50% J или N
16 фев 17, 11:23    [20216927]     Ответить | Цитировать Сообщить модератору
 Re: Индексы  [new]
veep_in_office
Guest
Elic
Андрей Сызранов
if is_exists != 0 then
  execute immediate 'drop table TEST__CODE_DATA';

  execute immediate 'create table TEST__CODE_DATA(
Быдлокод.
Андрей Сызранов
действительно ли индекс IDX_TEST__VALUE_INDICATOR на текстовое поле INDICATOR, которое содержит всего три значения NULL, J и N - больше вереден чем полезен?
Зависит от соотношения их количеств.


Индекс будет эффективен только лишь в том случае если выборка возвращает не более 3-4% от всей таблицы, в ином случае оптимизатор скорее всего перейдет на фулскан.

В вашем случае значение "J" занимает треть таблицы - индекс тут работать однозначно не будет.
16 фев 17, 11:25    [20216939]     Ответить | Цитировать Сообщить модератору
 Re: Индексы  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром началась. КЯЗ
Сообщений: 26616
Андрей Сызранов
50% J или N
"Вероятность встретить динозавра на улице - 50%. Либо встречу, либо нет" (с) 
16 фев 17, 11:31    [20216973]     Ответить | Цитировать Сообщить модератору
 Re: Индексы  [new]
veep_in_office
Guest
Андрей Сызранов
Elic,

примерно 4,5 строк, предположим, соотношение 50% NULL, 50% J или N


На мелких таблицах индекс вообще работать не будет при любом соотношении.
16 фев 17, 12:53    [20217373]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить