Ayer entre las 12PM y 2PM tuvimos via LiveMeeting en complemento formativo del seminario “Optimización Avanzada de Consultas SQL para Desarrolladores y DBA” que ya hemos hecho 3 veces con AulaVulcan.

Aprovecho para comentar que la semana del 29 de noviembre haremos una iteración más vía LiveMeeting en formato de 3 horas diarias de lunes a viernes; más información en ibinfo@solidq.com

El objetivo del complemento era resolver dudas que los alumnos tuvieron durante el seminario impartido una semana antes; en esas ocasiones, suelo tener preparados ejemplos para profundizar en conceptos de bloqueos (si, esos tan olvidados) para un poco ir calentando el ambiente. Afortunadamente, esta vez, uno de los alumnos tenía una duda concreta en su sistema, y prácticamente monopolizó la sesión con sus problemas 🙂 No hay ningún problema con este tema, porque al ver los problemas que tenía fácilmente convertí su problema en una cuestión general para que todos los asistentes pudieran sacar partido de “su problema”, y es lo que voy a reproducir a continuación.

En mi humilde opinión, este es un tema recurrente, que es raro que no suceda en algo más del 40% de los clientes a los que atendemos, y aunque como lector quizás consideres trivial el problema, estoy convencido que muchos de los seguidores, se sentirán “cautivados” e interesados con el problema.

Por anticipado os digo, que no voy a resolver el problema: lo tendrás que resolver tu, y dentro de 20-30 días, haga otra publicación con la solución y razonamientos al problema. En realidad, me gustaría publicar la solución y justificaciones que vosotros me aportéis 🙂

Problema: el cliente tiene un proceso que rellena una matriz de disponibilidades, que en entorno de desarrollo funciona bien, cuando sólo hay un usuario, pero una vez puesta en producción, como hay muchos usuarios que usan dicha consulta, el tiempo de respuesta es demasiado lento, y como podéis imaginar, resulta molesto para los usuarios.

Qué necesitas para reproducirlo: necesitas SQL Server 2008-2008R2-DenaliCTP1, y necesitas la base de datos Adventureworks.

Para simplificar el problema, estas son las consultas tipo a optimizar; la lógica del proceso es la siguiente:

  • un SP recibe por argumento una lista de Identificadores
  • esa lista de identificadores se mete en una tabla variable
  • a continuación se hacen JOINs entre la tabla variable y tabla del proceso

Además, como podéis imaginar, el número de filas que llegan en cada llamada resulta variable, por lo que el ejemplo está creado para escenarios en los que se solicita el 1% de las filas de la tabla del proceso, el 10% y el 20%.

El script a optimizar es el siguiente:

 

use Adventureworks 
go

-- 01% sales.SalesOrderHeader
declare @ids table (id int primary key (id))
insert @ids select top (
    select cast(count(*) * 0.01 as int) c from sales.SalesOrderHeader
) SalesOrderID
from Sales.SalesOrderHeader 

select *
from Sales.SalesOrderHeader h
inner join @ids i
on h.SalesOrderID = i.id
go

-- 10% sales.SalesOrderHeader
declare @ids table (id int primary key (id))
insert @ids select top (
    select cast(count(*) * 0.10 as int) c from sales.SalesOrderHeader
) SalesOrderID
from Sales.SalesOrderHeader 

select *
from Sales.SalesOrderHeader h
inner join @ids i
on h.SalesOrderID = i.id
go


-- 20% sales.SalesOrderHeader
declare @ids table (id int primary key (id))
insert @ids select top (
    select cast(count(*) * 0.20 as int) c from sales.SalesOrderHeader
) SalesOrderID
from Sales.SalesOrderHeader 

select *
from Sales.SalesOrderHeader h
inner join @ids i
on h.SalesOrderID = i.id

En las pruebas de laboratorio que he hecho, he obtenido los siguientes resultados:

 

 

Donde:

  • en color rojo, los resultados de la consulta anterior
  • en color verde, los resultados haciendo cambios

 

Me gustaría que:

  • me mostrarais como llegar a los números de las columnas verdes más o menos: los números varían de un entorno a otro
  • me enviarais mail indicándome el problema que veis en esas consultas, y elaboréis la respuesta: imagínate que eres un consultor y tienes que justificar tu razonamiento a un cliente: se agradecen justificaciones en la línea de plan de ejecución, IOs, funcionamiento del motor, etc. etc.
  • mi dirección de correo: ELADIO @ SOLIDQ . COM (quitar espacios en blanco)
  • por favor, pon como título del mail el siguiente texto: “BLOG: Cuestiones sobre tablas variable”

 

Te espero!!! 🙂

 

Eladio Rincón