1.3 - Como o SGBD processa uma operação que contenha a expressão LIKE
Operações SQL que utilizam a expressão LIKE não utilizam índices; essas operações fazem pesquisa linear em todos os dados do conjunto de dados. Se uma instrução SQL possuir um operador LIKE e algum outro operador lógico (como os citados anteriormente), primeiramente os operadores lógicos serão processados (utilizando índices) e diminuindo o conjunto de dados, e, posteriormente o operador LIKE será executado apenas nesse subconjunto, por meio de uma consulta linear.
Exemplo: Vamos ver como o SGBD processa a operação SELECT * FROM FUNCIONARIOS WHERE Nome LIKE “%Marcelo%” AND Idade > 18 AND Salario > 1000. Vamos supor ainda que a tabela de funcionários possua 10.000 registros:
Primeiro o SGBD analisa a instrução à procura de operações de filtragem de registros e identifica que há três operações.
Na sequência ele verifica quais índices existem para as consultas apresentadas. Vamos supor que ele tenha identificado que há um índice para Nome, outro para Idade e outro para Salário.
Ao observar que a operação sobre o campo Nome é uma instrução LIKE, o SGBD despreza esse índice, ficando agora com dois índices.
O SGBD processa inicialmente o filtro mais externo da instrução SQL, ou seja, Salario > 1000, realizando a operação sobre o índice de Salário. Vamos supor que dos 10.000 registros iniciais, apenas 2.000 satisfazem essa condição; o SGBD então cria em memória um subconjunto dos ID’s de chave primária desses 2.000 registros que satisfazem a condição (já vimos que essa operação é feita por meio do algoritmo b-tree).
Na sequência, o SGBD processa o filtro seguinte, ou seja, Idade > 18, realizando essa operação apenas no subconjunto de ID’s de chave primária criado no passo anterior. Vamos supor que ao aplicar esse filtro no subconjunto criado ele tenha identificado que apenas 800 dos 2.000 registros atendem ao critério (novamente usando o algoritmo b-tree). Então ele cria um outro subconjunto, menor, com apenas 800 ID’s de chave primária.
Agora só resta ao SGBD processar a operação LIKE. Como essa operação não é baseada em índice, ele utilizará o subconjunto criado de 800 ID’s para processar a operação LIKE desejada. Vamos supor que ao processar essa operação, o SGBD identifique que 30 registros atendem à essa condição (foram realizados 800 testes lógicos para essa operação).
Agora, o SGBD fará a leitura de todos os campos (SELECT * FROM FUNCIONARIOS...) desses 30 registros identificados, retornando o resultado para o usuário.
Veja no exemplo acima que a pesquisa linear do operador LIKE não foi processada nos 10.000 registros do conjunto, mas somente nos 800 registros que atenderam às duas outras condições impostas na cláusula WHERE. Entretanto, a consulta consumiu 23 testes lógicos para os dois filtros iniciais e mais 800 para o filtro LIKE, totalizando 823 testes lógicos. Perceba como as operações LIKE podem ser extremamente onerosas para o banco de dados!