Nueva version de Microsoft "Data Explorer" Preview for Excel

by Maxi Accotto 15. mayo 2013 19:54

Se ha liberado una nueva versión de esta excelente herramienta para análisis de datos en Excel 1.3.3296.143.

Aquí el link de descarga.

Recordar que es una versión beta.

Tags:

Impacto en la performance de Union vs Union ALL

by Maxi Accotto 12. mayo 2013 20:33

En muchas querys necesitamos aplicar el uso de UNION, pero esta instrucción se divide en dos partes, una es UNION y la otra UNION ALL, la primera eliminara los resultados duplicados de los conjuntos y la segunda traerá todo el conjunto por más que existan duplicados.

Ahora bien, entre estas instrucciones hay diferencias de performance a favor del UNION ALL , por lo cual la recomendación es tratar de usar esta sintaxis donde mayor se pueda y evitar el uso solo de UNION, obviamente que hay casos donde necesitamos eliminar duplicados pero no es una regla común con lo cual nos encontramos varias veces código con UNION que se podía usar tranquilamente UNION ALL y por una cuestión quizás de comodidad al escribirlo o desconocimientos de impactos de performance no se observa.

Lo que haremos ahora es una comparación de estas dos instrucciones.

Lo primero que haremos es crear dos tablas

USE TEMPDB

GO

CREATE TABLE T1 (

DESCRIPCION VARCHAR(50)

                 )

GO

CREATE TABLE T2 (

DESCRIPCION VARCHAR(50)

                 )

GO

 

Luego le insertamos algunos datos

INSERT INTO T1 (DESCRIPCION)

VALUES ('UNO')

INSERT INTO T1 (DESCRIPCION)

VALUES ('DOS')

INSERT INTO T1 (DESCRIPCION)

VALUES ('TRES')

INSERT INTO T1 (DESCRIPCION)

VALUES ('CUATRO')

INSERT INTO T1 (DESCRIPCION)

VALUES ('CINCO')

 

INSERT INTO T2 (DESCRIPCION)

VALUES ('UNO1')

INSERT INTO T2 (DESCRIPCION)

VALUES ('DOS1')

INSERT INTO T2 (DESCRIPCION)

VALUES ('TRES1')

INSERT INTO T2 (DESCRIPCION)

VALUES ('CUATRO1')

 

Ahora que tenemos nuestras dos tablas haremos las querys de UNION y luego UNION ALL comparando sus query plan.

SELECT * FROM T1

UNION

SELECT * FROM T2

 

El costo total de esta query es de 0,017.

Aquí podemos observar una operación Sort que consume el 63% del query plan y la cual se debe aplicar para los Distinct ya que se deben eliminar duplicados.

Ahora ejecutaremos la misma query pero con UNION ALL.

SELECT * FROM T1

UNION ALL

SELECT * FROM T2

 

Aquí su costo es de 0,0065, si comparamos ambos query plan observamos este cambio.

 

En el primero tenemos un mayor consumo ya que se debe aplicar el distinct y en el segundo no.

El resultado de la consulta en ambos casos da los mismos registros.

Como resumen recomiendo no aplicar por defecto el uso de UNION y solo dejarlo para casos donde no se necesiten duplicados, y si utilizar más el uso de UNION ALL ya que como hemos podido observar es más performante.

Tags:

Tuning

Complemento para editar DAX desde Visual Studio

by Maxi Accotto 6. mayo 2013 17:50

Este es un interesante complemento para aquellos que trabajan con proyectos tabulares de SQL Server 2012. Con el mismo podrán tener muchas mas funcionalidades que las que trae la herramienta por defecto.

Aquí les dejo el link para descargar la versión gratuita.

Tags:

BI | SQL 2012

Microsoft SQL Server 2012 Data-Tier Application versión de mayo 2013

by Maxi Accotto 4. mayo 2013 19:53

Se liberó en mayo una nueva versión del framework para el uso de DAC en SQL Server 2012. Para todos aquellos que estén trabajando con proyectos de base de datos es recomendable que apliquen esta nueva versión

Tags:

SQL 2012

Se ha liberado el CU #7 para SQL 2012 RTM

by Maxi Accotto 15. abril 2013 19:47

Esta liberado el Cumulative Update 7 para SQL Server 2012 RTM

En el siguiente link se podrá acceder a la página para su descarga.

Debo aclarar que este parche es para versiones RTM que no tienen SP1 instalado.

Este CU dispone de 17 fix.

Tags:

Noticias

Mejorando la performance con índices de filtro en SQL 2008 o superior

by Maxi Accotto 13. abril 2013 20:10

En la versión SQL 2008 o superior se pueden crear índices que tengan filtros. Estos mimos que son de simple creación pueden tener un gran impacto en la mejora de performance.

En este post haremos un análisis del uso de estos índices y sus respectivos costos vs los índices comunes.

Esta más que claro que no se los puede aplicar en todos los casos, primero deberíamos determinar selectividad y espacio, un ejemplo de esto sería: Si tenemos una tabla de correos electrónicos y en la misma hay un estado donde indicamos si es leído o no leído, es muy probable que nuestros datos estén más o menos así: 90% Leídos 10% no leídos.

Si deseamos hacer una query que traiga los mails no leídos vamos a necesitar un índice por ese campo estado para que la consulta responda de forma eficiente. Esto se podría hacer con un índice común o bien uno con filtro, la diferencia va a ser importante ya que no va a ser lo mismo guardar todos los estados (Leídos y no Leídos) vs los no leídos solos.

Vayamos por partes, lo primero que vamos a hacer es crear una tabla.

CREATE TABLE MAILS (ID INT IDENTITY PRIMARY KEY,

FECHA DATETIME,

            LEIDO BIT,

            MENSAJE VARCHAR(MAX))

GO

 

Luego lo que haremos es insertar un par de millones de registros para que podamos luego ver los impactos más fáciles entre un tipo de índice y el otro, a mayor volumetría la diferencia será más notoria.

DECLARE @N INT = 0

WHILE @N <= 1000000

BEGIN

INSERT INTO MAILS (FECHA,

LEIDO,

MENSAJE)

VALUES (GETDATE(),

1,

     'MENSAJE DE CORREO' + CONVERT(VARCHAR(36),NEWID()))

SET @N = @N + 1

END

 

-- INSERTAMOS UN PAR DE MILLONES MAS

 

INSERT INTO MAILS (FECHA,

LEIDO,

             MENSAJE)

SELECT FECHA,

1,

    MENSAJE

FROM MAILS

GO 4

 

Hacemos ahora un update de unos 5000 registros para poner su estado leído en 0 indicando con esto que esos registros están sin leer.

UPDATE TOP (5000)

MAILS

SET LEIDO = 0

 

Si ejecutamos la siguiente query buscando los correos sin leer vamos a obtener un query plan que hace un Clustered index Scan ya que no tenemos índices por el campo leído.

SELECT FECHA,

MENSAJE

FROM MAILS

WHERE LEIDO = 0

 

Para poder mejorar nuestro proceso entonces le creamos un índice sobre la columna leído

 

SET STATISTICS TIME ON

CREATE INDEX IX1 ON MAILS (LEIDO)

 

El proceso ha tenido una duración de 15 segundos aproximadamente. Ya con ese índice creado hemos podido mejorar la performance y nuestro query plan ha cambiado.

 

 

Con esto nos podríamos quedar contentos, pero no va a ser mi caso J, veamos qué pasa si creamos un índice con filtro, porque? Porque este índice que acabamos de crear anteriormente solo se podrá utilizar cuando le pidamos los no leídos, si cambio la query y solicito los leídos como son muchos datos va a ser más barato hacer un Scan que el Seek que vimos anteriormente.

 

SELECT FECHA,

MENSAJE

FROM MAILS

WHERE LEIDO = 1

 

Esto es totalmente lógico ya que es la selectividad de mi consulta. La pregunta es: si entonces solo este índice es útil cuando busco los no leídos por su selectividad cuando yo lo cree almaceno no solo estos sino que también los leídos ya que no hice ningún filtro, esto va a tener un impacto en el tamaño de dichos índices no.

Ahora lo que vamos a hacer es crear el índice con filtro de la siguiente manera

 

SET STATISTICS TIME ON

CREATE INDEX IX2 ON MAILS (LEIDO)

WHERE LEIDO = 0

 

El tiempo de ejecución ha sido de 1 segundo contra los 14 del índice anterior, aquí ya tenemos una gran diferencia, obviamente que cuando hagamos tareas de mantenimiento sobre estos índices (defrag o Rebuild) va a ser mucho más eficiente en el índice con filtro que en el otro ya que pesa menos.

Ahora compararemos los query plan usando un índice o el otro, en mi caso dieron lo mismo.

SELECT FECHA,

MENSAJE

FROM MAILS WITH (INDEX(IX1))

WHERE LEIDO = 0

 

SELECT FECHA,

MENSAJE

FROM MAILS WITH (INDEX(IX2))

WHERE LEIDO = 0

 

Veamos ahora el espacio ocupado por cada uno de estos índices, para ello usaremos la siguiente query

SELECT

I.NAME AS INDEXNAME,

SUM(PAGE_COUNT * 8) AS INDEXSIZEKB

FROM SYS.DM_DB_INDEX_PHYSICAL_STATS(

DB_ID(), OBJECT_ID('MAILS'), NULL, NULL, 'DETAILED') AS S

JOIN SYS.INDEXES AS I

ON S.[OBJECT_ID] = I.[OBJECT_ID] AND S.INDEX_ID = I.INDEX_ID

GROUP BY I.NAME

ORDER BY I.NAME

 

IndexName

IndexSizeKB

IX1

76256

IX2

64

 

Ahora haremos una prueba más usando índices con filtro pero además que sean cover para así poder mejorar aún más nuestra query.

-- BORRAMOS LOS DOS INDICES

DROP INDEX IX1 ON MAILS

DROP INDEX IX2 ON MAILS

 

CREATE INDEX IX1 ON MAILS (LEIDO)

INCLUDE(FECHA,MENSAJE)

 

CREATE INDEX IX2 ON MAILS (LEIDO)

INCLUDE(FECHA,MENSAJE)

WHERE LEIDO = 0

 

El primer índice sin el filtro ha tardado unos 14 segundos en su creación vs 1 segundo contra el que tiene filtro.

Ahora observaremos además el espacio ocupado por cada uno de ellos

IndexName

IndexSizeKB

IX1

151272

IX2

392

 

Volvemos ejecutar nuestra query original y comparar los query plan entre usar el índice con filtro o sin él.

SELECT FECHA,

MENSAJE

FROM MAILS WITH (INDEX(IX1))

WHERE LEIDO = 0

 

SELECT FECHA,

MENSAJE

FROM MAILS WITH (INDEX(IX2))

WHERE LEIDO = 0

 

Ahora se puede observar que las dos operaciones hacen el index seek ya que hemos creado un Cover Index, pero como los índices pesan mucho menos obtenemos una mejora importante en la performance de los índices con filtro.

Resumen:

Los índices con filtro son una herramienta muy potente para muchos casos ya que no tiene sentido almacenar en un índice toda la información si la misma no se usa.

 

 

Tags:

Como podemos mejorar la performance usando columnas calculadas

by Maxi Accotto 10. abril 2013 01:27

Las columnas calculadas (Computed Column) son útiles para varias cosas.

Las mismas permiten tener una formula sobre ellas, pero muy pocos saben que a estos campos también se les pueden crear índices.

En este post veremos cómo podemos mejorar la performance de algunas querys con el uso de estas columnas calculadas y sus índices.

Primer ejemplo

Supongamos que tenemos una query similar a la siguiente:

use AdventureWorks2012

go

 

select SalesOrderID,

OrderQty,

     UnitPrice

from Sales.SalesOrderDetail

where OrderQty * UnitPrice > 100

 

Si vemos su query plan observamos lo siguiente

 

Como podemos ver se realiza un Clustered Index Scan sobre la tabla, que es lo mismo que recorrerla toda. Este query plan en mi ejemplo tiene un costo de 1,064.

Esto es totalmente lógico ya que estamos aplicando funciones a la búsqueda en los campos y esto no es compatible con los métodos SArgs.

Ahora bien, vamos a agregar un campo calculado que haga la cuenta y su correspondiente índice.

Alter table Sales.SalesOrderDetail

add total as OrderQty * UnitPrice

 

 

CREATE NONCLUSTERED INDEX [IX1]

ON [Sales].[SalesOrderDetail] ([total])

INCLUDE ([SalesOrderID],[OrderQty],[UnitPrice])

 

Volvemos a ejecutar nuestra primer query y observamos el query plan nuevo.

El costo en este caso es de : 0,26 en lugar de los 1,064 anteriores sin la necesidad de tocar la query J

 

 

Tags:

Tuning

Informes adicionales para el Management Studio que nos ayudan a detectar problemas de performance

by Maxi Accotto 7. abril 2013 02:27

 

En los feature pack de SQL Server 2012 disponemos de unos reportes adicionales a los que ya trae el Management Studio para ayudarnos a detectar problemas de performance.

La instalación es bastante simple.

  •  

  • Segundo ejecutamos el archivo de instalación que hemos descargado, esto instalara en una carpeta los reportes y script necesarios para el uso de los mismo, esto se puede hacer en la maquina local sin necesidad de instalar cosas en el servidor.

     

  • Tercero debemos buscar el script setup.sql , el mismo creara los stores y objetos necesarios en el servidor para que los reportes puedan luego usarlo. Básicamente utilizan las vistas DMV que ya vienen desde la versión 2005, yo lo he probado al script con 2008 , 2008 R2 y 2012 y en todos los casos funciono de forma correcta J

     

  • Por ultimo solo debemos ejecutar el reporte desde el SQL Server Management Studio, para ello hacemos los siguientes pasos.

     

    • Botón alterno del mouse sobre el nombre del servidor.
    • Opción Reports y luego Custom Reports
    • Ahí podremos buscar el reporte donde lo hemos instalado, el mismo tiene el nombre de performance_dashboard_main

 

Tags:

Tuning | Herramientas

Nuevas versiones disponibles del SQL Database Migration Wizard para Azure

by Maxi Accotto 6. abril 2013 05:58

 

El primero de abril de 2013 se libero una nueva versión de esta herramienta para migración a SQL Azure.

Aquí comparto el link de Codeplex

Tags:

Herramientas | Azure

Database Lifecycle Management (DLM)

by Maxi Accotto 6. abril 2013 05:44

 

Para los desarrolladores que deseen tener un proceso ordenado de base de datos no se pueden perder esta guía muy buena, en la misma no solo encontraran los procesos sino que además material adicional como puede ser videos, herramientas etc.

Tags:

Material | SQL 2008 | SQL 2012 | Artículos

Herramienta que nos ayuda a analizar los trace de SQL Server para buscar problemas de performance

by Maxi Accotto 6. abril 2013 05:41

 

En muchos lugares me preguntan cual es la mejor forma de analizar un trace de profiler para buscar problemas de performance.

Si bien hay varias formas de hacer esto, yo utilizo una herramienta totalmente gratuita desde ya hace varios años que me permite importar un trc y hacer un análisis mas fino con el como así también consolidar las operaciones que son iguales pero que por ejemplo se han cambiado sus parámetros.

La que yo utilizo se llama cleartracepero hay otras también que hacen cosas similares.

Tags:

Tuning | Herramientas

Como mover los files en el servidor secundario de un LogShipping

by Maxi Accotto 9. marzo 2013 20:06

 

En un esquema de LogShipping hay veces que deseamos mover los archivos de base de datos del nodo secundario a una nueva ubicación. Las causas de esto puede ser faltante de espacio en disco, reacomodación de Luns, etc.

Como hacemos entonces para poder mover estos archivos del secundario sin romper el Logshiiping?, aquí voy a dejar una guía a paso a paso para poder llevar adelante esta tarea.

Paso 1:

Debemos revisar si el modo de restore es “No Recovery Mode” de no ser así y estar en “Standby Mode” será necesario pasarlo a “No Recovery” (esto lo hacemos desde las propiedades de la base de datos en el servidor principal). Al hacer este cambio será necesario ejecutar de forma manual los jobs de copy y restore en el secundario así nos evitamos esperar la sincronización para que en este ultimo servidor quede la base en modo “No Recovery”

Paso 2:

Sobre el servidor secundario ejecutar la siguiente query para poder obtener los datos de la base de datos a mover

SELECT 
  name , physical_name  
FROM 
  sys.master_files 
WHERE 
  database_id = DB_ID('NombredeBaseDeDatos')

Paso 3:

Modificamos la ubicación de los archivos a la nueva unidad. Para ello usamos la siguiente instrucción usando los datos obtenidos en el paso 2 y cambiando solo la nueva unidad.

ALTER DATABASE NombreDebaseDeDatos
MODIFY FILE( NAME = name, FILENAME = 'd:\physical_name.mdf')

Paso 4:

Apagamos el servicio de SQL Server en el nodo secundario.

Paso 5:

Movemos los archivos mdf y/o ldf de forma manual con el sistema operativo, por ejemplo del disco F al D.

Paso 6:

Iniciamos el servicio de SQL Server en el servidor secundario

Paso 7:

Revisamos que el movimiento tuvo efecto y esta todo ok, para ello ejecutamos la siguiente query

SELECT 
  name , physical_name  
FROM 
  sys.master_files 
WHERE 
  database_id = DB_ID('NombreBaseDeDatos')

Paso 8:

Si esta todo bien tenemos ya los archivos de base de datos del nodo secundario en la nueva ubicación sin haber reiniciado el proceso de LogShipping, ahora los restore con sus jobs se seguirán haciendo de forma normal.

 

Tags: ,

Alta Disponibilidad

Como generar un script con solo los índices de una base de datos

by Maxi Accotto 19. mayo 2012 21:22

 

Muchas veces necesitamos armar un script con todos los índices de una base de datos. Para ello yo escribí este script en Powershell el cual se encarga de generar dicha salida.

[System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO') | out-null
$Servidor = Read-Host "Server Name"
$Basededatos = Read-Host "Database Name"
$Filename =  Read-Host "File Name Script"
$Filename = $Filename + ".SQL"
$s = new-object ('Microsoft.SqlServer.Management.Smo.Server')  $Servidor 
$dbs=$s.Databases
foreach ($tables in $dbs[$Basededatos].Tables)
{
    #Generate script for all indexes in the specified table
    foreach($index in $tables.Indexes)
    {
       $index.Script() + "`r GO `r" | out-File $Filename -Append
    }
}   

Para luego ejecutarlo simplemente es necesario entrar a la consola de nuestro Powershell como vemos a continuación

image

Tags: ,

Administracion

Como instalar SQL Server Data Tool (SSDT 2012) de forma gratuita

by Maxi Accotto 14. mayo 2012 03:21

 

En la nueva versión de SQL Server 2012 se ha introducido esta excelente herramienta llamada SSDT (Sql Server Data Tool) la cual permite desarrollar proyectos de bases de datos como lo veníamos haciendo con el TFS y las versiones ultimate de VS2010.

Esto permite al equipo de desarrollo trabajar con una herramienta mucho mas poderosa que el SSMS (Sql Server Management Studio) dándole funcionalidades como:

  • Deploy incremental
  • Refactoring
  • Comparaciones de Schemas (Estructuras)
  • Armado de paquetes DAC para una mejor implementación
  • Debug
  • Editor TSQL
  • Analizador de código TSQL para evitar malas practicas de desarrollo
  • Y mucho mas

Lo bueno de todo esto que es gratis además Open-mouthed smile , entonces aquí vamos a ver cuales son los pasos de instalación para poder tener en nuestros equipos de desarrollo esta excelente Tool.

Algunas aclaraciones: No es necesario tener TFS y con SSDT se pueden armar proyectos de base de datos para SQL 2005 / 2008 / 2008r2 y 2012

Requisitos:

Para poder instalar el SSDT vamos a necesitar:

  • Visual Studio 2010 Shell

http://www.microsoft.com/en-us/download/details.aspx?id=115

  • Visual Studio SP1

http://www.microsoft.com/en-us/download/details.aspx?id=23691

  • SSDT Tool

http://msdn.microsoft.com/en-us/data/hh297027

Pasos para la instalación:

Paso 1: Instalar Visual Studio 2010 Shell

Luego de haber descargado los instalables procederemos a iniciar el proceso de instalación, para ello ejecutaremos VSIntShell que es el archivo que hemos descargado.

01-setup_vshell

02-setup_vshell

03-setup_vshell

04-setup_vshell

Paso 2: Instalar Visual Studio SP1

Luego de haber terminado el proceso de instalación del Visual Studio Shell debemos instalar el SP1 (Service Pack), aquí necesitara acceso a internet ya que el proceso descargara los archivos desde ahí.

05-install sp1

06-install sp1

07-install sp1

Paso 3: Instalar el SSDT

El ultimo paso es instalar el SSDT ejecutando el archivo SSDTSetup, para dicha instalación es necesario también tener acceso a internet.

08-ssdtsetup

09-ssdtsetup

Al terminar con este proceso ya tendremos listo el SSDT para poderlo usar. Recuerde de instalar cada uno de los componentes en los mismos idiomas, por ejemplo si elige Español  debe bajar todo en dicho lenguaje.

Paso 4: Probar SSDT

Para poder verificar la correcta instalación lo que haremos son los siguientes pasos:

  1. Entrar al Visual Studio Shell desde el menú inicio –> Todos los programas –> Visual Studio 2010
  2. Creamos un nuevo proyecto y en las opciones nos debe aparecer “SQL Server Database Project”

image

Instalar el SSDT Power Tools:

Este componente adicional es muy practico y potencia aun mas el uso de SSDT agregándole funcionalidades. Les recomiendo bajarlo e instalarlo

http://visualstudiogallery.msdn.microsoft.com/9b0228c6-15d1-44de-9279-66dde12bf861

 

Integrar el SSDT con TFS:

Por defecto los proyectos de SSDT no se pueden conectar a un servidor TFS 2010 (Team Foundation Server), pero para poderlo hacer podemos seguir los siguientes pasos.

Paso 1: Instalar el Microsoft Visual Studio Team Explorer 2010

Como primer paso es necesario instalar dicho componente el cual puede descargar desde el siguiente link

http://www.microsoft.com/en-us/download/details.aspx?id=329

image

Paso 2: Reinstalar SP1

image 

image

Resumen

Ahora podemos disfrutar de esta excelente herramienta para desarrollo contra SQL Server.

Tags: ,

SQL 2012

Liberación de SQL 2012 RTM

by Maxi Accotto 10. marzo 2012 02:21

 

Ya se encuentra disponible la versión RTM (final y no beta) Sonrisa, muy buen trabajo del equipo de desarrollo, mis felicitaciones.

Los que dispongan una subscripción de MSDN o TechNet ya podrán descargar las distintas ediciones de SQL Server 2012 RTM.

Yo aquí adiciono una serie de links para descarga de mucho interés

Microsoft Drivers 3.0 for SQL Server for PHP

http://www.microsoft.com/download/en/details.aspx?id=20098

Microsoft® SQL Server® StreamInsight 2.0

http://www.microsoft.com/download/en/details.aspx?id=29070

Microsoft ®SQL Server® 2012 FileStream Driver - Windows Logo Certification

http://www.microsoft.com/download/en/details.aspx?id=29071

Microsoft® SQL Server® 2012 Semantic Language Statistics

http://www.microsoft.com/download/en/details.aspx?id=29069

Microsoft® SQL Server® 2012 Privacy Statement and End User License Agreements

http://www.microsoft.com/download/en/details.aspx?id=29067

Microsoft® SQL Server® 2012 Reporting Services Add-in for Microsoft® SharePoint® Technologies 2010

http://www.microsoft.com/download/en/details.aspx?id=29068

Microsoft® SQL Server® 2012 Report Builder

http://www.microsoft.com/download/en/details.aspx?id=29072

Microsoft® SQL Server® 2012 PowerPivot® for Microsoft® Excel® 2010

http://www.microsoft.com/download/en/details.aspx?id=29074

Microsoft® SQL Server® 2012 Performance Dashboard Reports

http://www.microsoft.com/download/en/details.aspx?id=29063

Microsoft® SQL Server® 2012 Master Data Services Add-in For Microsoft® Excel

http://www.microsoft.com/download/en/details.aspx?id=29064

Microsoft® SQL Server® 2012 Evaluation

http://www.microsoft.com/download/en/details.aspx?id=29066

Microsoft® SQL Server® 2012 Feature Pack

http://www.microsoft.com/download/en/details.aspx?id=29065

Microsoft® SQL Server® 2012 Express

http://www.microsoft.com/download/en/details.aspx?id=29062

Microsoft® SQL Server® 2012 Data Mining Add-ins for Microsoft® Office® 2010

http://www.microsoft.com/download/en/details.aspx?id=29061

Tags: ,

SQL 2012

Interesante informe de IDC sobre SQL Server 2012

by Maxi Accotto 23. febrero 2012 01:57

 

Les dejo este interesante documentode la gente de IDC sobre la nueva versión de SQL Server (SQL 2012)

Tags: ,

Noticias | SQL 2012

Maximiliano Damian Accotto