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