III – Oracle 9i
Indexação
Índices Baseados em Funções
• É um índice baseado no valor de retorno de
uma expressão ou função
– A função pode ser um método de instância (na
seqüência, consideraremos somente método de
instância)
• O método para cada objeto é précomputado e seu valor de retorno é
armazenado para a chave do índice objeto
– Com isto, os valores das funções são
recuperados do índice, sem que os métodos
tenham que ser computados de novo
Índices Baseados em Funções
• Índices baseados em funções melhoram o
desempenho de consultas que têm uma
função na cláusula WHERE
CREATE OR REPLACE TYPE emp_objtyp AS OBJECT
(
nome VARCHAR2(32),
salario NUMBER,
MEMBER FUNCTION bonus RETURN NUMBER DETERMINISTIC
)
/
CREATE OR REPLACE TYPE BODY emp_objtyp IS
MEMBER FUNCTION bonus RETURN NUMBER DETERMINISTIC IS
BEGIN
RETURN self.salario * .1;
END;
END;
/
CREATE TABLE emp_objtab OF emp_objtyp
/
CREATE INDEX bonus_idx ON emp_objtab x (x.bonus())
/
SELECT VALUE(e)
FROM emp_objtab e
WHERE e.bonus() > 2000
/
Obs: o valor de x é do tipo REF
Índices Baseados em Funções
• Suponha primeiramente que o índice
bonus_idx não tivesse sido criado. Para
processar a consulta, Oracle deve computar
bonus(), em tempo real, para cada objeto
da object table emp_objtab, tornando a
consulta onerosa, provavelmente
• Agora, o índice bonus_idx foi criado. Os
resultados de bonus() são simplesmente
obtidos do índice, com evidentes ganhos de
desempenho
Índices Baseados em Funções
• É necessário que a função sempre retorne o mesmo
valor para cada objeto
– Cláusula DETERMINISTIC
•
A cláusula DETERMINISTIC é uma promessa do
projetista que a função sempre retorna o mesmo
valor para o conjunto de argumentos de entrada do
método de um objeto
• Suponha que o salário de um empregado mude, ou
que o percentual do bônus seja alterado. Neste caso,
o índice deve ser removido e em seguida
reconstruído, sempre com a cláusula
DETERMINISTIC, que é obrigatória nestes casos
Download

Índices Baseados em Funções