MCDBA Brasil


  • Home
  • Sobre
  • Contato

Livros





Links Rápidos

SQL Server Builds (All Versions/Editions)


Download SQL Server 2017 (trial)


SQL Server 2017 Feature Pack


SQL Server 2016 Feature Pack


Cumulative Update SQL Server 2017 builds


Cumulative Update SQL Server 2016 builds


Cumulative Update SQL Server 2014 builds


Cumulative Update SQL Server 2012 builds


SQL Server 2005/2008 Samples Databases


Documentando o Servidor SQL Server


Analisando a Performance do Servidor-CheckList


Virtual PASS PT


Faça parte do maior virtual chapter do PASS com conteúdos técnicos em Português sobre SQL Server.

Todos os meses um evento Online para você! Acompanhe aqui os WebCasts já agendados

Sindicalize seu blog ou site ao VirtualPASSPT

SQL Server Blogs

SQL Server Query Processing Team


SQL Programmability & API Development Team


SQL Server Manageability Team


Latin America Support Team


Database + Disk + Performance


Microsoft SQL Server Support


SQL CLR Team


SQL Query Optimization Team


SQL 2005 Code Samples


SQL Server Express Team


SQL SMO Samples


SQL Storage Engine Team


SQL CAT Team


SQL Protocols Team


PSS SQL Server Engineers


Slava Oks on SQLOS


Ken Henderson’s blog


LUTI@Microsoft Blog


kimberly L. Trip’s blog


Fernando Garcia Blog

Dica da Semana

Melhorando a Performace das Queries

por Nilton Pinheiro novembro 1, 2004 Nenhum comentário


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



Embora 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.



 

Avaliação:
Compartilhe:
  • Anterior Problema com Datetime após aplicação de FIX no SQL 200021 anos atrás
  • Próximo PSS Service Center Labs – 200421 anos atrás

Deixe uma resposta Cancelar resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

MVP Reconnect Award

Categorias

  • Artigos (359)
  • Dica da Semana (95)
  • Documentação (54)
  • Downloads (113)
  • MSDE 2000 (3)
  • Sem categoria (1)
  • Tutoriais (9)

Posts recentes

  • #FechouBrasil #PartiuPortugal
  • Brigando com o erro “The cached MSI file is missing”
  • MCDBABRASIL está de volta
  • Documentando o Servidor SQL Server
  • Brigando com os Erros 17182, 17826 e 17120

SQL Server AlwaysOn Video Series

Video1: Introdução ao SQLServer2012 AlwaysOn


Video2: Introdução ao SQLServer2012 AlwaysOn Availability Group


Video3: Introdução ao SQLServer2012 AlwaysOn AVG-Demo


Video4: Introdução ao SQLServer2012 AlwaysOn Listener


Video5: Introdução ao SQLServer2012 AlwaysOn Readable Secondaries


Video6: Introdução ao SQLServer2012 AlwaysOn Readable Secondaries-Demo


Video7: Introdução ao SQLServer2012 AlwaysOn Failover Clustering


Serie SQL Server Failover Clustering End-to-End

Parte 1: Configuração da Rede e Ambiente


Parte 2: Configurando o Windows 2008 R2 Domain Controler e DNS


Parte 3: Preparando os nós para o Failover Cluster


Parte 4: Configurando um Failover Cluster de 2 nós


Parte 5: Configurando as LUNs no iSCSI Software Target (Parte 1)


Parte 6: Configurando as LUNs no iSCSI Software Target (Parte 2)


Parte 7: Apresentando as LUNs para os nós do Failover Cluster


Parte 8: Configurando os discos no Failover Cluster


Parte 9: Instalando a primeira instância virtual do SQL Server 2008


Parte 10: Instalando a segunda instância virtual do SQL Server 2008


Parte 11: Instalando e Configurando o MSDTC no Failover Cluster


Parte 12: Configurando Mount Points no Cluster e SQL Server 2008


Vídeo Extra: Removendo uma Instância do SQL Server 2008 R2 em Cluster


Alta Disponibilidade no SQL Server 2008 R2: Failover Clustering Overview


Alta Disponibilidade no SQL Server 2008 R2: Failover Clustering na Prática

Menu

  • Home
  • Sobre
  • Contato

Mais

  • RSS Feeds
2026 MCDBA Brasil.