sábado, 4 de julio de 2009

Salimos en portada

Bueno, los que me conocen ya saben que esto ocurrió hace un par de semanas, pero la verdad que no he tenido mucho tiempo desde entonces, asique aprovecho para escribirlo ahora.

Básicamente el resumen es que el servicio de healthcheck que hemos desarrollado desde SolidQ en la subsidiaria española, se ha lanzado en el mismísimo pentágono ;). Desde luego lo hemos lanzado en clientes igual de interesantes, pero este es uno de los más mediáticos y por los que se interesaron varios periódicos.

Aqui teneis la noticia con la que nos dieron una portada ni mas ni menos ;)

Por cierto, también salimos en Canal9, pero el vídeo lamentablemente no lo encuentro :(

jueves, 18 de junio de 2009

Reutiliza tus plantillas de perfmon de Windows 2003 en Windows 2008

Como sabeis, Windows Server 2008 introdujo una serie de cambios radicales en su herramienta de análisis de rendimiento. Aquello que antes era llamado “Performance Monitor” (perfmon.exe), ahora se llama “Realiability and Performance Monitor” (también su exe es perfmon.exe). Pero el cambio no se queda solo a nivel de nomenclatura, evidentemente, sino que se hace mucho mas poderoso intuitivo y jugueton…

image
Captura de Performance Monitor en Windows server 2003 (y XP)

image
Captura de Reliability and Performance Monitor en Windows Server 2008 (y vista)

Si recordamos, en Windows Server 2003, las plantillas tenían un formato basado en .htm. Dichas plantillas las podemos crear facilmente mediante perfmon.

Suponiendo que ya tenemos creado nuestro conjunto de contadores que deseamos capturar, si lo que queremos es incorporarlo sobre otro servidor, lo que haremos será exportarlo a un fichero .htm que copiaremos posteriormente a otro servidor e incorporaremos.

El siguiente proceso solo es válido para exportar/importar entre Windows 2003/XP como origen/destino:

  • Exportar plantilla:

image

Botón derecho sobre el log que queramos exportar

  • Copiar plantilla al servidor destino
  • Incorporar plantilla tal y como se ve en la imagen:

image 
Botón derecho sobre “Counter Logs” y luego “New Log Settings From…”

  • Elegimos nuestro template…

image 

Hasta aqui, todo normal, el problema viene cuando queremos incorporar la plantilla sobre un Windows Server 2008…porque el formato de las plantillas ha cambiado. Para empezar, la extensión es xml, lo cual ya nos da que pensar que no cargará los .htm ;)

Podeis probar a incorporar vosotros mismos un .htm y ver como no os deja, yo lo que voy a hacer es daros la solución, que pasa por utilizar la herramienta “logman” (que viene con Windows Server 2008) para exportar el template al formato de Windows Server 2008.

Para ello lo que tendremos que hacer es desde un Windows Server 2008, exportar las plantillas definidas en un Windows Server 2003 de forma remota:

image NOTA: Ejecutado desde Windows Server 2008, siendo 10.1.1.100 un Windows 2003 con la plantilla “miplantilla” definida (ver imágenes mas arriba)

Tal y como se vé en la imagen, desde un Windows Server 2008 estoy pidiendo exportar el log “miplantilla” que se encuentra en el servidor 10.1.1.100, al formato xml en el fichero miplantilla.xml.

Una vez tenemos ya la plantilla definida en el formato compatible de Windows Server 2008, podemos incorporarla fácilmente siguiendo estos sencillos pasos:

  • Ejecutar perfmon en Windows Server 2008
  • Boton derecho sobre “Data Collection Sets->User Defined”

image

  • Darle un nombre al data collection set sobre el que añadiremos la captura de datos mediante perfmon
  • Seleccionar “Create from a template”

image

  • Hacer click sobre “Browse” en lugar de utilizar las plantillas predefinidas

image

  • Una vez ya está importado, podremos configurar la ruta de salida del fichero .blg, planificaciones horarias,…e incluso modificar aquello que estimemos oportuno.

image

Por tanto, como hemos visto, pese a que pueda ser algo traumático para un DBA o responsable de sistemas, todo aquello de “las grafiquitas” que tanto nos gustaba en 2003 y nos “tuneamos”, lo podemos reutilizar en 2008 sin problemas.

domingo, 3 de mayo de 2009

Forzar activación de Database Mail en el agente de SQL Server

En alguna ocasión me ha ocurrido que no he podido activar en el sistema de alertas del agente de SQL, el perfil de correo Database Mail. Sea como sea, por mas que le pinchaba sobre Database Mail, siempre me activaba SQLMail.

Untitled

Para esas situaciones en las que el Management studio no quiere reaccionar, podemos hacerlo nosotros manualmente mediante el siguiente código T-SQL:

 

USE [msdb]
GO
EXEC msdb.dbo.sp_set_sqlagent_properties @email_save_in_sent_folder=1
GO
EXEC master.dbo.xp_instance_regwrite N'HKEY_LOCAL_MACHINE',
N'SOFTWARE\Microsoft\MSSQLServer\SQLServerAgent',
N'UseDatabaseMail',
N'REG_DWORD', 1
GO
EXEC master.dbo.xp_instance_regwrite N'HKEY_LOCAL_MACHINE',
N'SOFTWARE\Microsoft\MSSQLServer\SQLServerAgent',
N'DatabaseMailProfile',
N'REG_SZ',
N'solid'
GO



En este caso, donde pone “solid” pondremos el perfil Database Mail que queramos utilizar.

Solución al problema de tareas de mantenimiento fantasma

Un error que ocurría con las primeras ediciones de SQL 2005 para mi sorpresa parece que ha vuelto con SP3, me refiero a aquellos planes de mantenimiento corruptos que eran imposibles de borrar una vez los editabas en SQL Server Management Studio.

Recientemente en una instalación de W2K3 y SQL2K5 (ambos con todos los service packs instalados y actualizaciones de seguridad a la última en Abril 2009) he visto como ocurrian de nuevo los problemas con las tareas de mantenimiento:

The DELETE statement conflicted with the REFERENCE constraint
"FK_subplan_job_id". The conflict occurred in database "msdb", table
"dbo.sysmaintplan_subplans", column 'job_id'.
The statement has been terminated. (Microsoft SQL Server, Error: 547)

El error en cuestión se encuentra en uno de los procedimientos almacenados que se utilizan para borrar los jobs que genera el plan de mantenimiento para cumplir su función.

Existe solución al problema y consiste en la siguiente:

  • En la BBDD msdb, editar el código del procedimiento almacenado: dbo.sp_delete_job
  • Buscar el siguiente delete:
DELETE FROM msdb.dbo.sysjobs
WHERE job_id IN (SELECT job_id FROM #temp_jobs_to_delete)
  • Insertar el siguiente código justo delante:
DELETE FROM sysmaintplan_log
where subplan_id in (select subplan_id from msdb.dbo.sysmaintplan_subplans
where job_id in (SELECT job_id FROM #temp_jobs_to_delete))

DELETE FROM msdb.dbo.sysmaintplan_subplans
where job_id in (SELECT job_id FROM #temp_jobs_to_delete)
  • Ejecutar

Como podeis imaginar, por error no se han incluido dos referencias a tablas con información sobre los planes de mantenimiento a los que pertenece el job a eliminar y surge un error de clave ajena al intentar suprimirlo.

El problema lo he detectado con una instalación en cluster 2 nodos de Windows 2003 x64 Enterprise en ingles con SQL 2005 x64 Enterprise Castellano.

domingo, 19 de abril de 2009

Como instalar un cluster de SQL Server 2008 en Windows Server 2008 (1/2)

En un solo post tratar el tema completo quedaria muy largo por lo que es mejor dividirlo en dos. Para el primer post, hablaré de como clusterizar SQL Server 2008 sobre un entorno Windows 2k8 previamente clusterizado (cuya clusterización será la segunda entrega).

1 Instalar .NET 3.5 SP1

Es necesario disponer de .NET 3.5 sp1 antes de instalar SQL Server 2008. Como paso previo a la instalación de SQL Server, se puede planificar puesto que su instalación requiere reinicio. En cualquier caso, el propio proceso de instalación de SQL Server 2008 detecta si existe el runtime .NET 3.5 SP1 y si no es así, lo instala.

2 Instalar Windows Installer 4.5

Es necesario disponer de la version Windows installer 4.5 para poder realizar la instalación de SQL Server 2008. Puesto que el propio DVD de instalación de SQL Server ya lo posee, también se puede instalar durante el proceso de instalación. Se trata del Hotfix KB942288.

3 Instalación de SQL Server 2008 sobre Clúster de W2k8

El proceso de instalación del clúster de SQL Server 2008 requiere realizarse sobre un nodo del clúster de Windows Server 2008 previamente montado; además, al igual que en el caso de windows server 2008, se ha variado su configuración respecto a ediciones anteriores (para mejor). En este caso vamos a sacarle partido y lo que haremos es ni mas ni menos que instalar un cluster de un solo nodo de SQL 2008. Sé que parece extraño, pero esto es muy util. Hace unos meses en un cliente tuvimos un problema con las cabinas de un geocluster de windows; no viene al caso el problema pero la dicho problema no impidió que montaramos el geocluster, aunque durante un dia ese geocluster solo tenia un solo nodo ;)

3.1 Instalación del primer nodo del Clúster de SQL Server 2008

Una vez introducido el DVD de SQL Server 2008 sobre el servidor, se han de seguir los siguientes pasos:

image

image

  • Clickear sobre “Instalación”

image

  • Clickear sobre nueva instalación de SQL Server Failover cluster.

Una vez detectado que no se dispone de Windows Installer 4.5, se procede a su instalación (lo mismo ocurrirá con .NET 3.5 SP1 si no se detectara:

image

Una vez instalado, se comienza con las validaciones previas a la instalación de SQL Server

image

Una vez validados los prerrequisitos, se instalarán los ficheros necesarios para la instalación de SQL Server

image

El siguiente paso es introducir la clave de registro. Una vez introducida (que puede venir ya predefinida según la licencia), se procede a la validación del estado del cluster para su futura instalación, así como de la configuración del servidor y las necesidades del entorno necesarias para que la instalación llegue a buen puerto.

image

Como vemos en la imagen anterior, existen 3 advertencias en la instalación que nos avisan de posibles configuraciones que podrían afectar al funcionamiento de SQL Server. Las advertencias permiten continuar la instalación y hacen referencia a cosas que te recomienda revisar por simple seguridad hacia ti. Evidentemente, aqui variará los mensajes que te puedan dar en tu instalación pero independientemente de lo que sea, revísalos siempre para que no se te escape nada. Algunos mensajes que te puede dar:

  • Advertencia sobre MSDTC. Si no vamos a utilizar este servicio, este aviso puede obviarse.
  • Aviso de rendimiento en la configuración de red (si tienes TEAMING activado). Te advierte de una “posible” configuración de prioridades en las tarjetas de red, que podría ocasionar una pérdida de rendimiento de red.
  • El tercer punto hace referencia a un aviso para que recordemos abrir los puertos del firewall necesarios para poder conectar externamente al servidor de SQL Server.

Una vez revisada la configuración, si pulsamos en siguiente, continuaremos con el proceso de instalación, donde seleccionaremos únicamente el motor de SQL Server y las herramientas cliente (en este ejemplo en concreto, hay mas servicios clusterizables)

image

Seleccionaremos el nombre virtual del clúster de SQL Server y el nombre de la instancia:

image

Solo habilitamos el modo de autentificación Windows para reducir la superficie de ataque, y agregamos un usuario específico o un grupo de usuarios del dominio como administradores de SQL Server.

image

Seleccionamos las rutas que queremos por defecto:

image

Configuraremos FILESTREAM si es necesario:

image

Por último ya solo falta que comience el proceso de instalación:

image

Una vez finalizada la instalación de SQL Server en el cluster, dispondremos de un cluster de SQL Server 2008 en un solo nodo.

Si abrimos el “Failover Cluster Administration”, podremos ver el estado actual de configuración de nuestro clúster.

image

Comprobamos que podemos acceder abriendo la consola de administración “SQL server Management Studio” y comprobando la versión de SQL Server (por ejemplo):

image

3.2 Adición de un nuevo nodo al clúster de SQL Server 2008

Llegados a este punto, ya tenemos montado el cluster de SQL Server, con la única salvedad de que es un cluster de un solo nodo (pero eso si, funcional). El siguiente paso evidentemente es recomendable porque cuando montamos un cluster, no lo hacemos en principio para tener un único nodo…en cualquier caso, ya sabeis que se puede trabajar con SQL Server en este momento y posteriormente cuando se pueda, configurar este paso tantas veces como nodos queramos tener.

Para ello, introduciremos el DVD de SQL server en el servidor que vamos a añadir al cluster de SQL 2008

image

NOTA: No insertar en el nodo ACTIVO

En este caso, lo que haremos será clickear sobre la opción de añadir un Nuevo nodo a un clúster existente.

image

De nuevo se realizan procesos de validación en este nodo, para detector inconsistencias. En este caso de nuevo aparecen advertencias. Pese a que puedan ser las mismas que antes, debemos comprobar que todo es correcto

image

Una vez detectado el clúster donde hemos de ingresar este nodo, lo que haremos será configurar las cuentas de servicio reintroduciendo los passwords de nuevo en el caso de nuestros inicios de sesión de base de datos y SQL Server Agent.

El resto del proceso son formularios donde nuestra única aportación será la de clickear en “siguiente” tras validar la información

image

image

Por último ya solo queda probar un failover si queremos comprobar que todo va a ir como toca y listo, a trabajar! ;)

domingo, 12 de abril de 2009

Manten tus índices de forma eficiente

Desde SQL Server 2005 la sentencia DBCC SHOWCONTIG ha sido reemplazada mediante la función de administración del sistema sys.dm_db_index_physical_stats(…) mediante la cual podemos realizar consultas dinámicas sobre el estado de nuestros índices y montones.

Al margen de que en este artículo no voy a evaluar el uso de DBCC SHOWCONTIG, debes saber que dicha cláusula marcada como DEPRECIADA desde SQL Server 2005 no contempla ya algunas de las características de SQL 2005 o 2008 (datos espaciales, nvarchar(max), varchar(max),…particiones,…) por lo que deberías de dejar de consultarla en pro de la DMF sys.dm_db-index-physical_stats(…)

¿Por qué aparece la fragmentación?

En la mayoría de las aplicaciones, las operaciones de modificación de datos que sufren nuestras tablas no son ni mucho menos repartidas de forma equitativa por la misma. Esto quiere decir que se darán situaciones en las que realicemos varias inserciones sobre las mismas páginas, dejando otras prácticamente sin tocar. Además, las inserciones producirán page-splits con el paso del tiempo, dando al final una situación en la que el relleno de las páginas de nuestros índices ha variado respecto a su estado inicial. Con el tiempo las páginas no serán correlativas porque al buscar espacio en disco donde almacenarlas, este no será asignado de forma secuencial (fragmentación externa). Además, se darán situaciones en las que existan páginas con espacio libre suficiente para albergar datos, que se encuentran repartidos en otras páginas con también espacio libre suficiente, produciendo una situación en la que por ejemplo 2 páginas puedan unirse en una sola (fragmentación interna)

¿Qué problemas conlleva la fragmentación?

A grandes rasgos, si existe fragmentación, lo que ocurre es que datos que deberían estar de forma contigua y compacta no lo estén. Esto implica que en ocasiones se necesiten mayor numero de lecturas E/S para recuperar un dato, ya que si este debería encontrarse en una sola página y se encuentra en dos, ya estamos necesitando una lectura extra que no debería existir. Pero piensa siempre a lo grande y no pienses en una lectura sola, piensa en ese problema reproducido con un mayor porcentaje y te darás cuenta que al final estamos hablando de ciclos de CPU y lecturas de disco que pueden hacer que consultas que duran milisegundos pasen al orden de los segundos.

¿Cómo evitamos la fragmentación?

Existen 3 formas de eliminar la fragmentación:

  • Borrar y recrear el índice fragmentado

Uso de DROP INDEX … y luego CREATE INDEX …

Beneficios: Se puede especificar que el nuevo índice cumpla con la especificación de relleno dada por el FILLFACTOR. La recreación del índice es la mejor puesto que se rellena conforme le hayamos especificado y además todo será correlativo y compacto.

Desventajas: La operación es offline tanto en el borrado como en recreación del mismo (no se podrá consultar). Además la operación es atómica, lo cual quiere decir que si paramos la creación del índice, este último no se crea y por tanto nos quedaremos sin el (hasta volver a recrearlo). Otra desventaja importante es que debemos tener presente que puede que tengamos claves ajenas apuntando al índice, las cuales tendremos que desactivar o borrar previo a realizar esta operación.

  • Reordenar las páginas de los niveles hoja del índice

Uso de ALTER INDEX … REORGANIZE

Beneficios: Reorganiza los datos del nivel hoja del índice en un orden lógico. La ordenación se realiza de forma online por lo que podemos consultar el índice mientras se realiza la operación, y además si la interrumpimos, permanecerá en un estado consistente

Desventajas: Este método no obtiene resultados de desfragmentación tan eficientes como un borrado y recreación de índice clustered

  • Recrear el índice

Uso de ALTER INDEX … REBUILD

La recreación del índice consiste en realizar un borrado y recreación del mismo. La diferencia con la primera forma de eliminar fragmentación que hemos visto, es que esta operación está pensada para realizarse como tarea de mantenimiento al estilo de reorganización. Es decir, que no es necesario tener en cuenta entre otras cosas las claves ajenas que están apuntándole, por ejemplo.

De forma predeterminada, la operación es offline, lo cual quiere decir que durante el tiempo de recreación del índice no se puede consultar, pero es posible especificar un flag en su definición, que posibilite su recreación ONLINE (solo para ediciones Enterprise edition). Además, es por supuesto mas eficiente que la mera reorganización por lo que en según que casos es mas óptimo realizarlo.

De los tres métodos, solo nos interesa a priori el 2º y 3º debido al gran número de desventajas que se presentan en el primero.

¿Cómo detectamos la fragmentación?

De entre todas las columnas devueltas por la DMF sys.dm_db_index_physical_stats, nos centraremos en las columnas siguientes

Columna

Descripción

avg_fragmentation_in_percent

El porcentaje de fragmentación externa, es decir páginas que están fuera de orden y no consecutivas.

fragment_count

Numero de fragmentos en el índice (número de páginas físicamente consecutivas en un nivel hoja)

avg_fragment_size_in_pages

Media de número de páginas en un fragmento en un índice

avg_page_space_used_in_percent

Promedio de espacio de almacenamiento de datos disponible usado en todas las páginas

Gracias a la información que podemos consultar en dichas columnas, podremos realizar filtros en función del nivel de fragmentación:

  • Si hay más de un 30% de fragmentación externa (avg_fragmentation_in_percent), o menos de un 60% de espacio usado medio por página en un índice (avg_page_space_used_in_percent), es recomendable realizar un REBUILD.
  • Si hay entre un 10% y un 15% de fragmentación externa o entre un 60% y un 75% de espacio usado medio por página en un índice es recomendable realizar un REORGANIZE.

Además, no nos va a interesar analizar todos los índices porque quizás tengamos miles de ellos y no todos tengan tantos datos y/o fragmentación como para que nos resulte óptimo desfragmentarlos. Es por ello que de todos los índices solo nos quedaremos con los que satisfagan el siguiente filtro:

WHERE (avg_fragmentation_in_percent > 10

or avg_page_space_used_in_percent < 75)

and page_count > 8

La parte de page_count > 8 la pongo porque me parece interesante que si un índice es tan pequeño que no tiene ni 8 páginas, no merece a priori nuestra atención. Esto obviamente depende mucho del entorno en el que estemos pero en la mayoría de situaciones no ganamos nada desfragmentando un índice tan pequeño y el coste de su desfragmentación no está justificado (pese a que sea tan bajo que parezca insignificante, si hablamos de miles de índices la cosa no es tan simple).

Mediante el script que voy a indicar a continuación, se devolverá entre otras cosas la sentencia recomendada para desfragmentar el índice según las premisas definidas anteriormente.

declare @tempFragmentation as table(bbdd sysname,

[table] varchar(128),

index_name varchar(128),

avg_fragmentation_in_percent decimal (28,2),

avg_page_space_used_in_percent decimal (28,2),

page_count bigint,

record_count bigint,

fragment_count bigint,

internal_fragmentation bit,

external_fragmentation bit,

recommendation nvarchar(1024))

declare @nombreBBDD nvarchar(128)

declare @nombreBBDD_sin_espacios nvarchar(128)

declare @sentenciaSQL nvarchar(max)

DECLARE cursorBBDD CURSOR read_only fast_forward forward_only FOR

SELECT [name] FROM sys.databases

where state_desc = 'ONLINE'

OPEN cursorBBDD

-- Perform the first fetch.

FETCH NEXT FROM cursorBBDD

into @nombreBBDD

WHILE @@FETCH_STATUS = 0

BEGIN

set @nombreBBDD_sin_espacios = @nombreBBDD

set @nombreBBDD = QUOTENAME(@nombreBBDD)

set @sentenciaSQL = N'

with dt as (

SELECT index_id,object_id,database_id,avg_fragmentation_in_percent, avg_page_space_used_in_percent,page_count,record_count,fragment_count

from sys.dm_db_index_physical_stats (DB_ID('''+ @nombreBBDD_sin_espacios +'''), NULL, NULL, NULL, NULL)

where ( avg_fragmentation_in_percent > 10

or avg_page_space_used_in_percent < 75)

and page_count > 8

)

SELECT db_name(database_id) BBDD,ss.name+''.''+st.name [table] ,si.name index_name, dt.avg_fragmentation_in_percent, dt.avg_page_space_used_in_percent,page_count,record_count,fragment_count,

case

when avg_page_space_used_in_percent < 75 then 1

else 0

end Fragmentacion_interna,

case

when avg_fragmentation_in_percent > 10 then 1

else 0

end Fragmentacion_externa,

case

when ( avg_page_space_used_in_percent < 60

or avg_fragmentation_in_percent > 15

) then ''ALTER INDEX '' + si.name+ '' ON ''+ SCHEMA_NAME(st.SCHEMA_ID)+''.''+st.name +'' REBUILD;''

else ''ALTER INDEX '' + si.name+ '' ON ''+ SCHEMA_NAME(st.SCHEMA_ID)+''.''+st.name +'' REORGANIZE;''

end SENTENCIA_RECOMENDADA

from dt

INNER JOIN '+ @nombreBBDD+ '.sys.indexes si ON si.object_id = dt.object_id

and dt.index_id <> 0

AND si.index_id = dt.index_id

INNER JOIN '+ @nombreBBDD+ '.sys.tables st on st.object_id = dt.object_id

INNER JOIN '+ @nombreBBDD+ '.sys.schemas ss on ss.schema_id = st.schema_id

order by BBDD,dt.avg_fragmentation_in_percent desc, dt.avg_page_space_used_in_percent asc,page_count desc,record_count desc,fragment_count desc

'

insert into @tempFragmentation ( bbdd,[table],index_name,avg_fragmentation_in_percent,

avg_page_space_used_in_percent,page_count,

record_count,fragment_count,internal_fragmentation,

external_fragmentation,recommendation)

execute(@sentenciaSQL)

-- This is executed as long as the previous fetch succeeds.

FETCH NEXT FROM cursorBBDD

into @nombreBBDD

END

CLOSE cursorBBDD

DEALLOCATE cursorBBDD

select * from @tempFragmentation

Quedaría por tanto simplemente que modificarais este script para que las consultas recomendadas sean planificadas para ejecución en horas a las que vuestro modelo de negocio le vengan mejor ¿tal vez a las 2am? ¿tal vez las recreaciones deben ser ONLINE? Digamos que con este esqueleto no os resultará difícil definiros vuestro modelo de reindexación específico.

lunes, 6 de abril de 2009

Canal de videos de aprendizaje

Desde hace relativamente poco tiempo, existe un canal de youtube dedicado a SolidQ en su vertiente castellana. En el, se pueden ver opiniones de asistentes al summit 2008, así como videos de aprendizaje de Integration Services, Analisis Services, Sql Server ,… Actualmente se encuentra en continuo crecimiento asique no dejes de pasearte…o mejor aún, subscríbete!

http://www.youtube.com/solidqes

domingo, 5 de abril de 2009

¿Por qué migrar a SQL Server 2008?

Una pregunta que últimamente se da con frecuencia es la de: “vale, pero yo tengo mi sistema con SQL 2000 y me va bien ¿que gano yo instalándome el SQL 2008 si no voy a utilizar ninguna de sus novedades a priori?”. Para este tipo de cuestiones, evidentemente uno se puede poner a enumerar una por una todas y cada una de las novedades que aparecen en SQL Server 2008, pero eso no le resolverá la duda a la persona que la plantea, sino que probablemente piense que tiene un montón de “extras” que no le sirven para nada (datos espaciales, jerárquicos,…).

Es por ello, que en este post voy a poner algunas de las razones que a mi modo de ver, son las mejoras mas significativas que se nos ofrecen, por el simple y mero hecho de instalar SQL Server 2008 y restaurar ahí nuestra BBDD de SQL 2000:

  • Compresión de datos

Como sabemos, en SQL Server 2008 disponemos de la posibilidad de realizar compresión de datos. En algunos posts anteriores (este y este) , ya discutí las bondades de disponer de esta característica. Ciertamente, el disponer de entrada, de la posibilidad de comprimir datos o backups, es algo muy a tener en cuenta. Es más, todavía me falta el post III de III, donde se podrán ver las grandes mejoras en cuanto a rendimiento se refiere, de activar la compresión de datos.

image

  • Resource Governor

Gracias a Resource Governor, vamos a poder conseguir que el motor relacional se comporte como queremos. Se acabaron las consultas que nos tumban el servidor, aquellos reports que lanzaba el director cuando le apetecía una y otra vez que nos ralentizaban a todos, esas consultas críticas que no salían cuando se las necesitaba porque el becario estaba jugueteando con eso llamado T-SQL en producción,…

image

  • Consolidación de servidores

Gracias a la característica de “administración centralizada de servidores” (Central Management Servers), podremos gestionar múltiples servidores de forma simultanea. Desde el mismo momento en que instalemos SQL Server 2008, podremos gestionar SQL 2008, SQL 2005 e incluso SQL 2000 de una manera centralizada, validando políticas de seguridad, lanzando comandos T-SQL de administración,…Es decir, que por el mero hecho de tener un único SQL 2008, nos vamos a beneficiar incluso en la gestión de servidores de otras ediciones.

image

  • Transparent Data Encryption

¿Te has parado a pensar en qué ocurre si un backup de producción cae en malas manos? Quizás estás pensando que realmente no pasa nada porque tu ya estás implementando encriptación a nivel de columna mediante certificados en SQL Server 2005…; ¿y si te dijera que con solo lanzar un comando, SQL Server 2008 cifra TODO y además de forma transparente a tus aplicaciones? Pues es posible y se llama TDE (Encriptación transparente de datos), una característica por la que incluso los propios backups realizados sobre una BBDD cifrada mediante TDE son imposibles de restaurar sin su certificado y/o password, y están completamente cifrados.

  • Consultas mas eficientes para tipos de datos fecha

Con la aparición de los nuevos tipos de datos fecha, aparece el tipo de datos “date”. Gracias a el, cuando deseemos realizar una consulta a un datetime o smalldatetime para obtener datos filtrados por una fecha en particular, podremos realizar una consulta mas natural y eficiente de la siguiente forma:

select * from dbo.TestIndexSeek where cast(sample_datetime as date) = '20071208';

*NOTA: sample_datetime puede ser de tipo datetime o smalldatetime, no es necesario que cambiemos nada en nuestro modelo EER


Este tipo de consultas, pese a lo que se pueda pensar al ver el cast al lado izquierdo de la comparación, ahora son eficientes (se entiende que existe un índice sobre sample_datetime).

image

  • Múltiples hilos para consultas sobre datos particionados

En SQL Server 2005, si una consulta debía recorrer múltiples particiones para devolver los resultados, solo existía un único hilo para recorrerlas. En SQL Server 2008, mejoras en el motor relacional hacen que existan múltiples hilos no solo para recorrer cada partición, sino para aquellas operaciones que deben moverse entre particiones para devolver datos

image

  • Indexación eficiente mediante filtrado de índices

Ahora es posible definir índices filtrados. Si conocemos que existen consultas que filtran datos sobre columnas cuya distribución de datos solo hace posible la utilización del índice en escasos predicados, podemos hacer un índice filtrado que optimice dichas consultas únicamente. Con ello obtendremos un índice mas ligero, puesto que solo será mantenido para el predicado que le hayamos dicho nosotros

CREATE NONCLUSTERED INDEX idx_territory5_orderdate
ON Sales.SalesOrderHeader(OrderDate)
INCLUDE(SalesOrderID, CustomerID, TotalDue)
WHERE TerritoryID = 5;
  • Seguimiento de cambios y de datos y mejoras en auditoria

En SQL Server 2008 existen las características CDC (Change Data Capture) y CT (Change Tracking) mediante las cuales podemos realizar un seguimiento de cambios de nuestros datos. De forma muy simple, podemos activar las características mediante las cuales podemos saber no solo cuantas veces ha cambiado un dato de valor, sino incluso todos los cambios por los que ha pasado e incluso (esto ya con algo de trabajo por nuestra parte) quién lo ha realizado.

¿te gustaría saber si alguien trata de obtener información sobre tu nómina? Puedes activar otra característica llamada Auditing, por la cual puedes incluso saber quien está lanzando una select (con su query) que implique lectura de alguna tabla.

  • TVP

Las siglas TVP (Table Value Parameters) hacen referencia ni mas ni menos que a la posibilidad de que nuestras aplicaciones puedan enviar tablas como parámetros de entrada de procedimientos almacenados y funciones। Algo que a priori quizás no le veas mucho sentido si no te paras a pensarlo, pero que supone un aumento de rendimiento brutal porque simplemente, SQL Server trabaja mejor con conjuntos, por lo que es exageradamente mas eficiente procesando una actualización de 100 filas, que 100 actualizaciones de una fila।

Este último realmente requiere que las aplicaciones cliente le saquen provecho, pero no he podido dejarlo pasar en este post porque me encanta ;)

Como se ha podido ver, existen numerosas características en SQL Server 2008 aprovechables de entrada, sin necesidad de tener que hacer un esfuerzo considerable ni mucho menos (algunas ya las obtenemos simplemente al restaurar el backup sobre 2008).

En cualquier caso, estas características no son ni mucho menos las únicas que aparecen en SQL 2008 y sino, aquí va una prueba:

image

domingo, 29 de marzo de 2009

Conseguir conectividad Wireless para maquinas virtuales hyper-v

En alguna ocasión alguien me realizó la pregunta y puesto que la respuesta puede no ser demasiado obvia…aquí dejo el post para responderla.

Si directamente lo que no sabemos es como hacer para tener Wireless en Windows Server 2008, aquí van unos sencillos pasos:

  • Administrar servidor

image

  • Añadir características

image

  • Añadir soporte Wireless

image

NOTA: para mas información, recomiendo visitar http://www.win2008workstation.com/wordpress/2008/03/08/enable-wireless-networking/

Una vez tengamos el servicio de Wireless sobre W2k8 funcionando, los pasos para hacer que nuestras máquinas virtuales tengan conectividad a internet mediante Wireless son sencillos:

  • Instalamos la interfaz de red loopback. Para ello nos vamos al administrador de dispositivos

image

image

  • Añadimos hardware

image

  • Indicamos que añadiremos el hardware de forma manual a partir de una lista

image 

  • Indicaremos que específicamente deseamos adaptadores de red

image

  • Elegiremos de Microsoft, el “Microsoft Loopback Adapter”

image

Una vez lo tengamos agregado y finalicemos el asistente, lo siguiente que tendremos que hacer es darle conectividad a la nueva interfaz loopback a través de nuestra salida a internet Wireless. Para ello, basta con crear un puente entre la interfaz loopback y la wireless seleccionando ambas tarjetas y pulsando sobre boton derecho->Bridge connections.

image

Por último, solo falta crearnos la tarjeta virtual hyper-v desde el administrador hyper-v

  • Entramos en “Virtual Network Manager…”

image

  • Seleccionamos una red de tipo “External” para tener conectividad hacia fuera.

image

  • Seleccionamos como tarjeta de red la “Microsoft Loopback Adapter”

image

  • Por último solo falta entrar en las propiedades de nuestra máquina virtual y seleccionar la tarjeta de red virtual ;)

image 

Muy facil, como veis ;)