We Will Rock You: Evento sobre SQL Server 2008 en MAD.NUG

En una nueva demostración de mi proverbial despiste, vengo aprisa y corriendo a postear en mi blog mi próximo evento, aunque un poquillo tarde, ya que será este mismo jueves! Los chicos del grupo de usuarios de .NET de Madrid (MAD.NUG) me han invitado a dar una pequeña sesión sobre novedades en SQL Server 2008, por lo que os invito a todos los que tengais la tarde del miércoles libre a que nos acompañéis durante unas horas; estoy negociando el poner un ‘circulo de la muerte’ para organizar peleas de gladiadores entre desarrolladores y administradores para animar el asunto! 🙂

A continuación os dejo la información del evento:

SQL Server 2008

Lugar: Oficinas de Microsoft en La Finca, Madrid
Fecha: 6 de noviembre de 2008
Horario: 19:00 a 21:00 horas 

A pesar de que el lanzamiento de SQL Server 2008 se ha producido ya hace algunos meses, aún son muchas las áreas oscuras del producto, el desconocimiento de sus nuevas características, mejoras, etc. Como ya sucediera con SQL Server 2005, y como con cualquier producto o tecnología nueva, pasará bastante tiempo hasta que asimilemos y empleemos con naturalidad las novedades, y pasen a formar parte de nuestro arsenal del día a día.

En esta sesión vamos a dar un repaso a las novedades de SQL Server 2008: desde el desarrollo a la administración, desde el motor de almacenamiento a Business Intelligence. Recorreremos algunas de las características más conocidas y, cómo no, haremos hincapié en las menos conocidas. Las aburridas PPTs de rigor irán acompañadas de demostraciones prácticas sobre los nuevos tipos de datos, la MERGE, tablas como parámetros, optimización, y un poquito de administración también.

Por supuesto, la sesión contará con su apartado de preguntas y respuestas, por lo que os animamos a que vengáis con vuestra batería de cuestiones preparadas desde casa para hacer tiro al blanco con el ponente.

Agenda

1.- Introducción a SQL Server 2008
2.- Novedades para Desarrolladores
    – Nuevos Tipos de Datos
       – Datos espaciales
       – Fechas y Horas
       – Estructuras Jerárquicas
    – Operación MERGE
    – Mejoras al XML
    – Mejoras a los tipos de CLR
    – Otras mejoras: TVP, iFTS, Sync Framework
3.- Novedades de Administración
    – Policy-Based Administration
    – Resource Governor
4.- Novedades del Motor de Almacenamiento
    – Compresión de Datos
    – Transparent Data Encryption
    – Vardecimal
5.- Business Intelligence en SQL Server 2008
    – Integration Services
    – Reporting Services
    – Analysis Services

Rock Tip:

No podía ser de otra manera. Lo sé desde el pasado sábado, 25 de Octubre. No importaba de que fuera a tratar mi siguiente post en en geeks.ms (tengo en la recamará ‘esperas en
SQL Server’, continuar la serie de WinDbg o una nueva serie sobre los derviches giróvagos y su relación con el macrocosmos órfico), pero tenía claro que el rock tip sería una alusión al espectacular concierto que Queen + Paul Rodgers tuvieron a bien darnos en Madrid.

Y cuando digo ‘espectacular’, no me refiero a lo bien que tocaron (… y que bien que tocaron, oye!), ni a lo más o menos acertado de su repertorio (… pero que repertoriooooooigaaaa!), ni a lo mejor o peor que fuera su montaje y puesta en escena (pantalla espectacular, bolica de discoteca que hacia estrellicas…). Fue espectacular, sobre todo, porque poder estar ahí, al ladito de Mr. May, de Mr. Taylor y de Mr. Rodgers es todo un lujo, pero aún lo es más pudiéndo compartirlo con Octavio, Dennis, Popi, Jose, Juan y Cris… y como no, con Freddie. Por que no nos engañemos, Freddie estuvo ahí esa noche, con nosotros 🙂

No os voy a poner links al grupo, ni a los temas.. sería casi insultante. Tampoco voy a decir que fuera lo mismo que verlos con Freddie sobre el escenario, porque no es así. Pero si os diré, a quienes no hayáis tenido la oportunidad de oírles con Paul Rodgers, que le deis una oportunidad al chaval (¿?), el tío lo hizo muy pero que muy bien, ¡increíble la voz que tiene ese tío con sus 60 añazos encima!

PD: Octavio, tío, te debo una cerveza por descubrirme a Free, Bad Company y a ese pedazo de vocalista y músico que es Paul Rodgers!

Back to the Bullet: Sesión de Depuración y Optimización

El jueves pasado tuve la oportunidad de pasar unas horas hablando sobre depuración avanzada y optimización de aplicaciones junto a mi compañero y amigo Luis Guerrero, del DOT Team de Plain Concepts. La respuesta ha sido muy buena, tanto en correos de agradecimiento, así como comentarios y preguntas (que espero responder a lo largo de este fin de semana! 😉 ), así que lo suyo es que, a pesar de lo abandonadito que tengo el blog, al menos dedique una pequeña entrada para colgar los materiales y agradeceros la presencia en esta sesión tan especial 🙂

Aquí tenéis la presentación de Introducción a la Depuración Avanzada, y aquí la de optimización de SQL Server, aunque esta ultima no la llegamos a ver por falta de tiempo.

Os dejo aquí los enlaces a las sesiones grabadas:

revoluciona

Por último dar las gracias a todos los que nos acompañasteis durante la sesión, ya fuera presencialmente o a través de la sesión de Live Meeting, así como a los chicos del CIIN, que nos permitieron ‘hostear nuestro proceso en su AppDomain’ 🙂 .

Rock Tip:

El rock tip de hoy no tiene mucha relación con el tema, simplemente me apeteció titular al post con ‘Back to the Bullet’ porque hacía mucho que no sacaba un ratín para escribir en geeks.ms, y esta es mi vuelta, mi regreso al redil 😉 La expresión me vino a la cabeza gracias al gran tema de Saraya del mismo nombre, que a pesar de estar en el lado mas blando y ñoño de la música que yo pueda escuchar, no deja de ser un tema excelente.

Aunque el grupo tuvo éxito en su época, se separaron poco después de sacar el segundo disco; de la guapisima Sandi Saraya no os puedo contar mucho, ya que parece haberse escondido en las mismas montañas de Tora Bora, porque no ha vuelto a saberse nada de ella. El teclista de la formación, Gegg Munier, falleció hará un par de años y el guitarrista, Tony «Bruno» Rey, curiosamente fue el primer guitarrista de otro grupo que ya apareció en mas de un post mío, los inigualables Danger Danger, donde con el tiempo sería sustituido por Andy Timmons.

Patience: Ejecución de Tareas en SQL Server

En esta entrada estrenábamos una sección dedicada a la resolución de problemas de rendimiento en SQL Server, y os comentaba que tenía pensado dedicar éstas primeras entregas principalmente a la arquitectura del producto; mi idea es dedicar cada entrada a describir algunos de los conceptos determinantes para el rendimiento en la ejecución de nuestras consultas y acompañarlo de ejemplos prácticos.


Pues bien, en esta ocasión me gustaría hablaros de las esperas en SQL Server; un concepto fundamental de cara a la identificación de potenciales problemas de rendimiento. Y digo que me gustaría hablaros de las esperas, porque no voy a poder hacerlo 🙂 Antes de ello, deberemos ver una introducción básica a la ejecución de tareas en SQL Server para posteriormente, en una entrada futura, introduciros a las esperas y a mi metodología de resolución de problemas de rendimiento favorita en SQL Server… (pero que bueno soy creando tensión y expectación, ¿eh? 🙂 )


Al turrón…


Ejecución de Tareas en SQL Server


El objetivo último de SQL Server es procesar tareas, y para ello necesita una serie de recursos (disco, memoria, red…), así como, al menos, un procesador. Hasta ahí nada nuevo. Lo que quizá no se conoce tanto es que SQL Server dispone internamente de unos procesadores lógicos llamados schedulers, que van a ser clave a la hora de entender como se procesan las tareas, como interpretar las esperas y un sin fin de detalles relevantes para el rendimiento de nuestros servidores.


Cuando SQL Server arranca, una de las primeras cosas que hace es consultar al sistema operativo, mediante WMI, cuantos procesadores tiene la máquina, para posteriormente crear tantos schedulers como procesadores se hayan detectado. El objetivo de éstos será el de ejecutar las tareas del servidor (nuestras consultas, procesos internos de SQL Server como el lazy writer, etc.), de un modo coordinado con el UMS/SQLOS del que hablaremos en otra entrada.


Cada uno de esos procesadores lógicos tendrá asignada una lista de tareas, implementadas mediante worker threads, que se ejecutarán a medida que el scheduler vaya quedando libre. Estos worker threads se implementan, por defecto, como hilos del sistema operativo (se puede cambiar este comportamiento para que funcionen como fibras, en caso de tener el servidor funcionando en fiber mode), con su consiguiente consumo de memoria y recursos por cada uno de los hilos. Por esta razón, y para evitar un crecimiento masivo de hilos en el sistema, hay un parámetro de configuración del servidor llamado max_worker_threads, que permite limitar el número máximo de hilos que SQL Server va a pedir al sistema operativo para ejecutar tareas en ellos. Éste será también el número máximo de tareas que va a tener el sistema, distribuido entre todos sus schedulers.


Un par de ejemplos

Scheduler para una única CPU


El escenario más básico sería el que representamos en el diagrama de la derecha. En éste caso, disponemos de una máquina tradicional con una única CPU de un núcleo.


El proveedor WMI devolverá que hay una CPU, y SQL Server creará un único scheduler que gestionará la ejecución de todas las tareas del servidor. Habrá, por tanto, una única lista de tareas, con n worker threads, donde n es el número establecido en la variable de configuración max_worker_threads.


El siguiente escenario (en el diagrama de abajo) representa un entorno con dos CPUs de doble núcleo. Como podemos ver, cada uno de las CPUs se enumera como dos CPUs diferentes por WMI (hay dos núcleos por cada CPU), por lo que tendremos un total de cuatro schedulers. Por otra parte, vemos que habrá cuatro listas de ejecución de tareas, cada una de ellas con un limite máximo de una cuarta parte de las tareas máximas definidas por el max_worker_threads. Esto es así porqué SQL Server trata de equilibrar la carga equitativamente entre todos sus procesadores.


sched2


Hay un tercer escenario interesante, pero me lo reservo para un poquito más adelante en este mismo post 🙂 Eso si, no me gustaría acabar esta sección sin comentar un par de detalles:



  • Una tarea no puede abandonar un scheduler y moverse a otro a mitad de su ejecución. Esto es, una tarea esta atada a un scheduler desde su creación hasta su finalización.
  • Se puede establecer una Mascara de Afinidad para determinar que CPUs vamos a usar en SQL Server, que schedulers vamos a crear, etc. pero esta fuera del ámbito de esta entrada por lo que no lo comentaremos de momento.

Consultando los Schedulers


Bien, ya hemos visto que, en teoría, existe por ahí algo que se llaman schedulers, que son CPUs lógicas que sirven para controlar la ejecución de tareas en SQL Server, y que además tienen forma de cajas de color verde con un suave y artístico degradado. Pero, sin duda alguna, en este instante os estáis preguntando si hay alguna manera de ver éstas estructuras en el servidor. Y también sé que, hasta que no descubráis como, no vas a poder conciliar el sueño. Por eso mismo, y porque no puedo tolerar el sufrimiento humano, pasamos sin más preámbulos a echar un vistazo a los metadatos que SQL Server expone para que veamos la información de los schedulers.


La siguiente query consulta sys.dm_os_schedulers, la DMV principal para obtener información acerca de los mismos:



SELECT
   scheduler_id,
   cpu_id,
   status
FROM sys.dm_os_schedulers


Mi máquina de pruebas tiene una única CPU dual core. En ella, la ejecución de la consulta muestra el siguiente resultado:


resultado1


¿Y esto? ¿No deberían aparecer solo dos schedulers según lo que hemos visto arriba? Bien, lo cierto es que solo los dos que aparecen marcados en naranja son normales. Los dos que aparecen con estado HIDDEN ONLINE se emplean para procesar las tareas del sistema, mientras que los VISIBLE ONLINE se dedican al proceso de tareas de usuario, y son en las que nos fijaremos normalmente de cara a identificar potenciales problemas de rendimiento.


El último scheduler, categorizado como VISIBLE ONLINE (DAC), esta reservado exclusivamente para la Dedicated Administrator Connection (Conexión Dedicada de Administrador). Simplificando mucho, SQL Server 2005 incorpora, por defecto, un nodo NUMA oculto, compuesto por una pequeña cantidad de memoria y un scheduler, que nos permiten retomar el control del servidor para hacer troubleshooting básico del sistema en caso de que los schedulers ‘normales’ no estén disponibles o se encuentren monopolizados.


El la práctica, lo habitual es filtrar la búsqueda para que no nos muestre ningún scheduler cuyo ID sea menor a 255, con lo que nos quedamos solo con los schedulers de usuario.


Complicando un poco más el asunto…


En realidad el modelo no es tan sencillo como una lista de tareas por scheduler. En SQL Server la planificación de tareas es bastante mas compleja, con una serie de listas adicionales. Nosotros vamos a ver a continuación un modelo un poco más real, introduciendo la lista de esperas por recursos (resource waits).


Si os fijáis en el diagrama que tenemos a continuación, vemos como el Scheduler contiene una tarea que se haya en estado Running (en ejecución). También vemos una lista de tareas listas para ejecución (Runnable Queue), que contiene las tareas que el Scheduler podría ejecutar en cualquier momento, ya que no dependen de recursos externos (disco, otras transacciones, etc.). Por último, tenemos la lista de esperas por recursos (resource waits list) que contiene todas las tareas que aun no se han completado pero que no pueden pasar a la CPU porque dependen de una espera por un recurso externo, como pueda ser un bloqueo, operaciones de sincronización de paralelismo, una operación de disco o de red, etc.


Lists1


En la siguiente entrada hablaremos de las esperas, y profundizaremos en este diagrama con ejemplos prácticos. Por ahora me conformo con haber introducido los conceptos que darán pie a hablar de las esperas en SQL Server.


Canzando Mitos: Hyperthreading vs. SQL Server


No se si os acordáis, pero en un post reciente (el término reciente en mi vida ‘bloggeril’ es, como podréis apreciar, bastante relativo) hice un ejercicio descarado de plagio y posiblemente violé tres o cuatrocientas leyes al adoptar el tema de los ‘cazadores de mitos’ para buscar un escenario práctico real en el que se aplicara la teoría vista en la entrada. Pues bien, vamos a seguir cazando mitos… en esta ocasión será el siguiente: ¿Realmente tiene sentido deshabilitar Hyperthreading(*) en nuestros servidores SQL Server?


Vamos a ver lo que sucede en una máquina con una CPU con Hyperthreading Sched3habilitado. Vemos como tenemos una única CPU, con un único núcleo, y a pesar de todo, SQL Server crea dos schedulers. ¿Por que hace esto SQL Server? Pues sencillamente porque, como os comenté, SQL Server le pregunta a Windows, a través de WMI, cuantos procesadores tiene la máquina… y no sé quien tomo la decisión de diseño (o quién pagó a quien, ni cuanto…) pero el caso es que para Windows, una máquina con Hyperthreading habilitado cuenta como si tuviera dos CPUs.


Nosotros, que somos chicos y chicas listos, sabemos que no es cierto; sabemos que el Hyperthreading es, simplificando mucho, una mejora en en las Execution Units(EU) del procesador que permiten que, en ciertas circunstancias, se ejecute trabajo en estas EU que en otros casos estarían ociosas. Pero (y éste es un gran pero…) realmente solo hay una CPU: las diferentes EUs comparten, entre otras cosas, las cachés de procesador L1 y L2. Y hete aquí que tales cachés son importantes en SQL Server, hasta el punto de que si se comparten puede haber serios problemas en dos partes fundamentales del servidor: el mecanismo de agujas del reloj del lazy writer (que sirve para sacar del Buffer Pool las páginas menos utilizadas), y el mecanismo para adquirir spinlocks (bloqueos livianos que se solicitan mediante polling constante). Al compartir las caches, es muy posible que en operaciones paralelizadas las cachés no tengan la información que deben de tener, lo que puede provocar que se saquen del Buffer Pool páginas que no deberían irse fuera (con su consiguiente pérdida de rendimiento), o peor aún, que no se pueda adquirir un spinlock.


Sin entrar en demasiado detalle, quedémonos con la idea de que SQL Server ve dos procesadores, y crea dos schedulers, pero en realidad solo es un ‘truco’, interesante en otro tipo de aplicaciones pero muy dañino para SQL Server. ¿Conclusión? Al menos en SQL Server 2000 y 2005 os recomiendo encarecidamente deshabilitar Hyperthreading desde la BIOS si vuestros servidores lo soportan. No se aún si SQL Server 2008 implementa algún cambio que afecte a servidores Hyperthreaded, pero en cuanto consiga hacerme con una máquina con un procesador apropiado haré la prueba.


(*): Ahhh… hyperthreading, aquella tecnología que amenaza con volver a nuestros procesadores :_) ¡que malo soy a veces con los chicos de Intel.


Conclusiones


Bueno, nos ha salido otro post un poco ‘ladrillo’, pero hemos sentado una buena base a la que nos referiremos en posteriores entradas. Lo más importante aquí es comprender lo que son los schedulers, tener una aproximación a las diferentes listas de tareas y ver como podemos estudiar los metadatos para hacernos una idea de si el sistema esta sufriendo de contención de CPU o no.


Evidentemente en este artículo hemos realizado algunas simplificaciones (sobre todo en el ámbito de las diferentes listas de tareas), pero en siguientes entradas entraremos en más detalle, y si no me equivoco empezaremos precisamente con las esperas de las diferentes tareas, los estados que pueden tener y como pasan de uno a otro y, sobre todo, cómo podemos utilizar esa información para comprender por donde se nos escapa el rendimiento.


Espero que os resulte interesante 🙂


Rock Tip:


Ya os dije en la presentación de esta entrada que vamos a tener que tener un poco de paciencia antes de poder saltar a las esperas de SQL Server, por lo que me ha parecido apropiado preceder el titulo de este post con el temazo ‘Patience’ de los Guns n’ Roses.


Hablando de los Guns N’ Roses (que, por cierto, son/fueron uno de mis grupos favoritos), ahí va mi órdago: sí el señor William ‘Axl’ Rose Jr. y sus secuaces (sean quienes sean) sacan el ‘Chinese Democracy’ durante éste año del señor de 2008, un servidor se corta el pelo. ¿Mi predicción? El disco será la banda sonora del Duke Nukem Forever xD

Coming of Age: SQL Server 2008 es RTM!

¡Pero que amables son los chicos de Microsoft! ¡y que atentos oiga! Parece que a modo de regalo de cumpleaños anticipado para mi persona se han decidido a sacar la versión definitiva de SQL Server 2008. Oh Yeah!!

Lamentablemente no creo que pueda ponerle las manos encima hasta el fin de semana, pero aprovecho para avisaros y que vayáis posteando por aquí vuestras primeras impresiones! Yo ya os adelanto que una de las primeras cosas que quiero probar es el nuevo visualizador de datos y resultados de queries espaciales.

Ya sabes, directos a la MSDN para descargarlo! Keep Rockin’!

Rock Tip:

SQL Server 2008 se nos hace mayor, y con la RTM ya ha llegado a la mayoría de edad… así que nada mejor que celebrarlo con aquel ‘Coming of Age’ de los impresionantes, tremendisimos Damn Yankes!

Por cierto, para los que no pinchéis en los hipervínculos, solo deciros que Damn Yankees fue un supergrupo montado por excéntrico guitarrista Ted Nugent, Tommy Shaw de Styx, ese gradnisimo Jack Blades de Night Ranger, y un tal Michael Cartellone, que nadie sabía de donde salió pero no lo hizo nada mal (y ahora esta girando con los actuales Lynyrd Skynyrd)… espero que esta alineación os haga al menos interesaros por su espectacular album homónimo. Muy, pero muy recomendable.

Out of Time: A vueltas con los planes compilados en SQL Server 2008

Dicen por ahí que rectificar es de sabios… así que aquí va mi momento de sabiduría del día: en la entrada anterior compartía con vosotros algunas de las sorpresas que me he ido encontrado en la RC0 de SQL Server 2008, y también os decía que debido al poquito tiempo que me queda libre estas semanas, seguramente no podría postear mucho más sobre el producto a corto plazo. Pues bien, heme aquí, humillándome y escribiendo una entrada sobre una nueva característica de SQL Server 2008 🙂

La verdad es que no he podido evitarlo, realmente me parece que este va a ser otro de esos detalles ‘pequeños’ pero que pueden marcar una diferencia importante; en este caso a nivel de rendimiento. Vamos para allá…

Optimización para consultas Ad Hoc

El otro día, mientras leía los Books Online (la documentación del producto) de SQL Server 2008 RC0 me tropecé, como quien no quiere la cosa, con la característica que os voy a comentar ahora. Nada mas leerla me vino a la mente el artículo sobre el ciclo de vida de las consultas y el pequeño y bonito debate que se abrió en los comentarios, y me parece que complementa muy bien lo comentado en su momento en aquella entrada, por lo que no puedo resistirme a comentarla brevemente por aquí.

Haciendo un poco de memoria…

¿Recordáis el problema de las consultas ad hoc en SQL Server? Comentábamos que éstas, al contrario que los procedimientos almacenados y que las consultas parametrizadas, no tenían en cuenta los parámetros a la hora de almacenar y reutilizar su plan de ejecución (para una explicación detallada, echádle un vistazo al post antes referido).

Vamos a ver un ejemplo sobre la base de datos AdventureWorks:

USE AdventureWorks
GO

– Limpiamos la Cache de planes de ejecucion
DBCC FREEPROCCACHE
GO

— Ejecutamos esta consulta 5 veces
SELECT *
FROM Sales.SalesOrderDetail
WHERE UnitPrice = 5.70
GO

— Ejecutamos esta consulta 5 veces
SELECT *
FROM Sales.SalesOrderDetail
WHERE UnitPrice = 21.98
GO

— Miramos nuestros planes de ejecucion en la cache de planes
SELECT
    usecounts,
    size_in_bytes,
    cacheobjtype,
    objtype
FROM sys.dm_exec_cached_plans
WHERE objtype = ‘Adhoc’

Como podéis ver, la demo se compone de los siguientes pasos:

  1. Limpiamos la Caché de Procedimientos Almacenados:

    Inicialmente limpiamos la caché de planes de ejecución mediante el comando DBCC FREEPROCCACHE, con el único objetivo de facilitarnos luego la búsqueda de los planes que se han generado por las consultas de la demo. Por razones evidentes, no debemos ejecutar este comando en un servidor de producción.

  2. Ejecutamos una consulta con dos parámetros diferentes:

    A continuación lanzamos una consulta sobre AdventureWorks. Como podéis ver, lanzamos la misma consulta con dos parámetros, ejecutando 5 veces cada una de ella.

    En un mundo ideal SQL Server sería lo suficientemente inteligente como para detectar que son la misma consulta pero con diferentes parámetros, y que su plan de ejecución no va a variar ya que es trivial. ¡¡Vamos a ver si es así!!

  3. Monitorizamos la Cache de planes de ejecución:

    ¿Vivimos en ese mundo ideal? ¿Cómo podemos comprobarlo? Lo primero que se me ha ocurrido es dar un par de palmadas al aire a ver si por arte de magia aparecía una cerveza fresquita aquí la lado, pero no ha funcionado. Mmmm.. me tomaré eso como un primer indicio de que no vivimos en un mundo ideal 🙁

    El segundo indicio lo sacamos de la vista de administración dinámica sys.dm_exec_cached_plans, en la que podremos observar como, al contrario de lo que sucede con los procedimientos almacenados o las consultas parametrizadas, los planes de ejecución no se han reutilizado. Como se puede ver en la siguiente captura de pantalla, tenemos dos planes de ejecución con 5 ejecuciones cada uno.

Planes de Ejecucion

Bien, hasta aquí nada nuevo bajo el sol, ya que se trata del comportamiento por defecto de SQL Server 2005 y SQL Server 2008. Sin embargo os prometí que os traería novedades, y aqui vienen…

Let’s Get Rocked!! Optimize for Ad Hoc Workload

Los planes de ejecución consumen memoria… ¡y no poca! Como podemos ver en la captura de pantalla, en el caso los planes de ejecución del ejemplo anterior cada uno de los planes se lleva 24576Kb… ¡24 Kb, 3 páginazas por plan, nada más y nada menos! Y eso que son planes pequeñitos…

Esto puede plantear problemas en un escenario lamentablemente muy común; aplicaciones que lanzan consultas ad-hoc directamente contra nuestro servidor. A no ser que siempre se repitan las consultas con los mismos parámetros, cosa bastante improbable, el número de planes de ejecución en la caché crecerá vertiginosamente, dando lugar a problemas de presión de memoria, que a su vez obligará a sacar planes ‘antiguos’, que en ultima instancia (y para terminar con nuestra cadena de males) implicará que se tengan que recompilar con mucha mayor frecuencia los planes de ejecución, con el aumento de coste de CPU asociado.

En SQL Server 2008 aparece una nueva opción de configuración del servidor, llamada ‘optimize for ad hoc workloads’, que viene a mejorar el comportamiento del servidor en este tipo de escenarios. La idea principal es que, cuando se lance una consulta ad hoc no parametrizada contra el servidor, éste no almacene el plan de ejecución completo. En su lugar, almacenara un pequeño ‘stub’, muy liviano.

Este stub sirve para poder almacenar una entrada en la caché de planes de ejecución, de modo que el servidor sepa que esa consulta ya se ha ejecutado alguna vez en el sistema. Lo bueno de este mecanismo es que el stub ocupa muy poca memoria, lo malo es que el stub no es un plan de ejecución. Por tanto en su siguiente ejecución, hay que volver a compilar la consulta.

Como optimización adicional, siempre que una consulta se ejecuta por segunda vez, SQL Server supone que esta consulta va a ejecutarse más veces con el mismo parámetro, por lo que, de algún modo, promociona su plan de ejecución, y en lugar del stub almacena su plan compilado real.

Vamos a ver un pequeño ejemplo:

— Habilitamos la opcion de ‘optimize for ad hoc workloads’
sp_configure ‘show advanced options’,1
GO
sp_configure ‘optimize for ad hoc workloads’,1
RECONFIGURE
GO

— Limpiamos la cache de planes de ejecucion
DBCC FREEPROCCACHE
GO

— Vamos a hacer las demos sobre AdventureWorks
USE AdventureWorks
GO

— Vamos a ver una consulta auto parametrizada
SELECT *
FROM Sales.SalesOrderDetail
WHERE UnitPrice = 5.70
GO

— Vemos ahi el plan stub para la consulta
SELECT
    usecounts,
    size_in_bytes,
    cacheobjtype,
    objtype
FROM sys.dm_exec_cached_plans
WHERE objtype = ‘Adhoc’

— Vamos a ver como, para la consulta autoparametriazada, no se nos
— crea un plan real: vemos como la consulta tiene como query_plan NULL
SELECT sql.text, p.query_plan
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(sql_handle) sql
CROSS APPLY sys.dm_exec_query_plan(plan_handle) p
WHERE text NOT LIKE ‘%sys_dm_exec%’ AND text NOT LIKE ‘%msparam_0%’
ORDER BY qs.EXECUTION_COUNT DESC
GO

— Deshabilitamos la opcion y volvemos a hacer las pruebas para ver
— como no se generan los stubs
sp_configure ‘show advanced options’,1
GO
sp_configure ‘optimize for ad hoc workloads’,0
RECONFIGURE
GO

Como vemos en la demo, al mirar la caché de planes de ejecución nos encontramos con lo siguiente:

plans2

Es interesante resaltar que el stub del plan de ejecución ocupa solamente 336 bytes ( 1 página)… ¡una gran diferencia respecto al tamaño del plan de ejecución real!

Si además tratamos de ver cual es el plan de ejecución almacenado para esa entrada en la caché, veremos que nos devuelve NULL:

plan3

Como vemos, de cara a minimizar el consumo de CPU, de memoria (en la caché de procedimientos), incluso de un modo indirecto, de E/S (menos paginas, menos fallos de página), este mecanismo tiene un aspecto genial. Eso si, se recomienda emplearlo solo en los servidores que sean atacados por aplicaciones que hagan uso masivo de consultas ad-hoc, y no empleen tantos procedimientos almacenados ni queries parametrizadas.

Y ahora, los deberes 😉

Para terminar, os animo a que hagais pruebas en vuestros entornos o aplicaciones. Yo aún no he podido sacar tiempo para probarlo en condiciones y estudiar su rendimiento sobre ningún producto, pero en el momento que pueda hacer una comparativa os lo haré saber.

Si me gustaría que, si os animáis a hacer las pruebas, me comentéis por aquí vuestros resultados. Realmente ha sido una característica que me ha gustado mucho, y tengo interés por ver su adopción y resultados 🙂

Rock Tip:

Es la primera vez que escojo un tema de los noruegos Wig Wam para acompañar una entrada de mi blog; en este caso se trata de ‘Out of Time’, un medio tiempo bestial, de impecable factura, y que deja claro el buen nivel instrumental y compositivo de esta banda, a pesar de la continua autoparodia que hacen de si mismos sus componentes.

Lo cierto es que todos los chicos de Wig Wam (Glam, Teeny, Flash y Sporty) ya tenían bastante experiencia antes de decidirse a montar un grupo a medio camino entre el homenaje y la parodia de las grandes bandas de hard rock, AOR y glam de los años ochenta y primeros noventa, ¡y eso se nota! Sin embargo, no saltaron a la luz pública principalmente gracias a su participación en Eurovision en 2005, con su temazo ‘In My Dreams’. A partir de entonces su vida se ha convertido en un no-parar de estadios con decenas de miles de asistentes, y de hoteles con cientos de grouppies dispuestas cada noche… o eso dicen ellos! 🙂 Sea como sea, esta claro que son un grupo muy divertido y recomendable!

He escogido esta canción principalmente por mi falta de tiempo estos días, que me están poniendo difícil cumplir con mis compromisos personales y profesionales; aún así, mejor que sea por esto que no por lo que comenta la letra de la cancion (un reo condenado a muerte que se queda sin tiempo, muy en la onda del ‘Halloweed be Thy Name’ de mis Iron Maiden del alma) 😉

The Last Mile: Esos pequeños detalles en SQL Server 2008 RC0

¡Albricias! ¡Albricias! ¡Que toquen las campanas! ¡Que corra la voz!… bueno, he de admitir que llego un poco tarde para daros la noticia, pero con gran regocijo, júbilo y satisfacción me uno a Miguel y Jorge para dar la bienvenida a la última release de evaluación de SQL Server 2008: la RC0.

Como ya sabréis, cuando un producto pasa de CTP (Community Technological Preview) a RC (Release Candidate), podemos dar por supuesto que todas las características definitivas del producto están implementadas, y ya solo se procederá a los ajustes y corrección de bugs para asegurar la calidad del producto antes de salir al mercado y de que se ponga en producción. Pero lo importante para nosotros es que ya podemos jugar con la practica totalidad de sus características, ir formándonos en el producto, estudiando que características podemos aplicar a nuestros entornos, etc…

Durante estos días creo (y espero) que se escribirán cantidad de artículos relacionados con las grandes características, como el Policy-Based Management, Capture Data Change, el almacenamiento FILESTREAM, etc… Lamentablemente no creo que yo pueda aportar mucho a corto plazo; en este momento la verdad es que lo que menos tengo es tiempo para escribir una entrada en el blog acerca de ninguna de estas características, y menos de hacerlo de una manera suficientemente digna.

Sin embargo, desde el domingo he estado jugando un poco con esta versión RC0, y he encontrado muchos ‘pequeños detalles’ que me han encantado y que me gustaría compartir con vosotros, así que vamos allá…

Depuración Integrada

La primera sorpresa agradable es la posibilidad de depurar código TSQL directamente desde la interfaz del SQL Server Management Studio. Si bien es cierto que ya podíamos hacerlo desde el Visual Studio, no deja de ser práctico e interesante el poder realizar la depuración, consultar variables locales y watches, así como el call stack del SQL desde el entorno que utilizamos tan a menudo para desarrollar nuestros procedimientos y consultas.

No se a vosotros, pero a mi el mero hecho de ver en la barra de menú principal del SSMS un menú llamado Debug ya me hace feliz 🙂

Recomendaciones de Índices en el Plan de Ejecución

No se si se apreciará bien en la captura de pantalla que os adjunto, pero si os fijáis en la ventana de abajo (la que muestra el plan de ejecución), veréis que en la caja de texto nos aparece una línea en verde. Bien, esa línea nos indica que nos vendría bien un índice determinado: si pulsamos con el botón derecho y le pedimos información adicional sobre el índice, nos llega a generar el script que tendriamos que ejecutar para implementar el índice.

En mi ejemplo, el script sería el siguiente:

/*
Faltan detalles del índice de SQLQuery2.sql – (local)SQLExpress.Performance (DEMOSTENESPlain Concepts (53))
El procesador de consultas estima que la implementación del
siguiente índice podría mejorar el costo de la consulta en un 46.7053%.
*/

/*
USE [Performance]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[Orders] ([orderdate])
INCLUDE ([custid],[empid],[shipperid])
GO
*/

Cómo se puede ver, ¡hasta nos realiza la estimación de la mejora de rendimiento en caso de implementar el índice!

ExecutionPlan

No se como lo veréis vosotros, pero a mi estos detalles pequeños me encantan; en este caso, la tecnología no es nueva… en el fondo esto consulta unas DMVs que nos muestran esta información de índices no utilizados, etc. que es lo que emplea el Database Engine Tuning Advisor para darnos sus recomendaciones sobre índices. Por lo tanto, nada nuevo bajo el sol. Sin embargo, lo que me fascina es el hecho de que esté integrado en el SSMS, que es desde donde yo suelo lanzar el 80% de mis consultas en tiempo de desarrollo. De éste modo tenemos la oportunidad de ver estos mensajes de advertencia sobre nuestras políticas de índices antes de llegar a fases mas tardías de análisis y optimización. 

Monitor de Actividad

El monitor de actividad, ese gran desconocido. Lo cierto es que yo no lo empleaba; generalmente, para ver la actividad de los diferentes procesos de SQL Server recurría a los conocidos sp_who y sp_who2, y desde la versión 2005 también a diferentes DMVs e informes del servidor.

Sin embargo, ¡puede que hasta yo mismo me vuelva un adepto del monitor de actividad y las interfaces gráficas de administración! He estado jugando con al Monitor de Actividad que viene con la versión RC0 y he de decir que estoy gratísimamente sorprendido. No solo nos muestra de un vistazo rápido el estado de todos los procesos, sino también de las consultas mas costosas ejecutadas recientemente sobre el servidor, las esperas por recursos (waitstats), uso de E/S sobre los ficheros de la base de datos y más información de un modo muy conveniente y práctico, en la linea del nuevo Performance Monitor de Windows Vista y Windows Server 2008.

Os pongo una pequeña captura de pantalla para que veáis el aspecto que tiene:

ActivityMonitor 

Conclusiones

Vaya por delante que este post no ha pretendido ser exhaustivo sobre nuevas características de SQL Server 2008 RC0. No se trata de un artículo de ‘Primeras Impresiones’, sino de una oportunidad de compartir con vosotros un par de cositas que me he encontrado 🙂

Cuando comencé a trastear con el producto me encontré con estos detalles (y alguno más); estaba esperando ponerme a explorar iFTS principalmente, así como otras características de mayor peso, pero finalmente preferí perderme con estos detalles (que normalmente no reciben exposición en artículos y blogs) y compartirlos con vosotros. Espero que este post, aunque no haya seguido mi línea, os sirva al menos para conocer algunos pequeños desconocidos y para abriros el apetito por SQL Server 2008 RC0.

Por cierto, si os animas a trastear con él, podéis descargarlo desde el este enlace. Enjoy!

Rock Tip:

Esta vez me gustaría dedicar el post a todo el grupo de producto de SQL Server; a pesar de que esta release ha tenido un tiempo de desarrollo relativamente corto (¡sobre todo si lo comparamos con el de SQL Server 2005!), no dejan de ser unos años de esfuerzo, cariño y dedicación que dentro de muy poquito culminarán con el ‘nacimiento’ de la versión RTM. Por ello, este post lo acompaño del tema ‘The Last Mile’, de Cinderella. Un poquito más… una milla mas, y podremos empezar a poner SQL Server 2008 en producción como locos 😉

These Days: Un día en la vida de una consulta…

Es de sobra conocida por todos la frase que nos enseña que aquel que no conoce la historia está condenado a repetirla. En mi caso, a pesar de ser un apasionado de la historia, debo ser tonto como un cepillo, porque voy a repetir un error garrafal: voy a abrir múltiples frentes. Con esto no me refiero a que vaya a adoptar un modo berserker y vaya a salir a la calle a liarme a manotazo limpio con el primero que me encuentre hasta abrirle la frente, sino que me he decidido a empezar una nueva serie de artículos, en este caso dedicados a la identificación y resolución de problemas de rendimiento en SQL Server.

Espero que esto no me quite demasiado tiempo para la serie sobre depuración, pero creo que es la mejor forma de abordar los artículos acerca del rendimiento en SQL Server. Estuve dándole unas vueltas y creo que organizándolo de este modo podré darle la continuidad y el trasfondo teórico que quiero, algo que no podría hacer si lo organizara como artículos sueltos de ‘tips and tricks’.

Así que, sin más preámbulos, y como dirían ‘Les Luthiers’, vamos a ‘principiar’ por el principio…

El lenguaje SQL

Aquí conviene recordar un detalle que, a pesar de ser evidente, muchas veces no tenemos en cuenta. El lenguaje SQL es un lenguaje declarativo: el usuario solicita al servidor unos datos determinados, pero no le indica cómo se deben obtener estos datos, ni que algoritmos se emplearán para su extracción, etc… Eso lo decidirá el propio motor de la base de datos que, tal como veremos en éste post, tiene a su disposición una serie de metadatos y estructuras (índices, estadísticas, etc…) que le ayudan a obtener estos datos solicitados del modo más eficiente posible.

Si en lugar de usar un lenguaje como TSQL empleáramos un lenguaje imperativo, como C++ o C#, nosotros tendríamos que especificar paso a paso las operaciones para extraer los datos; el algoritmo empleado para obtener los datos que queremos. Tendríamos que recorrer listas, árboles, aplicar nuestros amados Quick Sort y demás…

¿Cómo se procesan las consultas?

En el siguiente diagrama trataré de representar una simplificación del ciclo de vida de una consulta de SQL Server, desde el momento en que la consulta llega al servidor hasta el momento en que se retorna el resultado al cliente:

EsquemaEjecucionConsultas

Como podéis ver por la simplicidad del diagrama, no vamos a entrar a estudiar las internalidades del procesado de consultas; mi objetivo aquí es establecer una base que luego vayamos extendiendo en sucesivas entradas de este blog. Para poder realizar esta simplificación, me tomaré algunas licencias por lo que lo que voy a comentar aquí debajo no es correcto al 100%, pero la idea de funcionamiento es la misma.

Dicho esto, vamos a ver que sucede en cada una de las etapas descritas en el diagrama:

  • Parseado de la Consulta:

En esta fase se evalúa la sentencia T-SQL que se pretende ejecutar y se comprueba que no tenga errores de sintaxis, que la semántica sea correcta (es decir, que si intenta acceder a una tabla llamada Contactos, esa tabla exista y se tenga acceso a ella), etc.. Como salida del parser, se obtiene una versión de la consulta ‘limpia’ y normalizada, que describe, de modo no ambiguo, QUE datos quiere obtener el usuario.

Bien, ese ‘qué’ ya está decidido y comprendido por SQL Server; ahora lo que necesita es el CÓMO obtener los datos. Esto vendrá definido por el Plan de Ejecución. ¡Oh, el Plan de Ejecución! Ésta palabra será clave para nosotros en tantos y tantos escenarios de optimización, sobre todo desde un punto de vista del desarrollo. En resumen, el plan de ejecución será una especie de lista que describirá paso a paso como obtener la información solicitada: que tablas iremos a buscar, que índices emplearemos, como uniremos los datos de unas tablas con otras, etc.

Bien, hecha pues la introducción a los planes de ejecución, os puedo comentar que en éste punto se comprueba también si esa consulta ya se ejecutó anteriormente y si se almacenó un plan de ejecución para ella. Si es así, SQL Server ejecuta directamente los pasos dictados por ese plan de ejecución y devuelve los resultados al cliente.

Si no hubiera un plan de ejecución cacheado, pasaríamos a la siguiente etapa…

  • Compilación/Optimización:

Aquí es donde empieza lo divertido. Recordemos, por enésima vez, que SQL es un lenguaje declarativo; eso quiere decir que al contrario de los lenguajes imperativos, como C++, donde le suministramos al ordenador una serie de pasos para obtener un resultado, en SQL le pedimos a la máquina unos resultados (e.j: dame todos los contactos que vivan en España y tengan mas de 30 años), pero la manera de obtener estos resultados es cosa del servidor. Si va a iterar por todos los elementos de la tabla, si va a usar un índice u otro, o ninguno, si primero va a filtrar por nacionalidad o por edad, esas son decisiones que el SQL Server va a tomar por nosotros.

Por ello SQL Server compila muchas veces cada consulta, generando con cada compilación un plan de ejecución. Al final, el compilador se decidirá por el más eficiente de los múltiples planes generados, y pasará a la siguiente etapa.

¿Y cómo sabe SQL Server cual es el plan mas eficiente? Pues porque los planes de ejecución estiman determinados parámetros, cómo el número de filas que va a devolver cada operación, el coste estimado de CPU, lecturas y escrituras estimadas, etc. para cada una de las operaciones de lo componen. Sumando estas estimaciones puede obtener un índice que le sirve para identificar que planes son mejores que otros, con lo que la elección se reduce (casi siempre) a seleccionar el plan con el índice más bajo.

  • Almacenamiento del Plan de Ejecución:

Cuando el SQL Server se ha decidido por el plan mas eficiente, se suele proceder a almacenar este plan de ejecución en una caché de planes de ejecución para que la próxima vez que se lance la consulta no se tenga que recompilar.

Esta caché se almacena en una zona especial del Buffer Pool de SQL Server, y evidentemente es un recurso finito. Hay que evitar tener demasiados planes de ejecución cacheados para que no se nos sature y SQL Server tenga que eliminar planes ‘validos’ para hacer sitio a planes de ejecución nuevos… pero esa es otra historia 😉

Un poco de práctica: procedimientos almacenados vs. consultas ad hoc

Para ver todo esto en la práctica, me vais a permitir que me ponga mi disfraz de Cazadores de Mitos (¡¡me pido a Jamie!! ¡De mayor quiero dejarme un bigote como el suyo!) y rebusque en el folklore de SQL Server… un segundito…

Un segundito más….

¡Aquí está! Mito número 208: «Las consultas ad-hoc son menos eficientes que los procedimientos almacenados»… Según el mito, las consultas ad-hoc son, por un motivo u otro, menos eficientes que la misma consulta encapsulada dentro de un procedimiento almacenado. ¿será verdad? ¿será mentira? Vamos a verlo…

NOTA: Este pequeño ejemplo práctico esta orientado a SQL Server 2005 y 2008; en versiones anteriores no funcionará debido a la ausencia de las DMV’s (vistas de administración dinámicas) que vamos e emplear.

Vamos a empezar creando unos datos de prueba:

CREATE DATABASE PruebaPlanesEjecucion
GO
USE PruebaPlanesEjecucion
GO

CREATE TABLE dbo.Persona
(
ID INT IDENTITY PRIMARY KEY NOT NULL,
Nombre NVARCHAR(40) NOT NULL
)

INSERT INTO dbo.Persona VALUES (‘Juan’)
INSERT INTO dbo.Persona VALUES (‘Pepe’)
INSERT INTO dbo.Persona VALUES (‘Arturo’)
INSERT INTO dbo.Persona VALUES (‘Wenceslao’)
INSERT INTO dbo.Persona VALUES (‘Miguel Angel’)

En el artículo hablábamos de los planes de ejecución para las consultas SQL. Pues bien, vamos a aprovechar para ver el plan de ejecución de una consulta sobre nuestros datos de pruebas. Para ello escribimos la siguiente consulta:

SELECT * FROM dbo.Persona WHERE id = 2

Seleccionamos la consulta y, en lugar de ejecutarla con CTRL+E o F5, pulsamos CTRL+L; esto nos mostrará el plan de ejecución estimado para la consulta; otro día hablaremos de las diferencias entre los planes estimados y reales. El resultado que obtendremos será algo parecido a este:

plan1

Como se aprecia en al captura, desde el SQL Server Management Studio (SSMS) podemos ver gráficamente el plan de ejecución de nuestra consulta. Hay más maneras de verlo, pero generalmente ésta es la más práctica.

Comentábamos que SQL Server tiene una caché de los planes de ejecución, que podemos consultar mediante una select sobre la DMV sys.dm_exec_cached_plans. En mi máquina de pruebas me devuelve 193 filas, esto es, 193 planes de ejecución cacheados, lo que hace muy complicado identificar rápidamente que plan corresponde a la consulta que hemos lanzado.

Para ayudarnos a identificar el plan de ejecución en esta prueba, vamos a hacer algo que NO debemos hacer en producción; vamos a limpiar la caché de planes de ejecución. Así será fácil identificar la consulta que acabamos de lanzar, pero repito que éstos experimentos deben quedarse para nuestras máquinas de pruebas.

DBCC FREEPROCCACHE
GO
SELECT * FROM dbo.Persona WHERE ID = 2
SELECT usecounts, cacheobjtype,objtype FROM sys.dm_exec_cached_plans

procCache

Podemos ver que en la cache tenemos tres planes: el nuestro es el que tiene de objtype ‘Adhoc’ y que, como podemos ver en su columna usecounts, solo se ha ejecutado una única vez.

Vamos a hacer una prueba: vamos a volver a eliminar la cache (DBCC FREEPORCCACHE) y vamos a ejecutar 10 veces seguidas la misma consulta(nada avanzado aquí, simplemente seleccionamos la query y pulsamos F5 10 veces… que estoy vago hasta para hacer un bucle ;)).

procCache2

Comprobamos como, efectivamente, aparece un plan de ejecución que se ha reutilizado 10 veces: ese es nuestro plan!

Hablando de nuestro plan… ¿os acordáis de él? Era un plan muy, pero que muy simple. Por tanto, cabría suponer que si cambiamos el parámetro que pasamos a la where (el ID) por otro valor diferente, el plan de ejecución debería ser el mismo. De hecho, os animo a que lo comprobéis, cambiando la consulta y mirando su plan de ejecución; veréis que es idéntico. 

Ok, siendo el plan de ejecución es el mismo, si ahora ejecutáramos 10 veces deberíamos ver el plan con un usecounts de 20, ¿no? ¡Pues no! Vamos a hacer la prueba:

DBCC FREEPROCCACHE
GO
— Ejecutamos esta 10 veces
SELECT * FROM dbo.Persona WHERE ID = 2
— Ejecutamos esta otra 10 veces
SELECT * FROM dbo.Persona WHERE ID = 4
— Miramos a ver que tenemos…
SELECT usecounts, cacheobjtype,objtype FROM sys.dm_exec_cached_plans

¿Que resultado obtenemos? Pues como se ve en la siguiente captura, no se esta reaprovechando el plan de ejecución, en su lugar tenemos dos planes de ejecución diferentes (aunque virtualmente idénticos), cada uno con 10 ejecuciones.

procCache3

Esto es significativo: si cada vez que cambiamos de parámetro a nuestras consultas tiene que recompilar el plan y generar uno nuevo, tenemos al menos dos problemas: el coste adicional de CPU asociado a las recompilaciones, y el incremento de planes en la cache, que podrá alcanzar su limite de tamaño y tener que sacar planes de ejecución para hacer sitio a los nuevos.

Vamos a ver que sucede si implementamos esta consulta como un procedimiento almacenado:

— Vamos a implementar esta consulta como un procedimiento almacenado
CREATE PROCEDURE testProc
    @id INT
AS
BEGIN
    SELECT * FROM dbo.Persona WHERE ID = @id
END

DBCC FREEPROCCACHE
GO
— Ejecutamos esta 10 veces
testProc 2
— Ejecutamos esta otra 10 veces
testProc 4

SELECT usecounts, cacheobjtype,objtype FROM sys.dm_exec_cached_plans

 

procCache4

Como podemos ver, finalmente conseguimos que se reutilice el plan de ejecución, ya que el numero de ejecuciones total es 20.

Volviendo al mito… ¿son las consultas ad-hoc menos eficientes que los procedimientos almacenados? Visto lo visto, podemos concluir que el mito es… ¡CIERTO! 🙂 ¿Quiere esto decir que debemos usar procedimientos almacenados para todo? No, ni mucho menos; no todo en esta vida es rendimiento 🙂 Pero esa también es otra historia…

Por cierto, para que no tengáis que andar copiando y pegando del blog, os adjunto un demoscript con toda demostración.

Conclusiones:

Si habéis llegado hasta aquí, mi más sincera enhorabuena 🙂 Ha sido una entrada bastante extensa, con bastante chicha si los conceptos son desconocidos. Hemos revisado el ciclo de vida de la consulta, hemos introducido el concepto de plan de ejecución y hemos hecho un ejercicio sobre reutilización de planes de ejecución bastante interesante… ¡casi nada!

Estoy convencido de que la mayor parte de vosotros ya estabais familiarizados con todos los conceptos descritos en éste articulo. De todos modos, para mi es importante tener un artículo de introducción al que poder hacer referencia desde otros posts de contenido más avanzado que sin duda aparecerán en este blog en breves.

Por tanto, si sois nuevos a SQL Server y su optimización, ¡gracias por haber llegado hasta aquí! Espero vuestros comentarios y dudas al respecto. Y si ya teníais experiencia en SQL Server y en la optimización, ¡espero poder contentaros en pocas semanas con entradas más interesantes y enriquecedoras!

¡Hasta pronto!

Rock Tip:

La razón por la que he elegido el tema ‘These Days‘ (de mis Bon Jovi de toda la vida) para éste post es que estos días, últimamente, he explicado el funcionamiento básico del Query Processor y el Query Optimizer en muchas ocasiones; parece que es mi tema de moda, y es lo que me ha impulsado a iniciar esta sesión respecto a la optimización de consultas.

Respecto a la canción en si, os diré que le tengo un gran cariño: el segundo concierto al que fui en mi vida fue precisamente un concierto de Bon Jovi, en la gira de presentación del These Days allá por el 96. Fue, sin duda, uno de los mejores días de mi vida, y uno de los mejores conciertos que nadie pueda soñar con ver. No se trata, ni de lejos, de mi tema favorito de ellos; es más, muchos estaréis de acuerdo conmigo en que éste el albúm marca el comienzo de su declive. Sin embargo le tengo mucho cariño, quizá por aquel concierto. Haber visto a Jon y Richie cantando las canciones de cowboy en acústico te marca para toda la vida; quizá a ese momento le debo mi afición a las botas camperas 🙂

It’s a Long Road: Visual Studio Team System Inner Circle Airlift

Después de las últimas semanas de bastante actividad y viajes, por fin en encontrado un ratito para actualizar el blog… y ya puestos a hacerlo, voy a hacerlo con estilo: a 864 Km/h y una altura de 36.000 ft., sobrevolando Fort Smith, rumbo a Seattle. Es increíble lo mucho que puede dar de si y lo mucho que se puede aprovechar un vuelo transoceánico 🙂

Esta semana voy a asistir al airlift del Visual Studio Team System Inner Circle, una iniciativa de Microsoft para poner en contacto entre si a los partners que trabajan con VSTS, así como establecer contactos entre estos y el grupo de desarrollo. La agenda parece muy interesante, ya os contaré que tal han estado las sesiones. Este evento me ocupará desde el lunes al miércoles, pero aprovecharé bien el resto de la semana, y si todo sale como debe, tendré un post sorpresa bastante interesante el jueves o el viernes!

Ya que no todos los días podemos participar en estos eventos, y en el fondo somos todos una misma comunidad, me gustaría aprovechar para animaros a que me trasladéis vuestras dudas técnicas o filosóficas sobre VSTS, de modo que yo pueda hacerlas llegar a quien corresponda.

Una última reflexión: ¡¿soy la única persona que no tiene ningún interés por traerse un iPhone de Seattle?! ¿Tan bicho raro soy?

Rock Tip:

Hoy me pareció apropiado como Rock Tip el tema de Dan Hill ‘It’s a Long Road’ (lamentablemente no he podido encontrar un vídeo real del tema, así que nos tendremos que conformar con este montaje), por dos motivos: el primero y más obvio es por el viajecito en sí desde Madrid a Seattle 🙂 El segundo es porque estoy convencido de que este evento va a ser el inicio de cosas muy buenas e interesantes, de muchas horas entretenido en una nueva comunidad que me apasiona, que es el proyecto de Inner Circle.

Respecto al tema en si, seguro que os sonará cuando la escuchéis; es el tema central de la banda sonora de Acorralado (First Blood: la primera película de Rambo). Y sí, me gusta Rambo… ¿que pasa? XD

Y ya que hablamos de Rambo, segundo Rock Tip del día; uno de mis artistas favoritos se llama Kane Roberts, aunque sus colegas le llaman Rambo por razones evidentes. Un artista como la copa de un pino y de lo más completo que os podáis imaginar: empezó tocando la guitarra para Mr. Alice Cooper, después sacó dos magníficos discos en solitario donde se ve que el tío compone y canta realmente bien. Después de esto se dedico profesionalmente al mundo del cómic, después al desarrollo de videojuegos… en fin. Ah, y no nos olvidemos también de que fue campeón de bodybuilding! Todo un elemento, algún día le dedicaré un rock tip en exclusiva 😉

Beat the Bullet: A veces ni con magia…

Dicen que más vale tarde que nunca, y cómo lo prometido es deuda, aquí os dejo los materiales de la sesión sobre SQL Server 2008 que pude compartir con los chicos del grupo de usuarios de A Coruña. Y ya que en un solo párrafo fui capaz de meter dos refranes, ahí va un tercero a modo de disclaimer a caballo regalado… 🙂 Este va porque no he tenido tiempo para revisar todo lo que me gustaría, pero como tampoco parece muy probable que vaya a encontrar ese ratito para ponerlo todo en orden en un futuro cercano, os dejo los materiales tal cuál están ahora mismo. Los podéis descargar desde aquí.

De esta sesión me llevo para el recuerdo una buena anécdota; mirad que hay días en el calendario, y fuimos a escoger precisamente un 29 de Febrero de año bisiesto para hacer el evento… y como alguno de vosotros ya sabréis, SQL Server 2008 CTP de Febrero no quiere arrancar los 29 de Febrero. En fin… este problema acabó comprometiendo la agenda de toda la sesión, con lo que tuve que sacrificar algunas demos y una sorpresita final… pero lo aproxima vez será!

Aprovecho para agradecer el buen rato que pasamos a todos los asistentes; gracias por saber comprender, con sentido del humor, las sorpresas que a veces nos traen los imponderables del destino 😉 Por supuesto un agradecimiento especial a Edu Quintás y a Euge del NUGG por la organización y la compañía, y a Suso y Mauro… fue un placer volver a veros por vuestra tierra!

Rock Tip:

To beat the bullet es una expresión que podría traducirse como ‘aguantar estoicamente’… que poco mas o menos es lo que me tocó hacer el viernes 29 de Febrero en A Coruña. ‘Beat the Bullet‘ es también un tema de Danger Danger; de hecho, posiblemente sea mi tema favorito, de mi grupo favorito… por lo que si no la conocéis, no perdáis ni un segundo en pegarle un orejazo! Es sencillamente bestial, un tema que es capaz de sacarte una sonrisa hasta en los momentos mas complicados!

It’s a Kind of Magic: Evento sobre SQL Server 2008 en el NUGG

Nueva entrada relámpago y nuevo ejercicio de SSP (Shameless Self-Promotion). El próximo viernes 29 de Febrero tendré el placer de visitar de nuevo tierras gallegas, en esta ocasión para presentar algunas de las nuevas características de SQL Server 2008 en un evento para el grupo de usuarios de .NET de Galicia (NUGG).

El evento se llamará ‘More Magic – SQL Server 2008’, y en el trataré de explicar las novedades más interesantes del producto, tanto desde un punto de vista de administración (Policy-Based Management, Resource Governor, Transparent Database Encryption…) como desde un enfoque orientado al desarrollador (Tipo de Datos Espaciales, novedades en T-SQL, iFTS…). El nivel previsto estará entre 200 y 300, en función de la audiencia y de como se desarrolle la sesión.

Por supuesto, terminaremos con una sesión de preguntas y respuestas donde espero que podamos abarcar muchos más aspectos, como resolución de problemas de rendimiento, seguridad, BI o lo que surja. ¡Desde ya os animo a que vayáis preparando las preguntas!

Una última nota: las sesión se realizará con la CTP de febrero de SQL Server 2008, recién salida del horno. Algunas de las demos solo funcionarán con esta CTP, como las de iFTS, por lo que ya tenéis una excusa más para descargarosla y participar en el programa de evaluación del producto.

Rock Tip:

Es increíble, pero hasta ahora ni un solo post vino acompañado de una referencia musical a Queen, sin duda uno de los mejores grupos de la historia (y a quien se atreva a discutirme esto le espero en el circulo de la muerte XD).

Hoy me puedo resarcir, pues en este caso la referencia es obvia: creedme, SQL Server 2008 it’s ‘A Kind of Magic, y si no… al tiempo 😉