Esse artigo faz parte da revista SQL Magazine edição 52. Clique aqui para ler todos os artigos desta edição

Imagem

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.

 

Imagem

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 Figura 2.

 

Imagem

Figura 2. Explicação do plano de execuções em formato textual.

 

Com a ferramenta pgAdmin III, podemos visualizar os planos de execução do PostgreSQL de uma forma mais amigável em modo gráfico, tal como na ferramenta Query Analyzer da Microsoft. Para fazer a análise e ao mesmo tempo executar a instrução SQL no pgAdmin, na janela Query Tool acione o menu Query ? Explain Options ? Analyze. Em seguida, digite o comando SQL e acione o menu Query ? Explain ou simplesmente pressione a tecla F7 ou clique no botão Imagem. O plano de execução da consulta SQL em questão é exibido na segunda aba, Explain, na parte inferior da tela (vide Figura 3). Veja na Tabela 1 o significado dos ícones mostrados para o plano de execução.

Imagem

Figura 3. Plano de execuções: varredura seqüencial na consulta utilizando LIKE e % ao final.

 

É importante observar que ao analisar o plano de execução não estamos retornando os registros referentes ao comando SQL. Sendo assim, o número de linhas (“3 rows”) exibido na parte inferior da tela na Figura 3 refere-se apenas à análise. Para executar definitivamente a consulta SQL na janela Query Tool, acione o menu Query ? Execute ou pressione a tecla F5 ou clique no botão Imagem.

...

Quer ler esse conteúdo completo? Tenha acesso completo