Использование функциональных индексов в Oracle - PullRequest
0 голосов
/ 14 января 2011

Это был вопрос к Тому, но он сейчас занят.

Я не администратор баз данных, а простой разработчик Java EE, также я новичок в Oracle, и меня попросили оптимизировать некоторые запросы.

У меня большой стол, вот так

create table test_table(
  DUMMY VARCHAR2(50),
  COB DATE,
  DATA VARCHAR2(100)
);

В реальной таблице есть еще много столбцов, структурированных вокруг даты COB. Для обработки этой таблицы я использую представление

create or replace force view test_view("DUMMY", "COB", "DATA") 
AS
  SELECT 
      DUMMY,
      COB,
      DATA
  FROM test_table 
  WHERE 
      DUMMY IS NULL 
      OR DUMMY <> 'INTFR';

Я запрашиваю это представление в основном по дате COB.

SELECT * from TEST_VIEW where COB = '15-Dec-2010'

И я хочу создать специальный функциональный индекс для оптимизации запросов, который бы выглядел следующим образом

CREATE INDEX "TEST_TABLE_DUMMY_COB_IDX" ON "TEST_TABLE" (
  case  
    when DUMMY IS NULL then COB
    when DUMMY <> 'INTFR' then COB
  end
);

Как я понимаю, таким образом у меня будут все записи за день в индексной таблице B * Tree с ключом COB, оптимизирует ли это мое общее использование запросов, или мне понадобится больше магии, чтобы сделать это работать?

1 Ответ

1 голос
/ 14 января 2011

Он не будет работать так, как у вас, поскольку выражение в определении индекса не используется в предложении WHERE представления.Это будет работать:

create index test_table_dummy_cob_idx on test_table
( case when dummy is null or dummy != 'INTFR' then cob end );

create or replace view test_view as
select dummy,
       cob, 
       data
from test_table
where case when dummy is null or dummy != 'INTFR' then cob end = cob;

Будет ли это на самом деле делать ваши запросы более эффективными, зависит от данных: вам нужно сравнить, чтобы увидеть.

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