j'ai deux tables comme celui-ciindice fonctionnel référence croisée dans Oracle
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)
)
Et une vue qui est de construire quelque chose comme ça
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
Pour optimiser ce que j'ai créé un indice fonctionnel sur TRADE_ID dans A_DUMMY et EXT_TRADE_ID dans B_DUMMY.
La fonction ressemble à ceci:
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;
index fonctionnels ressemblent à ce
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,'_'));
données ressemble à ceci:
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');
Comment puis-je faire utiliser ces index Oracle Requête fournie pour DUMMY_VIEW? Parce que, semble-t-il, tout ce que je fais selon le plan d'explication Oracle les ignore.
Merci, j'ai mis à jour la question pour être plus clair, sur la fonction et les données. – mavarazy
@anton_oparin: Avec les données que vous avez fournies, il serait probablement plus lent d'utiliser un index. Oracle récupère toujours les données en blocs (de 2 Ko à 32 Ko) et vos données d'échantillon tiennent dans un bloc. Il est plus rapide de lire un seul bloc au lieu de chercher dans un b-tree et ensuite de lire le même bloc. Essayez d'insérer plusieurs milliers de lignes (avec quelque chose comme INSERT INTO a_dummy, sélectionnez 'a', 'item1' à partir de dual connect par niveau <100000), puis rassemblez les statistiques sur la table et voyez si elle utilise un index. –