Oracle - ¿Por qué oracle no usa un indice?

 
Vista:

¿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
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:¿Por qué oracle no usa un indice?

Publicado por Ricardo (84 intervenciones) el 23/10/2006 16:08:11
Probá con esto:

Select /*+ INDEX(DOCUMENTOS IDX_DOCUMENTO) */
*
From Documentos
Where tipodocumento=1
and lpad(seriedocumento,3,'0') = '001'
and lpad(numerodocumento,7,'0') = '0000012';

Con respecto a la 'condicion adicional', fijate si no se corresponde con otro indice.
de ser asi, probalo como te puse arriba, y si no resulta, además de lo que te puse
arriba, en la 'condición adicional', funciones u operaciones a la columna, como por
ejemplo un upper si es varchar2 o un "columna+0" si es number.
(esto hará que rompa el otro índice y use el que vos le forzás en el optimizer hint).

Saludos.
Ricardo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Por qué oracle no usa un indice?

Publicado por Jose (3 intervenciones) el 23/10/2006 18:21:35
Hola Ricardo, gracias por responder...
poniendole lo que me indicaste si toma el indice idx_documento, pero ya no toma los demas, ninguno de los campos de los indices corresponde a mas de un indice. ¿Como debo poner el optimizer hint para que tome mas de un indice?, he tratado de algunas formas pero no lo he logrado, por favor si podrias darme un ejemplo de como deberia hacer para q tome todos los indices, te lo agradeceria bastante.

El otro indice que tiene la tabla es:

CREATE INDEX FK_DOCUMENTOS_CLIENTES ON DOCUMENTOS
(CODIGOCLIENTE);

Jose Rivera
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Por qué oracle no usa un indice?

Publicado por Ricardo (84 intervenciones) el 23/10/2006 19:16:16
Jose:

Para serte sincero, yo lo he tenido que usar siempre en caso de forzar acceso por un indice, pero creo que este vinculo que te paso a continuación, te puede esclarecer bastante las cosas:

http://www.mcs.csuhayward.edu/support/oracle/doc/8.1.7/server.817/a76992/hints.htm

Saludos
Ricardo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Por qué oracle no usa un indice?

Publicado por Jose (3 intervenciones) el 23/10/2006 21:24:53
ok, gracias por tu ayuda, leeré el articulo.

Jose Rivera
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar