SQL Tuning

Basicamente, SQL Tuning é o ato de melhorar uma consulta em SQL para que a mesma seja executada em um tempo menor do que o atual. Existem muitas maneiras de se melhorar uma consulta e de se escrever consultas já otimizadas.

A maioria das formas de se melhorar o tempo de execução de uma consulta estão intrinsecamente relacionadas ao conhecimento do SGBD, portanto, uma consulta que executa rapidamente no Oracle pode ser executada mais lentamente em outro SGBD (SQL Server, MySQL) e até mesmo em uma outra versão do Oracle.

Cada consulta SQL dispara uma série de passos e eventos no SGBD para retornar o resultado e cada SGBD implementa esta série de passos de uma forma diferente, é por isso que o tuning deve ser específico para cada SGBD. Entretanto, há algumas diretrizes gerais que podem ser aplicadas em todos os casos.

Para ter uma ideia da quantidade de tarefas realizadas pelo SGBD, os passos internos do Oracle para executar um comando e retornar um resultado incluem a criação de um cursor, o parse do comando, a definição da localização, tamanho e tipos de dados retornados, habilitação de área de memória para manipular os dados, bind de variáveis, execução do comando em si, e finalmente, fechamento do cursor.

O parse, por exemplo, valida a sintaxe e a semântica do comando e o mantém em uma área de memória. Desta forma, toda vez que o comando for executado, se estiver na área de memória já “parseado”, o passo necessário para fazer o parse será pulado e a execução será mais rápida.

Uma dica para melhorar o tempo de execução da consulta é sempre usar variáveis bind, desta forma a fase de parse provavelmente não será necessária a partir da segunda execução da consulta. Por exemplo, se você fizer as seguintes consultas:

SELECT e.name FROM employees e WHERE e.id = 729;
SELECT e.name FROM employees e WHERE e.id = 730;

Será feito um parse para cada consulta, pois o Oracle considera essas consultas diferentes, já que cada uma das consultas busca por um id diferente. Entretanto, se você fizer algo parecido com a consulta abaixo, será feito apenas um parse, na primeira vez em que a consulta for executada o Oracle faz o parse e o mantém em uma área de memória específica para isso, deixando o id para ser atribuído em outro passo, depois do parse.

SELECT e.name FROM employees e WHERE e.id = :id;

Sendo assim, o parse pode ser reaproveitado com o uso de variáveis bind, economizando um passo no processamento de uma consulta.

Existem várias outras formas de se melhorar o tempo de execução de consultas em SQL, a maioria delas depende de conhecimento específico de como o SGBD processa comandos SQL. Consulte a documentação do seu SGBD e entenda como você pode melhorar as suas consultas.

A documentação do Oracle possui um excelente capítulo sobre SQL Tuning, SQL Tuning Overview.