Webcast – Column Store Index en MS SQL Server 2012 RC0 (Presentación + Demos)


En el presente post, les hago entrega de cada unos de los script ejecutados en el webcast que soporta dicha intervención y a su vez, el video de la presentación.

VIDEO DE LA PRESENTACIÓN

Para poder visualizar el video de la presentación puedes verlo en linea o descargarlo ingresando al siguiente enlace previamente registrandote, vale.

La liga es: https://msevents.microsoft.com/CUI/EventDetail.aspx?culture=es-AR&EventID=1032505988&CountryCode=AR.

O, también puedes ingresar a mi SkyDrive y visuazarlo

https://skydrive.live.com/embed?cid=94D37F3228BDDD8F&resid=94D37F3228BDDD8F%213934&authkey=ALqaOoXcPtxXsNk

A continuación, les emito los scripts de las demos ejecutadas durante la presentación.

SCRIPT DE LAS DEMOS

Bases de datos utilizadas:

  • AdventureWorks2008R2
  • AdventureWorksDWDenali

DEMO 1 – Creación de un índice columnar.

1_CreacionCSI01

— Ejemplo 01 “Script”

USE [AdventureWorksDWDenali]
GO

CREATE NONCLUSTERED COLUMNSTORE INDEX
    [IXC_Ejemplo01] ON [dbo].[FactInternetSales]  — Tabla FactInternetSales
(
    [ProductKey],
    [OrderDateKey],
    [CustomerKey],
    [SalesTerritoryKey],
    [TotalProductCost],
    [SalesAmount],
    [TaxAmt],
    [OrderDate]
)
    WITH
        (DROP_EXISTING = OFF)
            ON [PRIMARY]
GO

DEMO 2 – Optimización de una consulta con Column Store Index – ‘CSI’.

2_1_OptimizacionCreacionCSI01

USE [AdventureWorksDWDenali]
GO

— Ejemplo 02 “Script”

CREATE NONCLUSTERED COLUMNSTORE INDEX
    [IXC_Ejemplo02]
        ON [dbo].[FactResellerSales] — Tabla FactResellerSales
(
    [ProductKey],
    [OrderDateKey],
    [EmployeeKey],
    [SalesTerritoryKey],
    [OrderQuantity],
    [UnitPrice],
    [ExtendedAmount],
    [TotalProductCost],
    [SalesAmount],
    [TaxAmt],
    [OrderDate]
)
WITH
    (DROP_EXISTING = OFF)
        ON [PRIMARY]
GO

————————————————————————————————————–

2_2_OptimizacionEjecucionCSI02

USE AdventureWorksDWDenali;
GO

SELECT       
    d.CalendarYear,
    d.CalendarQuarter,
    COUNT(*) AS NumberSold
FROM 
    dbo.FactResellerSales AS f
         JOIN
    dbo.DimDate AS d
            ON f.OrderDateKey = d.DateKey 
WHERE       
    (f.ProductKey = 215)
GROUP BY
    d.CalendarYear,
    d.CalendarQuarter
ORDER BY
    d.CalendarYear,
    d.CalendarQuarter
GO

DEMO 3 – CSI en acción.

3_1_CSIenAccion01

— Validamos la base de datos de trabajo

USE [AdventureWorks2008R2]
GO

— Creamos una nueva tabla

CREATE TABLE [dbo].[MySalesOrderDetail](
    [SalesOrderID] [int] NOT NULL,
    [SalesOrderDetailID] [int] NOT NULL,
    [CarrierTrackingNumber] [nvarchar](25) NULL,
    [OrderQty] [smallint] NOT NULL,
    [ProductID] [int] NOT NULL,
    [SpecialOfferID] [int] NOT NULL,
    [UnitPrice] [money] NOT NULL,
    [UnitPriceDiscount] [money] NOT NULL,
    [LineTotal] [numeric](38, 6) NOT NULL,
    [rowguid] [uniqueidentifier] NOT NULL,
    [ModifiedDate] [datetime] NOT NULL)
ON [PRIMARY]
GO

— Creamos un índice clustered

CREATE CLUSTERED INDEX [PKN_SalesOrderDetailID]
    ON [dbo].[MySalesOrderDetail]
        ([SalesOrderDetailID])
GO

— Generamos data de ejemplo para poblar la data. La misma puede
— demorar algunos minutos dependiendo de nuestro sistema.

INSERT INTO
    [dbo].[MySalesOrderDetail]
    (
    [SalesOrderID],
    [SalesOrderDetailID],
    [CarrierTrackingNumber],
    [OrderQty],
    [ProductID],
    [SpecialOfferID],
    [UnitPrice],
    [UnitPriceDiscount],
    [LineTotal],
    [rowguid],
    [ModifiedDate]   
    )
SELECT
    [SalesOrderID],
    [SalesOrderDetailID],
    [CarrierTrackingNumber],
    [OrderQty],
    [ProductID],
    [SpecialOfferID],
    [UnitPrice],
    [UnitPriceDiscount],
    [LineTotal],
    [rowguid],
    [ModifiedDate]   
FROM
    [Sales].[SalesOrderDetail]
GO 100

————————————————————————————————————–

3_2_CSIenAccion02

— Ahora hacemos las pruebas de rendimiento. Hemos habilitado la
— opción STATISTICS IO ON para medir la cantidad de IO
— (Actividad de disco consumida por el código T-SQL mostrando
— información estadistica) después de generar la consulta de prueba.

— 1ra. Prueba: Se ejecuta la consulta con índice normal validando el
    — consumo de tiempo que genero en traernos la data.
    — Tomamos nota al respecto.
— 2da. Prueba: Ejecutamos la consulta con índice de almacén columnar
    — y medido el tiempo de IO que se ha consumido.

— Validamos la base de datos de trabajo

USE [AdventureWorks2008R2]
GO

— Establecemos la opción STATISTICS IO en ON.

SET STATISTICS IO ON
GO

— La prueba que vamos a validar aquí es con un índice normal.

SELECT
    [ProductID],
    SUM([UnitPrice]) AS SumUnitPrice,
    AVG([UnitPrice]) AS AVGUnitPrice,
    SUM([OrderQty]) AS SumOrderQty,
    AVG([OrderQty]) AS AVGOrderQty
FROM
    [dbo].[MySalesOrderDetail]
GROUP BY
    [ProductID]
ORDER BY
    [ProductID]
GO

————————————————————————————————————–

3_3_CSIenAccion03

— Validamos la base de datos de trabajo

USE [AdventureWorks2008R2]
GO

— Establecemos la opción STATISTICS IO en ON.

SET STATISTICS IO ON
GO

— Creamos el índice de almacenamiento columnar

CREATE NONCLUSTERED COLUMNSTORE INDEX
    [IXC_MySalesOrderDetail]
        ON [MySalesOrderDetail]
            ([UnitPrice], [OrderQty], [ProductID])
GO

— La prueba que vamos a validar aquí es con un índice columnar.

SELECT
    [ProductID],
    SUM([UnitPrice]) AS SumUnitPrice,
    AVG([UnitPrice]) AS AVGUnitPrice,
    SUM([OrderQty]) AS SumOrderQty,
    AVG([OrderQty]) AS AVGOrderQty
FROM
    [dbo].[MySalesOrderDetail]
GROUP BY
    [ProductID]
ORDER BY
    [ProductID]
GO

— Ahora veamos los resultados en los mensajes respectivos de cada query
— Despúes veamos cada Plan de Ejecución de Consulta haber que nos
— muestra.

————————————————————————————————————–

4_LimpiezaEscenario

USE AdventureWorks2008R2
GO

DROP INDEX [IXC_MySalesOrderDetail]
    ON [dbo].[MySalesOrderDetail]
GO

TRUNCATE TABLE [dbo].[MySalesOrderDetail]
GO

DROP TABLE [dbo].[MySalesOrderDetail]
GO

————————————————————————————————————–

Espero que les sea de mucha utilidad el presente post y les ayude a desarrollar ampliamente los tópicos y conceptos tratados en la presente exposición.

Nos pillamos en una próxima, vale.