Indexing 函数索引在Oracle中的应用

Indexing 函数索引在Oracle中的应用,indexing,oracle11g,Indexing,Oracle11g,这是汤姆的问题,但他现在很忙 我不是DBA,只是一个简单的JavaEE开发人员,也是Oracle的新手,我被要求优化一些查询 我有一张像这样的大桌子 create table test_table( DUMMY VARCHAR2(50), COB DATE, DATA VARCHAR2(100) ); CREATE INDEX "TEST_TABLE_DUMMY_COB_IDX" ON "TEST_TABLE" ( case when DUMMY IS NULL t

这是汤姆的问题,但他现在很忙

我不是DBA,只是一个简单的JavaEE开发人员,也是Oracle的新手,我被要求优化一些查询

我有一张像这样的大桌子

create table test_table(
  DUMMY VARCHAR2(50),
  COB DATE,
  DATA VARCHAR2(100)
);
CREATE INDEX "TEST_TABLE_DUMMY_COB_IDX" ON "TEST_TABLE" (
  case  
    when DUMMY IS NULL then COB
    when DUMMY <> 'INTFR' then COB
  end
);
真正的表有更多的列,围绕COB date进行结构化。要处理此表,我使用视图

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';
我想为查询优化创建一个特定的函数索引,如下所示

create table test_table(
  DUMMY VARCHAR2(50),
  COB DATE,
  DATA VARCHAR2(100)
);
CREATE INDEX "TEST_TABLE_DUMMY_COB_IDX" ON "TEST_TABLE" (
  case  
    when DUMMY IS NULL then COB
    when DUMMY <> 'INTFR' then COB
  end
);
在“TEST\u TABLE”上创建索引“TEST\u TABLE\u DUMMY\u COB\u IDX”(
案例
当DUMMY为NULL时,则为COB
当伪“INTFR”时,则为COB
结束
);

据我所知,通过这种方式,我将在一个B*树索引表中创建一天的所有重新创建,键为COB,这会优化我的常规查询使用,还是需要一些更神奇的方法才能使其工作?

它不会像您所拥有的那样工作,因为索引定义中的表达式没有在视图的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;

这是否真的会使您的查询更高效取决于数据:您需要进行比较才能看到。

只有一种方法可以找到:)谢谢。