¿Por qué oracle no usa un indice?
Publicado por jose (3 intervenciones) el 21/10/2006 02:43:51
Hola a todos, mi pregunta es la siguiente:
He creado un indice basado en funciones en una tabla, pero me he dado con la sorpresa que cuando en un query uso ademas de ese, otros indices, en realidad no es usado.
CREATE TABLE DOCUMENTOS
(
CODIGODOCUMENTO NUMBER(8) NOT NULL,
CODIGOCLIENTE NUMBER(8),
TIPODOCUMENTO NUMBER(2) NOT NULL,
SERIEDOCUMENTO VARCHAR2(3 BYTE) NOT NULL,
NUMERODOCUMENTO VARCHAR2(7 BYTE) NOT NULL,
FECHADOCUMENTO DATE NOT NULL,
TIPOCAMBIO NUMBER(6,3) NOT NULL,
IMPORTE NUMBER(12,2),
MONEDA NUMBER(1)
...
);
El indice lo creo asi:
CREATE INDEX IDX_DOCUMENTO ON DOCUMENTOS
(TIPODOCUMENTO, LPAD("SERIEDOCUMENTO",3,'0'), LPAD("NUMERODOCUMENTO",7,'0'));
Si hago esta consulta si toma el indice:
Select *
From Documentos
Where tipodocumento=1
and lpad(seriedocumento,3,'0') = '001'
and lpad(numerodocumento,7,'0') = '0000012';
Pero si le agrego una condicion mas al where, a un campo que tambien tiene un indice, no toma el indice idx_documento:
Select *
From Documentos
Where tipodocumento=1
and lpad(seriedocumento,3,'0') = '001'
and lpad() = '0000012'
and codigocliente = 58963;
A qué puede deberse esto? hay alguna restricción en cuanto a los indices basados en funciones?
Espero que puedan darme una pista, pues aunque he buscado no he logrado dar con la respuesta.
Gracias de antemano,
Jose Rivera
He creado un indice basado en funciones en una tabla, pero me he dado con la sorpresa que cuando en un query uso ademas de ese, otros indices, en realidad no es usado.
CREATE TABLE DOCUMENTOS
(
CODIGODOCUMENTO NUMBER(8) NOT NULL,
CODIGOCLIENTE NUMBER(8),
TIPODOCUMENTO NUMBER(2) NOT NULL,
SERIEDOCUMENTO VARCHAR2(3 BYTE) NOT NULL,
NUMERODOCUMENTO VARCHAR2(7 BYTE) NOT NULL,
FECHADOCUMENTO DATE NOT NULL,
TIPOCAMBIO NUMBER(6,3) NOT NULL,
IMPORTE NUMBER(12,2),
MONEDA NUMBER(1)
...
);
El indice lo creo asi:
CREATE INDEX IDX_DOCUMENTO ON DOCUMENTOS
(TIPODOCUMENTO, LPAD("SERIEDOCUMENTO",3,'0'), LPAD("NUMERODOCUMENTO",7,'0'));
Si hago esta consulta si toma el indice:
Select *
From Documentos
Where tipodocumento=1
and lpad(seriedocumento,3,'0') = '001'
and lpad(numerodocumento,7,'0') = '0000012';
Pero si le agrego una condicion mas al where, a un campo que tambien tiene un indice, no toma el indice idx_documento:
Select *
From Documentos
Where tipodocumento=1
and lpad(seriedocumento,3,'0') = '001'
and lpad() = '0000012'
and codigocliente = 58963;
A qué puede deberse esto? hay alguna restricción en cuanto a los indices basados en funciones?
Espero que puedan darme una pista, pues aunque he buscado no he logrado dar con la respuesta.
Gracias de antemano,
Jose Rivera
Valora esta pregunta


0