REVISIÓN: Reordenar las combinaciones externas con criterios de filtro antes de las combinaciones no selectivas y combinaciones externas

Seleccione idioma Seleccione idioma
Id. de artículo: 318530 - Ver los productos a los que se aplica este artículo
Nº DE ERROR: 356418 (SHILOH_BUGS)
Expandir todo | Contraer todo

En esta página

Síntomas

Si envía una consulta que contiene al menos una combinación externa que tiene una condición de filtro en la cláusula WHERE en la tabla interna de la combinación externa (por ejemplo, una condición de filtro en la tabla derecha de una combinación externa izquierda o la tabla izquierda de una combinación externa derecha), SQL Server puede realizar combinaciones menos selectivas primero en lugar de realizar la combinación externa pronto y aplicar la condición del filtro. Si la condición de filtro de combinación externa es uno de los criterios de la consulta más selectivos, puede producir error al procesar los criterios de pronto en el plan:
  • Tamaños mayores de combinación intermedia.
  • Proceso de mayor utilización de recursos por SQL Server.
  • Tiempo de respuesta más lento de la consulta.

Solución

Resolución para SQL Server 2005

Para resolver este problema, obtenga el service pack más reciente para SQL Server 2005. Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
913089Cómo obtener el service pack más reciente para SQL Server 2005
Después de instalar el service pack de SQL Server 2005, debe activar el indicador de traza 4101 para resolver este problema.

Resolución para SQL Server 2000

Para resolver este problema, consiga el Service Pack más reciente para Microsoft SQL Server 2000. Para obtener más información, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
290211Cómo obtener el Service Pack más reciente de SQL Server 2000
Nota : la revisión siguiente se creó antes del lanzamiento de Service Pack 3 de Microsoft SQL Server 2000.

La versión en inglés de esta revisión debe tener los atributos de archivo siguientes o posteriores:
   Version       File name
   -----------------------------

   8.00.0584     Sqlservr.exe
				
Nota : debido a la interdependencia entre archivos, el más reciente revisión o característica que contiene los archivos quizás contenga también archivos adicionales.

Estado

Estado de SQL Server 2005

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados en la sección "La información de este artículo se refiere a:".
Este problema se corrigió por primera vez en Microsoft SQL Server 2005 Service Pack 1.

Estado de SQL Server 2000

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft enumerados en la sección "La información de este artículo se refiere a:".
Este problema se corrigió por primera vez en el Service Pack 3 de Microsoft SQL Server 2000.

Más información

El siguiente escenario artificioso combinación utiliza la base de datos pubs para demostrar el escenario:
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)
				
tenga en cuenta que la tabla titleauthor es la tabla derecha de una combinación externa izquierda y WHERE condición de la cláusula en titleauthor se aplica después de la combinación externa. El resultado muestra el plan de consulta original, más lento, donde se realizan primero todas las combinaciones internas y la combinación externa y el filtro se realiza de por último, aunque la condición más selectiva para la consulta. El segundo plan de consulta es un plan forzado que muestra el aspecto del plan más rápido, en el que la combinación externa y el filtro se efectúa primero, seguido de las restantes combinaciones internas.

Para este escenario concreto, el optimizador continúa elegir el primer plan incluso después de aplicar la revisión. Esto es porque estas tablas son tan pequeñas y el costo estimado del primer plan es lo suficientemente bajo para que se considera mejor ejecutar sólo con ese plan que continuar buscando alternativas siguientes. A medida que aumenta datos en las tablas, el costo del primer plan pasa a ser mayor y el optimizador se inicia para elegir el plan de segundo.

Propiedades

Id. de artículo: 318530 - Última revisión: lunes, 04 de febrero de 2008 - Versión: 5.1
La información de este artículo se refiere a:
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Workgroup Edition
Palabras clave: 
kbmt kbhotfixserver kbqfe kbsqlserv2000sp3fix kbbug kbfix kbsqlserv2000presp3fix KB318530 KbMtes
Traducción automática
IMPORTANTE: Este artículo ha sido traducido por un software de traducción automática de Microsoft (http://support.microsoft.com/gp/mtdetails) en lugar de un traductor humano. Microsoft le ofrece artículos traducidos por un traductor humano y artículos traducidos automáticamente para que tenga acceso en su propio idioma a todos los artículos de nuestra base de conocimientos (Knowledge Base). Sin embargo, los artículos traducidos automáticamente pueden contener errores en el vocabulario, la sintaxis o la gramática, como los que un extranjero podría cometer al hablar el idioma. Microsoft no se hace responsable de cualquier imprecisión, error o daño ocasionado por una mala traducción del contenido o como consecuencia de su utilización por nuestros clientes. Microsoft suele actualizar el software de traducción frecuentemente.
Haga clic aquí para ver el artículo original (en inglés): 318530

Enviar comentarios

 

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