Uso de vistas indizadas para aumentar el rendimiento de una base de datos

07.12.2013 12:07
 

El uso de vistas indizadas es un recurso que puede aumentar en un porcentaje importante el rendimiento de una base de datos, veamos un ejemplo:

Supongamos que tenemos que optimizar esta query, lanzada sobre la base de datos AdventureWorksDW2012:

select productkey, spanishproductname,DimProduct.ProductSubcategoryKey, SpanishProductsubCategoryName,DimProductSubcategory .ProductcategoryKey,SpanishProductCategoryName

from dbo.DimProduct

inner join DimProductSubcategory on dimproduct.ProductSubcategoryKey=DimProductSubcategory.ProductSubcategoryKey

inner join DimProductCategory on DimProductSubcategory .ProductcategoryKey = DimProductCategory .ProductCategoryKey

Veamos ahora su plan de ejecución:

Tabla 'Worktable'. Recuento de exámenes 0, lecturas lógicas 0, lecturas físicas 0, lecturas anticipadas 0, lecturas lógicas de LOB 0, lecturas físicas de LOB 0, lecturas anticipadas de LOB 0.

Tabla 'DimProduct'. Recuento de exámenes 1, lecturas lógicas 477, lecturas físicas 0, lecturas anticipadas 0, lecturas lógicas de LOB 0, lecturas físicas de LOB 0, lecturas anticipadas de LOB 0.

Tabla 'DimProductSubcategory'. Recuento de exámenes 1, lecturas lógicas 2, lecturas físicas 0, lecturas anticipadas 0, lecturas lógicas de LOB 0, lecturas físicas de LOB 0, lecturas anticipadas de LOB 0.

Tabla 'DimProductCategory'. Recuento de exámenes 1, lecturas lógicas 2, lecturas físicas 0, lecturas anticipadas 0, lecturas lógicas de LOB 0, lecturas físicas de LOB 0, lecturas anticipadas de LOB 0.

Tiempos de ejecución de SQL Server:Tiempo de CPU = 0 ms, tiempo transcurrido = 290 ms.

Vemos ahora que el tiempo de ejecucion es de 290 ms y se han producido 477 lecturas lógicas en la tabla DimProduct.

Creamos una vista indizada con la opción schemabinding y creamos un indice sobre ella: 

create view dbo.vproductkey with schemabinding

 

as select productkey, spanishproductname,DimProduct.ProductSubcategoryKey, SpanishProductsubCategoryName,DimProductSubcategory .ProductcategoryKey,SpanishProductCategoryName

 

from dbo.DimProduct

 

inner join dbo.DimProductSubcategory on dimproduct.ProductSubcategoryKey=DimProductSubcategory.ProductSubcategoryKey

 

inner join dbo.DimProductCategory on DimProductSubcategory .ProductcategoryKey = DimProductCategory .ProductCategoryKey

go

create unique clustered index ixvprodctkey on dbo.vproductkey (productkey,ProductSubcategoryKey,ProductcategoryKey)

y el plan de ejecución resultante:


 

Tabla 'Worktable'. Recuento de exámenes 0, lecturas lógicas 0, lecturas físicas 0, lecturas anticipadas 0, lecturas lógicas de LOB 0, lecturas físicas de LOB 0, lecturas anticipadas de LOB 0.

Tabla 'DimProduct'. Recuento de exámenes 1, lecturas lógicas 477, lecturas físicas 0, lecturas anticipadas 0, lecturas lógicas de LOB 0, lecturas físicas de LOB 0, lecturas anticipadas de LOB 0.

Tabla 'DimProductSubcategory'. Recuento de exámenes 1, lecturas lógicas 2, lecturas físicas 0, lecturas anticipadas 0, lecturas lógicas de LOB 0, lecturas físicas de LOB 0, lecturas anticipadas de LOB 0.

Tabla 'DimProductCategory'. Recuento de exámenes 1, lecturas lógicas 2, lecturas físicas 0, lecturas anticipadas 0, lecturas lógicas de LOB 0, lecturas físicas de LOB 0, lecturas anticipadas de LOB 0.

(1 filas afectadas)

 Tiempos de ejecución de SQL Server:

Tiempo de CPU = 0 ms, tiempo transcurrido = 148 ms.


 

hemos conseguido reducir el tiempo de ejecucion a la mitad, pero el plan de ejecución sigue siendo el mismo. Vamos a ver si podemos mejorarlo:


 

Ejecutamos lo siguiente:

select * from dbo.vproductkey with(noexpand)

y voilà!


 

Tabla 'vproductkey'. Recuento de exámenes 1, lecturas lógicas 9, lecturas físicas 0, lecturas anticipadas 0, lecturas lógicas de LOB 0, lecturas físicas de LOB 0, lecturas anticipadas de LOB 0.

(1 filas afectadas)

 Tiempos de ejecución de SQL Server:

 Tiempo de CPU = 0 ms, tiempo transcurrido = 95 ms
 


 

Ahora si hemos reducido el tiempo de ejecución considerablemente y el plan de ejecución realiza un index seek 100%.Además hemos reducido las lecturas lógicas a 9!!

La clave está en la clausula NOEXPAND

NOEXPAND sólo se aplica a las vistas indizadas. Como ya hemos visto una vista indizada es una vista con un índice agrupado único creado en él. Si una consulta contiene referencias a columnas que estén presentes tanto en una vista indizada y en tablas de base, y el optimizador de consultas determina que el uso de la vista indizada ofrece el mejor método para ejecutar la consulta, el optimizador de consultas utiliza el índice de la vista. Esta funcionalidad se denomina coincidencia de vista indizada. El uso automático de una vista indizada por el optimizador de consultas sólo se admite en las ediciones específicas de SQL Server. Para obtener una lista de características que son compatibles con las ediciones de SQL Server, vea Características compatibles con las ediciones de SQL Server 2012.

Sin embargo, para que el optimizador considere el uso de las vistas indizadas  o utilice una vista indizada que se referencia con una sugerencia NOEXPAND, las siguientes opciones SET deben establecerse en ON.

ANSI_NULLS ANSI_WARNINGS CONCAT_NULL_YIELDS_NULL
ANSI_PADDING ARITHABORT1 QUOTED_IDENTIFIERS

SQL Server

Tablas In-Memory en Sql Server 2014 Hekaton

31.12.2013 17:56
Entre las nuevas funciones de SQL Server 2014 destaca una nueva capacidad de base de datos en memoria, cuyo nombre en código es "Hekaton". Hekaton mejora drásticamente el rendimiento y la latencia de procesamiento de las transacciones de SQL Server. Lo que es más impresionante de Hekaton...

Uso de Sql dinámico en la creación de scripts BIML (II)

26.12.2013 19:26
En el artículo anterior: https://cms.francescsanchezbi.webnode.es/news/uso-de-sql-dinamico-en-la-creacion-de-scripts-biml-i-/ hemos visto como generar sentencias en sql dinámico para generar instrucciones create table para toda una base de datos o un dataset seleccionado.  Vamos a ver ahora...

El proceso de tunning continuado de BBDD- Clustered Index Scan

21.12.2013 16:32
En una base de datos en continuo cambio y con gran número de usuarios conectados, es básico optimizar el rendimiento para conseguir una mayor velocidad de respuesta y un mayor número de conexiones concurrentes, consumiendo un mínimo de CPU. Esto implica también  un buen uso de la memoria caché...

Uso de Sql dinámico en la creación de scripts BIML (I)

14.12.2013 18:41
    Para la aceleración de muchas tareas en que se repiten determinados patrones es muy útil el uso de sql dinámico. El uso de Sql dinámico permite la rápida generación de código que puede ser aplicado en múltiples situaciones en que se ha de aplicar a muchas tablas una misma operación....

Uso de vistas indizadas para aumentar el rendimiento de una base de datos

07.12.2013 12:07
    El uso de vistas indizadas es un recurso que puede aumentar en un porcentaje importante el rendimiento de una base de datos, veamos un ejemplo: Supongamos que tenemos que optimizar esta query, lanzada sobre la base de datos AdventureWorksDW2012: select productkey,...

SQL Server 2012 Parallel Data Warehouse

06.12.2013 13:13
    SQL Server 2012 Parallel Data Warehouse con polibase, representa un avance fundamental en el procesamiento de datos que se utiliza para permitir la integración entre los almacenes de datos tradicionales y los despliegues de "Big Data". Utiliza consultas SQL estándar para acceder y...
<< 1 | 2