Olá pessoal,
De um modo geral devemos evitar comparações de negação sempre que possível, e por que devemos evitá-las? Porque se você tiver um índice do tipo b-tree na coluna em que a comparação de negação for utilizada, normalmente ele será ignorado, e por que isso ocorre? Porque segundo a Oracle (consultar última versão do Oracle SQL Tuning Guide) índices do tipo B-tree são ótimos para serem criados em colunas com alta cardinalidade visando otimizar consultas que retornam poucos dados, em média quando a seletividade é de até 4% do total de linhas das tabelas envolvidas. Mais que isso normalmente o índice b-tree deixará de ser eficiente, então o otimizador irá preferir realizar uma operação de FULL TABLE SCAN (ao invés de INDEX SCAN). Quando há uma comparação de negação, normalmente a seletividade será maior que 4%, por esse motivo, "quase sempre" o otimizador irá ignorar índices do tipo B-tree. É importante ressaltar, porém, que existem (pouquíssimos) casos em que o btree pode ser usado até mesmo numa comparação de negação, mas como isso raramente irá acontecer, é necessário pensar em outra solução para otimizar SQLs desse tipo. Uma alternativa é criar um índice do tipo BITMAP, ao invés de B-tree. O Bitmap pode atender perfeitamente essa necessidade, porém ele possui outras desvantagens, como por exemplo, ter um tempo de atualização extremamente alto, o que normalmente inviabiliza o seu uso em ambientes OLTP. Ele é ótimo para ambientes OLAP!
Veja na "Imagem 01" que criei um índice B-tree na coluna ID_STATUS da tabela ECOMMERCE.PEDIDO, e em seguida verifiquei o plano de execução de um SELECT que filtra dados na coluna ID_STATUS através de uma comparação de negação. Neste caso podemos verificar na "Imagem 02" que o índice foi ignorado.
Imagem 01 - Criação de um índice b-tree na coluna ID_STATUS |
Imagem 03 - Recriando o índice como bitmap |
Imagem 04 - Plano de execução do SELECT utilizando o índice bitmap |
0 comments:
Postar um comentário