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.

[box] 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[/box]

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:

Cuestiones sobre tablas variable

 

 

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!!! 🙂

 

0 Shares:
Deja una respuesta

Tu dirección de correo electrónico no será publicada.

You May Also Like
Leer más

Power BI Dataflows: Machine Learning en dos clicks!

En esta entrada continuaremos con la saga "en dos clicks", en la entrada anterior explicamos como hacer análisis de sentimiento en dos clicks con Power BI dataflows y ahora es el turno de mostrar cómo crear modelos de machine learning de forma automática utilizando la nueva funcionalidad abierta a través de los Power BI Dataflows.
Leer más

BI E2E en Azure

La nube ha abierto en los últimos años escenarios de análisis que antes eran impensables. Sistemas BI levantados y corriendo en minutos en vez de meses, alta disponibilidad al alcance de un botón, pagar únicamente por lo que consumimos... En esta sesión veremos las diferentes opciones que tenemos en Azure para conseguir mover nuestra infraestructura BI a la nube y aprovecharnos de sus ventajas.

Despliegue de Proyectos en Integration Services 2012

En entradas anteriores hemos revisado las características que ofrece el nuevo modelo de servidor de Integration Services, que se basa en Proyectos y Entornos en lugar de Paquetes y Configuraciones.En SQL Server 2012 se mantendrá la compatibilidad con el modelo de despliegue anterior, basado en paquetes, con la denominación Package Deployment Model. Los procedimientos para realizar despliegues en este modo no han variado desde versiones anteriores por lo que nos centraremos en el modelo de despliegue de proyectos Project Deployment Model.