【发布时间】:2011-01-31 13:17:30
【问题描述】:
我有两张这样的桌子
create table A_DUMMY (
TRADE_ID VARCHAR2(16)
TRADE_DATA VARCHAR2(500)
)
create table B_DUMMY (
EXT_TRADE_ID VARCHAR2(16)
EXT_DATA VARCHAR2(250)
)
并有一个构建类似这样的视图
CREATE OR REPLACE VIEW DUMMY_VIEW("TRADE_DATA", "EXT_DATA")
AS
SELECT A.TRADE_DATA, B.EXT_DATA FROM A_DUMMY A, B_DUMMY B
WHERE
GET_TRADE_NUMBER(A.TRADE_ID,'-') = GET_TRADE_NUMBER(B.EXT_TRADE_ID,'_')
OR
GET_TRADE_NUMBER(A.TRADE_ID,'-') = B.EXT_TRADE_ID
为了优化这一点,我在 A_DUMMY 中的 TRADE_ID 和 B_DUMMY 中的 EXT_TRADE_ID 上创建了一个函数索引。
函数如下所示:
create or replace function
GET_TRADE_NUMBER(trade in varchar2, separator in varchar2)
return varchar2
deterministic
as
begin
return SUBSTR(trade, 0, INSTR(trade, separator, 1, 1) - 1);
end;
函数索引如下所示
create index A_DUMMY_IDX ON A_DUMMY(GET_TRADE_NUMBER(TRADE_ID,'-'));
create index B_DUMMY_IDX ON B_DUMMY(GET_TRADE_NUMBER(EXT_TRADE_ID,'_'));
数据如下所示:
INSERT INTO a_dummy VALUES ('7874-LND', 'item1');
INSERT INTO a_dummy VALUES ('7845-NY', 'item2');
INSERT INTO a_dummy VALUES ('7844-NY', 'item3');
INSERT INTO b_dummy VALUES ('7844', 'item4');
INSERT INTO b_dummy VALUES ('7845_LND', 'item5');
INSERT INTO b_dummy VALUES ('7874_LND', 'item5');
如何让 Oracle 在提供的 DUMMY_VIEW 查询中使用此索引?
因为,似乎,我根据解释计划所做的一切,Oracle 都忽略了它们。
【问题讨论】:
标签: oracle indexing functional-programming