No exemplo abaixo utilizamos uma query que foi retirada do Books on Line do SQL Server 2000. Esta query é executada no banco de dados Northwind e tem a função de obter o maior Preço Unitário de cada pedido armazenado na tabela Orders: /*********************************/
/* Tempo de Execução: 30 segundos */
/* Linhas Retornadas: 830 */
/*********************************/
SELECT Ord.OrderID, Ord.OrderDate,
(SELECT MAX(OrdDet.UnitPrice)
FROM Northwind.dbo.[Order Details] AS OrdDet
WHERE Ord.OrderID = OrdDet.OrderID) AS MaxUnitPrice
FROM Northwind.dbo.Orders AS Ord
Este tipo de query é chamado de Subquery – você pode observar que existem duas instruções SELECT, a “principal” (
SELECT Ord.OrderID, Ord.OrderDate), que seleciona o OrderID e a Data da tabela Orders, e a subquery (escrita em vermelho), que seleciona o maior Preço Unitário para cada pedido. A subquery é executada para cada linha que a query principal retorna e estes acessos repetidos à tabela [order details] podem se tornar extremamente ineficientes, dependendo da quantidade de linhas envolvidas no processo.A query acima poderia ser facilmente reescrita utilizando-se um JOIN. O exemplo abaixo utiliza um INNER JOIN entre as tabelas Orders e [Order Details] associado com a função MAX( ), produzindo exatamente o mesmo resultanto, porém de maneira muito mais eficiente.
/********************************/
/* Tempo de Execução: 1 segundo */
/* Linhas Retornadas: 830 */
/********************************/
SELECT Ord.OrderID, Ord.OrderDate,
MAX(OrdDet.UnitPrice) AS maxUnitPrice
FROM [Order Details] AS OrdDet
INNER JOIN Orders AS Ord
ON Ord.OrderID = OrdDet.OrderID
GROUP BY Ord.OrderID, Ord.OrderDate
E
mbora os mesmos dados sejam retornados nas duas queries, a segunda versão utiliza cerca de 40% menos recursos do SQL Server do que a primeira e o tempo de execução é extremamente menor. Contudo, em alguns casos é possível se utilizar um terceiro método para obter ganhos ainda significativos de performance:TABELAS DERIVADAS
Usar uma tabela derivada é semelhante a utilizar uma tabela temporária. Porém, sem a dificuldade e o desgaste de ter que criá-la e referenciá-la. Utilizaremos como exemplo a mesma query extraída do Books on Linee demonstrada no item anterior:
/**************************************/
/* Tempo de Execução: menos de 1 segundo */
/* Linhas Retornadas: 830 */
/**************************************/
SELECT Ord.OrderID, Ord.OrderDate, maxUnitPrice
FROM Northwind.dbo.Orders AS Ord INNER JOIN
(SELECT orderID,
MAX(UnitPrice) AS maxUnitPrice
FROM Northwind.dbo.[Order Details]
GROUP BY OrderID) AS OrdDet
ON ordDet.orderID = Ord.orderID
ORDER BY Ord.OrderID DESC, Ord.OrderDate, maxUnitPrice
O código em vermelho faz com que o SQL Server Optimizer crie uma tabela derivada chamada OrdDet durante a execução da query. A tabela derivada ocupa muito menos espaço que a tabela original [Order Details], pois a mesma contém apenas duas colunas e uma linha de detalhe para cada pedido. Por causa disto, a versão da query que utiliza tabelas derivadas será executada mais rápido do que a versão que utiliza o INNER JOIN e o resultado final será exatamente o mesmo.
O que você achou desta dica? Indique sua opinião no bloco “Classificação de notícias”.
Caso você possua alguma dica sobre SQL Server e gostaria de vê-la publicada aqui, envie-a para nós. Ela será publicada tendo seu nome como autor.

