CORRECÇÃO: Encomenda associações externas com critérios de filtro antes de associações não selectivos e associações externas

Traduções de Artigos Traduções de Artigos
Artigo: 318530 - Ver produtos para os quais este artigo se aplica.
N.º DE BUGS: 356418 (SHILOH_BUGS)
Expandir tudo | Reduzir tudo

Nesta página

Sintomas

Se submeter uma consulta que contém, pelo menos, uma associação externa com uma condição de filtro na cláusula WHERE na tabela interna da associação externa (por exemplo, uma condição de filtro na tabela de uma associação externa à esquerda para a direita ou tabela da esquerda de uma associação externa à direita), SQL Server pode efectuar associações menos selectivos pela primeira vez em vez de efectuar a associação externa numa fase inicial e a condição de filtro a aplicar. Se a condição de filtro de associação externa for um dos critérios mais selectivos para a consulta, não consegue processar os critérios no início do plano pode conduzir a:
  • Associação intermédio maiores.
  • Processar a utilização de recursos mais elevada pelo SQL Server.
  • Tempo de resposta mais lento para a consulta.

Resolução

Resolução para SQL Server 2005

Para resolver este problema, obtenha o service pack mais recente para o SQL Server 2005. Para obter mais informações, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
913089Como obter o service pack mais recente para o SQL Server 2005
Depois de instalar o SQL Server 2005 service pack, tem de activar o sinalizador de rastreamento 4101 para resolver este problema.

Resolução para SQL Server 2000

Para resolver este problema, obtenha o service pack mais recente do Microsoft SQL Server 2000. Para obter mais informações, clique no número de artigo que se segue para visualizar o artigo na Microsoft Knowledge Base:
290211Como obter o SQL Server 2000 service pack mais recente
Nota : A correcção seguinte foi criada antes da disponibilização do Microsoft SQL Server 2000 Service Pack 3.

A versão inglesa desta correcção deverá ter os seguintes atributos de ficheiro ou posteriores:
   Version       File name
   -----------------------------

   8.00.0584     Sqlservr.exe
				
Nota : devido a dependências de ficheiros, a correcção ou funcionalidade que contém os ficheiros mais recentes poderão também conter ficheiros adicionais.

Ponto Da Situação

Estado de SQL Server 2005

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na secção "Aplica-se a".
Este problema foi corrigido pela primeira vez no Microsoft SQL Server 2005 Service Pack 1.

Estado de SQL Server 2000

A Microsoft confirmou que este é um problema nos produtos da Microsoft listados na secção "Aplica-se a".
Este problema foi corrigido pela primeira vez no Microsoft SQL Server 2000 Service Pack 3.

Mais Informação

O cenário de associação contrived seguinte utiliza a base de dados pubs para demonstrar o cenário:
set ansi_nulls off
go

use pubs
go

create procedure dbo.ansi_nulls_param @P1 varchar(11) as
select t.title_id, a.au_id, ta.title_id, s.stor_id from titles t 
   left outer join titleauthor ta on ta.title_id = t.title_id
   inner join authors a on a.au_id = t.title_id
   inner join sales s on s.title_id = t.title_id
where ta.title_id = @P1
go

exec dbo.ansi_nulls_param '123-45-6789'
go

drop proc dbo.ansi_nulls_param
go

--Slower Query Plan:
       |--Filter(WHERE:([ta].[title_id]=[@P1]))
            |--Nested Loops(Left Outer Join, OUTER REFERENCES:([t].[title_id]))
                 |--Nested Loops(Inner Join, OUTER REFERENCES:([s].[title_id]))
                 |    |--Nested Loops(Inner Join, OUTER REFERENCES:([s].[title_id]))
                 |    |    |--Index Scan(OBJECT:([pubs].[dbo].[sales].[titleidind] AS [s]))
                 |    |    |--Clustered Index Seek(OBJECT:([pubs].[dbo].[authors].[UPKCL_auidind] AS [a]), SEEK:([a].[au_id]=[s].[title_id]) ORDERED FORWARD)
                 |    |--Clustered Index Seek(OBJECT:([pubs].[dbo].[titles].[UPKCL_titleidind] AS [t]), SEEK:([t].[title_id]=[s].[title_id]) ORDERED FORWARD)
                 |--Index Seek(OBJECT:([pubs].[dbo].[titleauthor].[titleidind] AS [ta]), SEEK:([ta].[title_id]=[t].[title_id]) ORDERED FORWARD)

--Faster Query Plan:
       |--Nested Loops(Inner Join, OUTER REFERENCES:([a].[au_id]))
            |--Nested Loops(Inner Join, OUTER REFERENCES:([t].[title_id]))
            |    |--Filter(WHERE:([ta].[title_id]=[@P1]))
            |    |    |--Nested Loops(Left Outer Join, OUTER REFERENCES:([t].[title_id]))
            |    |         |--Index Scan(OBJECT:([pubs].[dbo].[titles].[titleind] AS [t]))
            |    |         |--Index Seek(OBJECT:([pubs].[dbo].[titleauthor].[titleidind] AS [ta]), SEEK:([ta].[title_id]=[t].[title_id]) ORDERED FORWARD)
            |    |--Clustered Index Seek(OBJECT:([pubs].[dbo].[authors].[UPKCL_auidind] AS [a]), SEEK:([a].[au_id]=[t].[title_id]) ORDERED FORWARD)
            |--Index Seek(OBJECT:([pubs].[dbo].[sales].[titleidind] AS [s]), SEEK:([s].[title_id]=[a].[au_id]) ORDERED FORWARD)
				
Note que a tabela Títuloautor é a tabela à direita de uma associação externa à esquerda e WHERE condição da cláusula no Títuloautor que está a ser aplicada após a associação externa. A saída mostra o plano de consulta original, mais lento, onde todas as associações internas são executadas pela primeira vez e a associação externa e o filtro é efectuada pela última vez, apesar de ser a mais selectiva condição para a consulta. O segundo plano de consulta se um plano de forçada que demonstra o plano mais rápido aspecto, em que a associação externa e o filtro é efectuada em primeiro lugar, seguido de associações internas restantes.

Por este cenário em particular, o optimizador continua a escolher o primeiro plano, mesmo depois de aplicar a correcção. Isto acontece porque estas tabelas são tão pequenas e o custo estimado do primeiro plano é baixo suficiente que seja considerado melhor executar apenas com esse plano do que continuar a procurar alternativas subsequentes. À medida que os dados nas tabelas aumenta, o custo do plano de primeiro passa a ser superior e inicia o optimizador para escolher o segundo plano.

Propriedades

Artigo: 318530 - Última revisão: 4 de fevereiro de 2008 - Revisão: 5.1
A informação contida neste artigo aplica-se a:
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL 2005 Server Enterprise
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL 2005 Server Workgroup
Palavras-chave: 
kbmt kbhotfixserver kbqfe kbsqlserv2000sp3fix kbbug kbfix kbsqlserv2000presp3fix KB318530 KbMtpt
Tradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 318530

Submeter comentários

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com