Neste artigo serão abordadas técnicas para garantir um bom desempenho no PostgreSQL mesmo quando o operador LIKE é utilizado. Este recurso padrão do SQL, tão utilizado por desenvolvedores e ao mesmo tempo temido por DBAs, precisa de certos ajustes no SGBD para não se tornar um pesadelo em ambientes de médio e grande porte.
O operador LIKE e suas deficiências
O operador lógico LIKE, introduzido no padrão SQL92, é um poderoso artifício para comparação de textos em bancos de dados relacionais. Com o operador, podem ser utilizados os caracteres “%” (percentagem) e “_” (underline), os quais têm significados especiais quando ocorrem na expressão a ser testada. O “%” indica que um ou mais caracteres podem aparecer no texto. Já o “_” representa um único caractere qualquer no texto, e não será tratado neste artigo.
Por exemplo, para buscarmos registros cujo nome começa com “JOSE”, usamos a expressão “JOSE %”. Para filtrarmos os nomes que finalizam com “FILHO”, usamos “% FILHO”. E para listar os que possuem “CARLOS” no meio do nome, usamos a expressão “% CARLOS %”.
Na Figura 1 são exibidas as instruções SQL para criação da tabela PESSOAS que será utilizada nos testes de busca neste estudo. A coluna “nome”, de tipo textual, será considerada nestas comparações. A codificação do banco de dados em questão é a LATIN1, a mais adequada para trabalhar com textos no idioma português do Brasil (ISO-8859-1). Para fazer tal tarefa, utilizaremos a ferramenta pgAdmin III, porém partiremos do principio que esta já está em funcionamento. Sendo assim, no pgAdmin III abra o menu Tools ? Query e execute a instrução SQL conforme ilustrado na Figura 1.
Figura 1. Script para criação da tabela PESSOA para testes.
Para que o objetivo principal deste estudo seja alcançado, é preciso que a tabela possua uma quantidade razoável de linhas. Para a elaboração deste artigo, foi utilizada base de dados de pessoas com cerca de 10,5 milhões de registros. Tendo poucas linhas, o planejador (planner) do PostgreSQL sempre efetuará leituras seqüenciais (full scans) na tabela, por esta ser a opção menos custosa nessa situação.
As diversas situações para o emprego do operador LIKE serão exploradas nas seções seguintes, a começar do caso em que o caractere “%” aparece ao final da expressão.
Primeiro caso: “%” ao final
Na primeira situação, consideremos uma típica busca parcial de nome: todos os registros que comecem com “JOSE CARLOS”, ou seja, quando o usuário não tem conhecimento ou certeza do sobrenome desejado. Na Listagem 1 temos a instrução SQL correspondente a este exemplo.
Listagem 1. Busca com operador LIKE e caractere % ao final.
SELECT *
FROM pessoas
WHERE nome LIKE 'JOSE CARLOS %';
Para analisarmos o plano de execuções de uma consulta SQL, ou seja, os caminhos computacionais que o SGBD fará para atender à instrução, utilizamos a cláusula EXPLAIN (específica do PostgreSQL) antes desta última. A saída contém informações úteis para o DBA, como número de linhas esperada, custo aproximado da instrução para o servidor, abordagens de junções, utilização de índices, entre outras coisas. Desta forma, a instrução não chega a ser executada no servidor, apenas o plano é montado e exibido. Para mostrar o plano e executar definitivamente a instrução SQL é preciso usar a cláusula EXPLAIN ANALYZE, como ilustrado na " [...] continue lendo...