Академический Документы
Профессиональный Документы
Культура Документы
1 de 6
https://msdn.microsoft.com/pt-br/library/dn205319.aspx
Este artigo foi traduzido manualmente. Coloque o ponteiro do mouse sobre as frases do artigo para ver o texto original. Mais informaes.
Traduo
Original
Consulta de exemplo
O exemplo a seguir ser usado para ilustrar conceitos de processamento de consulta discutidos neste artigo.
Vamos considerar duas tabelas, Customer e Order. O script Transact-SQL a seguir contm as definies dessas duas tabelas e os ndices associados, em seu formato baseado em disco
(tradicional):
Transact-SQL
CREATE TABLE dbo.[Customer] (
CustomerID nchar (5) NOT NULL PRIMARY KEY,
ContactName nvarchar (30) NOT NULL
)
GO
CREATE TABLE dbo.[Order] (
OrderID int NOT NULL PRIMARY KEY,
CustomerID nchar (5) NOT NULL,
OrderDate date NOT NULL
)
GO
CREATE INDEX IX_CustomerID ON dbo.[Order](CustomerID)
GO
CREATE INDEX IX_OrderDate ON dbo.[Order](OrderDate)
GO
Para construir os planos de consulta mostrados neste artigo, as duas tabelas foram populadas com dados de exemplo do banco de dados de exemplo Northwind, que voc pode baixar
em Bancos de dados de exemplo Northwind e pubs do SQL Server 2000.
Considere a consulta a seguir, que une as tabelas Customer e Order e retorna a ID da ordem e as informaes de cliente associadas:
Transact-SQL
SELECT o.OrderID, c.* FROM dbo.[Customer] c INNER JOIN dbo.[Order] o ON c.CustomerID = o.CustomerID
O plano de execuo estimado, conforme exibido pelo SQL Server Management Studio como segue
Plano de consulta para a juno de tabelas baseadas em disco.
25/05/2015 20:49
2 de 6
https://msdn.microsoft.com/pt-br/library/dn205319.aspx
Considere uma ligeira variao nessa consulta, que retorna todas as linhas da tabela Order, no apenas OrderID:
Transact-SQL
SELECT o.*, c.* FROM dbo.[Customer] c INNER JOIN dbo.[Order] o ON c.CustomerID = o.CustomerID
Nessa consulta, as linhas da tabela Order so recuperadas usando o ndice clusterizado. O operador fsico Hash Match agora usado para Inner Join. O ndice clusterizado em Order
no classificado em CustomerID e, portanto, Merge Join exigiria um operador de classificao, o que afetaria o desempenho. Observe o custo relativo do operador Hash Match
(75%) comparado com o custo do operador Merge Join no exemplo anterior (46%). O otimizador consideraria o operador Hash Match tambm no exemplo anterior, mas concluiu
que o operador Merge Join forneceu melhor desempenho.
Neste cenrio:
1. O usurio emite uma consulta.
2. O analisador e o algebrista constroem uma rvore de consulta com operadores lgicos de acordo com o texto Transact-SQL enviado pelo usurio.
3. O otimizador cria um plano de consulta otimizado que contm operadores fsicos (por exemplo, juno de loops aninhados). Depois da otimizao, o plano pode ser
armazenado no cache do plano. Essa etapa ser ignorada se o cache do plano j contiver um plano para essa consulta.
4. O mecanismo de execuo de consulta processa uma interpretao do plano de consulta.
5. Para cada busca de ndice, verificao de ndice e operador de verificao de tabela, o mecanismo de execuo solicita linhas das respectivas estruturas de ndice e tabela dos
Mtodos de Acesso.
6. Os Mtodos de Acesso recuperam as linhas das pginas de dados e de ndice no pool de buffers e carregam as pginas do disco no pool de buffers conforme a necessidade.
Para a primeira consulta de exemplo, o mecanismo de execuo solicita dos Mtodos de Acesso as linhas no ndice clusterizado em Customer e no ndice no clusterizado em Order. Os
Mtodos de Acesso passam pelas estruturas de ndice da rvore B para recuperar as linhas solicitadas. Nesse caso, todas as linhas so recuperadas como os planos de chamada para
verificaes de ndice completo.
Conforme ilustrado pela figura, na maioria das vezes, o pipeline do processamento de consulta permanece inalterado:
O analisador e o algebrista constroem a rvore de consulta.
O otimizador cria o plano de execuo.
25/05/2015 20:49
3 de 6
https://msdn.microsoft.com/pt-br/library/dn205319.aspx
Observe as seguintes diferenas em relao ao plano para a mesma consulta em tabelas baseadas em disco (figura 1):
Esse plano contm uma verificao de tabela em vez de uma verificao de ndice clusterizado para a tabela Customer:
A definio da tabela no contm um ndice clusterizado.
Os ndices clusterizados no tm suporte nas tabelas com otimizao de memria. Em vez disso, cada tabela com otimizao de memria deve ter pelo menos um ndice
no clusterizado e todos os ndices nas tabelas com otimizao de memria podem acessar com eficincia todas as colunas da tabela sem ter que armazen-las no ndice
ou consultar um ndice clusterizado.
Esse plano contm Hash Match em vez de Merge Join. Os ndices nas tabelas Order e Customer so ndices de hash e, portanto, no so ordenados. Um Merge Join exigiria os
operadores de classificao que diminuiriam o desempenho.
Os procedimentos armazenados compilados nativamente so compilados no momento da criao, enquanto os procedimentos armazenados interpretados so compilados no
momento da primeira execuo. (Uma parte da compilao, particularmente de anlise e algebrizao, ocorre na criao. No entanto, para procedimentos armazenados interpretados, a
otimizao dos planos de consulta ocorre na primeira execuo.) A lgica de recompilao semelhante. Os procedimentos armazenados compilados nativamente so recompilados na
primeira execuo do procedimento se o servidor for reiniciado. Os procedimentos armazenados interpretados sero recompilados se o plano no estiver mais no cache do plano. A
tabela a seguir resume os casos de compilao e recompilao para procedimentos armazenados interpretados e compilados nativamente:
Compilao inicial
Originalmente compilado
Interpretado
No momento da criao.
Na primeira execuo.
25/05/2015 20:49
4 de 6
https://msdn.microsoft.com/pt-br/library/dn205319.aspx
Recompilao
automtica
Na reinicializao do servidor. Ou, remoo do cache do plano, geralmente com base nas alteraes de
estatsticas ou esquema, ou demanda de memria.
Recompilao
manual
Use o sp_recompile. Voc pode remover manualmente o plano do cache, por exemplo, usando DBCC
FREEPROCCACHE. Voc tambm pode criar o procedimento armazenado WITH RECOMPILE e o procedimento
armazenado ser recompilado em cada execuo.
Recuperando um plano de execuo de consulta para procedimentos armazenados compilados de forma nativa
O plano de execuo de consulta para um procedimento armazenado compilado nativamente pode ser recuperado usando o Plano de Execuo Estimado no Management Studio,
ou usando a opo SHOWPLAN_XML no Transact-SQL. Por exemplo:
Transact-SQL
SET SHOWPLAN_XML ON
GO
EXEC dbo.usp_myproc
GO
SET SHOWPLAN_XML OFF
GO
O plano de execuo gerado pelo otimizador de consulta consiste em uma rvore com operadores de consulta nos ns e nas folhas da rvore. A estrutura da rvore determina a
interao (o fluxo de linhas de um operador para outro) entre os operadores. Na exibio grfica do SQL Server Management Studio, o fluxo da direita para a esquerda. Por exemplo,
o plano de consulta na figura 1 contm dois operadores de verificao de ndice, que fornece linhas a um operador de juno de mesclagem. O operador de juno de mesclagem
fornece linhas a um operador de seleo. O operador de seleo, por fim, retorna as linhas ao cliente.
25/05/2015 20:49
5 de 6
operador
Consulta de exemplo
https://msdn.microsoft.com/pt-br/library/dn205319.aspx
Observaes
select
SELECT OrderID FROM dbo.[Order]
INSERT
INSERT dbo.Customer VALUES ('abc', 'def')
UPDATE
UPDATE dbo.Customer SET ContactName='ghi' WHERE CustomerID='abc'
DELETE
DELETE dbo.Customer WHERE CustomerID='abc'
Compute
Scalar
SELECT OrderID+1 FROM dbo.[Order]
Nested
Loops Join
SELECT o.OrderID, c.CustomerID
FROM dbo.[Order] o INNER JOIN dbo.[Customer] c
Classificao
SELECT ContactName FROM dbo.Customer
ORDER BY ContactName
Incio
SELECT TOP 10 ContactName FROM dbo.Customer
Top-sort
SELECT TOP 10 ContactName FROM dbo.Customer
ORDER BY ContactName
Stream
Aggregate
SELECT count(CustomerID) FROM dbo.Customer
25/05/2015 20:49
6 de 6
https://msdn.microsoft.com/pt-br/library/dn205319.aspx
contagem de linhas estimada de 1 ou apenas algumas linhas, usar as junes de loops aninhados menos dispendioso.
Veja a seguir o plano para a consulta;
SELECT o.OrderID, c.* FROM dbo.[Customer] c INNER JOIN dbo.[Order] o ON c.CustomerID = o.CustomerID
Consulte tambm
Conceitos
Introduo s tabelas com otimizao de memria
Contribuies da comunidade
2015 Microsoft
25/05/2015 20:49