de Martin LE TARNEC

Emulando índices parciales en la base de datos Oracle


La manera extraña de la base de datos Oracle de tomar en cuenta NULL dentro de los índices puede utilizarse para emular los índices parciales. Para eso, tenemos que usar solamente NULL para los registros que no han de indexarse.

Para demostrarlo, emulamos el siguiente índice parcial:

CREATE INDEX messages_todo
          ON messages (receiver)
       WHERE processed = 'N'

Primero, necesitamos una función que devuelve un valor RECEIVER solamente si el valor PROCESSED es igual a 'N'.

CREATE OR REPLACE
FUNCTION pi_processed(processed CHAR, receiver NUMBER)
RETURN NUMBER
DETERMINISTIC
AS BEGIN
   IF processed IN ('N') THEN
      RETURN receiver;
   ELSE
      RETURN NULL;
   END IF;
END

La función es determinista así que puede usarse dentro de la definición del índice.

Ahora, se puede crear un índice que contenga solamente registros con PROCESSED='N'.

CREATE INDEX messages_todo
          ON messages (pi_processed(processed, receiver))

Para usar el índice, se debe utilizar la expresión indexada dentro de la sentencia:

SELECT message
  FROM messages
 WHERE pi_processed(processed, receiver) = ?
----------------------------------------------------------
|Id | Operation                   | Name          | Cost |
----------------------------------------------------------
| 0 | SELECT STATEMENT            |               | 5330 |
| 1 |  TABLE ACCESS BY INDEX ROWID| MESSAGES      | 5330 |
|*2 |   INDEX RANGE SCAN          | MESSAGES_TODO | 5303 |
----------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("PI_PROCESSED"("PROCESSED","RECEIVER")=:X)

Índices parciales, Parte II

En la versión 11g existe un segundo enfoque, igualmente escalo­friante, para emular índices parciales en la base de datos Oracle usando de manera intencional una partición de índice descompuesta y el parámetro SKIP_UNUSABLE_INDEXES .

Si te gusta mi manera de explicar, te encantará mi libro.

Previous pageNext page

You can’t learn everything in one day. Subscribe the newsletter via E-Mail, Twitter or RSS to gradually catch up. Have a look at modern-⁠sql.com as well.

Acerca del autor

Foto de Markus Winand

Markus Winand es defensor del resurgimiento del SQL. Su misión es la de presentar a los desarrolladores la evolución de SQL en el siglo XXI. Es posible contratar a Markus según disponibilidad o como orador o consultor en winand.at.

Adquiere tu libro

Portada de “Rendimiento SQL explicado”: Ardilla corriendo en la hierba

La esencia del tuning de SQL en 200 páginas

Compra ahora
(libro de bolsillo y/o PDF)

Contratar a Markus

La manera más rápida y fácil de beneficiarse de su extenso conocimiento y experiencia.
Aprende más »

Entrar en contacto con Markus

Markus Winand en LinkedInMarkus Winand en XINGMarkus Winand en Twitter
“Use The Index, Luke” de Markus Winand se halla bajo licencia Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License.
Aspectos legales | Contacto | SIN GARANTÍA | Marcas | Privacidad y RGPD | CC-BY-NC-ND 3.0 licencia