Blog gratis
Reportar
Editar
¡Crea tu blog!
Compartir
¡Sorpréndeme!
img
img

 

 

SQL Server
Blog. (Apuntes y Recopilaciones) por Norman M. Pardell

img
img

Optimizar Subconsulta. optimize subquery. SQL Server

En ocasiones nos pueden pedir optimizar las consultas y puede ocurrir que se necesite reescribir la consulta real, ya que la pérdida de rendimiento normalmente puede ser causada por tener subconsultas anidadas.

 

Vamos a ver un ejemplo, realizado sobre la base de datos: AdventureWorks2008R2. Veremos formas de mejorar la consulta:

 

 

 

select a.[LoginID],a.BirthDate from [HumanResources].[Employee]as a,[HumanResources].[EmployeeDepartmentHistory] as B

where a.BusinessEntityID=b.BusinessEntityID

and b.ModifiedDate= (select Max(ModifiedDate) from [HumanResources].[EmployeeDepartmentHistory] as c   

where a.BusinessEntityID=c.BusinessEntityID)

 

La anterior consulta nos muestra el plan de ejecución donde os muestro su coste:


Con la clausula OVER el motor optimiza el tiempo de ejecución y los bloqueos de las filas cuando se escribe las consultas con OVER, ya que el motor trabaja sobre los datos ya obtenidos, en vez de volver a recuperarlos de origen.

 

 

select v.[LoginID],v.BirthDate from 

(select a.[LoginID],a.BirthDate,b.ModifiedDate,Max(b.ModifiedDate) over(partition by b.BusinessEntityID ) as M33n@l from

 [HumanResources].[Employee]as a,[HumanResources].[EmployeeDepartmentHistory] as b where 

 a.BusinessEntityID=b.BusinessEntityID ) as v  where v.ModifiedDate=v.M33n@l

 

La anterior consulta nos muestra el plan de ejecución donde os muestro su coste: (y observamos como disminuye)


Finamente os muestro como puede mejorar la consluta, si trabajamos los JOIN, En el plan vemos como disminuye su costo mas aun:

 

Select      a.[LoginID],a.BirthDate

From  [HumanResources].[Employee] A

Inner Join (Select BusinessEntityID,

            Max(ModifiedDate) ModifiedDate

      From  [HumanResources].[EmployeeDepartmentHistory]

      Group By BusinessEntityID) B

      On A.BusinessEntityID=B.BusinessEntityID

 


 

Siempre que puedeas intenta usar JOIN en lugar de Subselct, en mas del 80% de los casos el JOIN te dará mejor rendimiento.Asique, cuando puedas reemplazar las subconsultas por un JOIN el rendimiento subirá enormemente porque no se ejecutara por cada fila la subconsulta, sino que aplicará conjuntos.. En las ocaciones donde tengas que sacar un conjunto de resultados para hacer un cruce con otras tablas o consigo misma y no puedas valerte del with cte u otras formas, es la solucion correcta..

 

En ocasiones puede volver a escribir una subconsulta para que utilice operadores JOIN y mejorar el rendimiento. La ventaja de crear un operador JOIN consiste en que puede evaluar tablas en un orden distinto del definido por la consulta. La ventaja de usar una subconsulta es que normalmente no es necesario explorar todas las filas de la subconsulta para evaluar la expresión de ésta. Por ejemplo, una subconsulta EXISTS puede devolver TRUE al ver la primera fila que coincida.

 

Depende mucho en que circunstancia se utiliza las subconsultas, y siempre conviene que te fijes en el plan de ejecución de la query para asegurarte..

 

 

Apunte y recopilación por Norman M. Pardell

Puedes consultarme, si deseas cualquier aclaración, pregunta o sugerencia en: Contacto, contestaré tan pronto como me sea posible.

 

publicado por normanmpardell a las 18:31 · Sin comentarios  ·  Recomendar
Comentarios (0) ·  Enviar comentario
Esta entrada no admite comentarios.
img
.Sobre mí
FOTO

Norman M. Pardell

MCITP: Database Administrator & Database Developer, SQL Server 2008. MCC Award Certificate. Consultor Senior de bases de datos en Capgemini España, S.L. Asesoramiento en implementación, desarrollo y gestión de bases de datos en grandes compañías. Actualmente, asignado a proyecto en compañía líder en el sector energético global. Más de 10 años trabajando con SQL Server (y otros gestores de BBDD)

» Ver perfil

img
.Secciones
» Inicio
img
.Enlaces
» Microsoft MSDN Foros
» Windows Server 2012
img
.Más leídos
» Asignar la cantidad correcta de Memoria para SQL Server
» Base de Datos Sospechosa (Suspect)
» Como modificar la Intercalación (Collation) en SQL Server
» Como renombrar una instancia de SQL Server. sp_dropserver. sp_addserver
» Detectar bloqueos. SQL Server V.2005 y superiores
» Funciones SQL Server. Funciones escalares y funciones con valores de tabla.
» Integridad y corrupción en las bases de datos: DBCC CHECKDB
» Log de transacciones ( .ldf ). SQL Server.
» Migrando SQL Server 2005, 2008, 2008 R2 a SQL Server 2012
» Transacciones activas. SQL server 2008
img
.Nube de tags [?]
                                                           
img img
FULLServices Network | Crear blog | Privacidad