SlideShare una empresa de Scribd logo
1 de 6
Taller Indices
Ejercicio1: OrdenaciónenIndices
Los compradores del departamento de compras de Adventure Works Cycles tienen que evaluar
la calidad de los productos que compran a los proveedores. Los compradores están especialmente
interesados en buscar productos enviados por estos proveedores con una tasa alta de rechazos.
Como se muestra en la siguiente consulta, para recuperar los datos que cumplen estos criterios
es necesario organizar la columna RejectedQty de la
tabla Purchasing.PurchaseOrderDetail en orden descendente (de mayor a menor) y la
columna ProductID en orden ascendente (de menor a mayor).
SELECT RejectedQty, ((RejectedQty/OrderQty)*100) AS RejectionRate,
ProductID, DueDate
FROM Purchasing.PurchaseOrderDetail
ORDER BY RejectedQty DESC, ProductID ASC;
El siguiente plan de ejecución para esta consulta muestra que el optimizador de consultas utilizó
un operador SORT para devolver el conjunto de resultados en el orden especificado mediante la
cláusula ORDER BY.
Si se crea un índice con columnas de clave que coincidan con las de la cláusula ORDER BY de la
consulta, se puede eliminar el operador SORT del plan de consultas y éste resulta más eficaz.
CREATE NONCLUSTERED INDEX IX_PurchaseOrderDetail_RejectedQty
ON Purchasing.PurchaseOrderDetail
(RejectedQty DESC, ProductID ASC, DueDate, OrderQty);
Cuando se ejecuta de nuevo la consulta, el plan de consultas siguiente muestra que se ha
eliminado el operador SORT y se utiliza el índice no clúster que se acaba de crear.
Ejemplo2: Indice que abarcala consulta
Crear un índice para abarcar la siguiente consulta:
SELECT AddressLine1, AddressLine2, City, StateProvinceID, PostalCode
FROM Person.Address
WHERE PostalCode BETWEEN N'98000' and N'99999';
Para abarcar la consulta, cada columna debe definirse en el índice. Aunque puede definir todas
las columnas como columnas de clave, el tamaño de clave debe ser de 334 bytes. Como la única
columna que se usa de verdad como criterio de búsqueda es la columnaPostalCode, que tiene
una longitud de 30 bytes, un mejor diseño del índice definiría PostalCode como columna de
clave e incluiría todas las demás columnas como columnas sin clave.
La siguiente instrucción crea un índice con columnas incluidas para abarcar la consulta.
CREATE INDEX IX_Address_PostalCode
ON Person.Address (PostalCode)
INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);
EjecutarConsulta.
Ejercicio3: Índices filtrados para subconjuntos de datos
La base de datos AdventureWorks2012 tiene una tabla Production.BillOfMaterials con
2679 filas. La columna EndDate solo tiene 199 filas que contienen un valor distinto de NULL y
las otras 2.480 filas contienen valores NULL. El siguiente índice filtrado atenderá consultas que
devuelven las columnas definidas en el índice y que seleccionan únicamente filas con un valor
distinto de NULL para EndDate.
CREATE NONCLUSTERED INDEX FIBillOfMaterialsWithEndDate
ON Production.BillOfMaterials (ComponentID, StartDate)
WHERE EndDate IS NOT NULL ;
GO
El índice filtrado FIBillOfMaterialsWithEndDate es válido para la consulta siguiente.Puede
mostrar el plan de ejecución de consultas para determinar si el optimizador de consultas ha
utilizado el índice filtrado.
SELECT ProductAssemblyID, ComponentID, StartDate
FROM Production.BillOfMaterials
WHERE EndDate IS NOT NULL
AND ComponentID = 5
AND StartDate > '20080101' ;
Ejercicio4: Índices filtrados para datos heterogéneos
cada uno de los productos de la tabla Production.Product está asignado a
un ProductSubcategoryID que, a su vez, está asociado a las categorías de producto Bikes,
Components, Clothing o Accessories.Estas categorías son heterogéneas porque sus valores de
columna en la tabla Production.Product no están suficientemente correlacionados.Por
ejemplo, las columnas Color, ReorderPoint,ListPrice, Weight, Class y Style tienen
características únicas para cada categoría de producto. Suponga que se realizan consultas
frecuentes de accesorios cuyas subcategorías están comprendidas entre 27 y 36 inclusive. Puede
mejorar el rendimiento de las consultas de accesorios si crea un índice filtrado en las
subcategorías de accesorios como se muestra en el ejemplo siguiente.
CREATE NONCLUSTERED INDEX FIProductAccessories
ON Production.Product (ProductSubcategoryID, ListPrice)
Include (Name)
WHERE ProductSubcategoryID >= 27 AND ProductSubcategoryID <= 36;
El índice filtrado FIProductAccessories abarca la consulta siguiente porque los resultados de
las consultas se incluyen en el índice y el plan de consulta no incluye búsquedas en una tabla
base. Por ejemplo, la expresión de predicado de la consultaProductSubcategoryID = 33 es un
subconjunto del predicado del índice filtrado ProductSubcategoryID >= 27 y
ProductSubcategoryID <= 36, las columnas ProductSubcategoryID y ListPrice del
predicado de la consulta son ambas columnas de clave del índice, y el nombre se almacena en
el nivel hoja del índice como una columna incluida.
SELECT Name, ProductSubcategoryID, ListPrice
FROM Production.Product
WHERE ProductSubcategoryID = 33 AND ListPrice > 25.00 ;
Tareas para el diseño de índices
1. Comprender las características de la propia base de datos.
2. Comprender las características de las consultas utilizadas con frecuencia.
3. Comprender las características de las columnas utilizadas en las consultas.
4. Determinar qué opciones de índice podrían mejorar el rendimiento al crear o mantener
el índice. Por ejemplo, la creación de un índice clúster en una tabla grande existente se
beneficiaría de la opción de índice ONLINE.
5. Determinar la ubicación de almacenamiento óptima para el índice. La ubicación de
almacenamiento de índices puede mejorar el rendimiento de las consultas aumentando
el rendimiento de las operaciones de E/S en disco. Por ejemplo, el almacenamiento de
un índice no clúster en un grupo de archivos que se encuentra en un disco distinto que
el del grupo de archivos de la tabla puede mejorar el rendimiento, ya que se pueden
leer varios discos al mismo tiempo.
Las siguientes directrices indican que el uso de un índice debe ser examinada de nuevo :
 Los índices no se deben utilizar en tablas pequeñas.
 Tablas que tienen frecuentes operaciones de actualización o de inserción .
 Los índices no se deben utilizar en las columnas que contienen un elevado número de valores
NULL .
 Evite crear demasiados índices en tablas que se actualizan con mucha frecuencia y
mantenga los índices estrechos, es decir, defínalos con el menor número de columnas
posible.
 Utilice un número mayor de índices para mejorar el rendimiento de consultas en tablas
con pocas necesidades de actualización, pero con grandes volúmenes de datos.
 Los índices en vistas pueden mejorar de forma significativa el rendimiento si la vista
contiene agregaciones, combinaciones de tabla o una mezcla de agregaciones y
combinaciones.
 Tenga en cuenta el orden de las columnas si el índice va a contener varias columnas. La
columna que se usa en la cláusula WHERE en una condición de búsqueda igual a (=),
mayor que (>), menor que (<) o BETWEEN, o que participa en una combinación, debe
situarse en primer lugar.
Más Ejemplos
A.Crear un índice no clúster sencillo
En el ejemplo siguiente se crea un índice no clúster en la columna VendorID de la
tabla Purchasing.ProductVendor en la base de datos AdventureWorks2012.
IF EXISTS (SELECT name FROM sys.indexes
WHERE name = N'IX_ProductVendor_VendorID')
DROP INDEX IX_ProductVendor_VendorID ON Purchasing.ProductVendor;
GO
CREATE INDEX IX_ProductVendor_VendorID
ON Purchasing.ProductVendor (VendorID);
B.Crear un índice compuesto no clúster sencillo
En el ejemplo siguiente se crea un índice compuesto no clúster en las
columnas SalesQuota y SalesYTD de la tabla Sales.SalesPerson en la base de datos
AdventureWorks2012.
IF EXISTS (SELECT name FROM sys.indexes
WHERE name = N'IX_SalesPerson_SalesQuota_SalesYTD')
DROP INDEX IX_SalesPerson_SalesQuota_SalesYTD ON Sales.SalesPerson
;
GO
CREATE NONCLUSTERED INDEX IX_SalesPerson_SalesQuota_SalesYTD
ON Sales.SalesPerson (SalesQuota, SalesYTD);
GO
C.Crear un índice no clúster único
En el ejemplo siguiente se crea un índice no clúster único en la columna Name de la
tabla Production.UnitMeasure en la base de datos AdventureWorks2012.El índice exigirá
unicidad en los datos insertados en la columna Name.
IF EXISTS (SELECT name from sys.indexes
WHERE name = N'AK_UnitMeasure_Name')
DROP INDEX AK_UnitMeasure_Name ON Production.UnitMeasure;
GO
CREATE UNIQUE INDEX AK_UnitMeasure_Name
ON Production.UnitMeasure(Name);
La consulta siguiente prueba la restricción de unicidad intentando insertar una fila con el mismo
valor que el de una fila existente.
--Verify the existing value.
SELECT Name FROM Production.UnitMeasure WHERE Name = N'Ounces';
GO
INSERT INTO Production.UnitMeasure (UnitMeasureCode, Name,
ModifiedDate)
VALUES ('OC', 'Ounces', GetDate());
El mensaje de error resultante es:
Server: Msg 2601, Level 14, State 1, Line 1

Más contenido relacionado

La actualidad más candente

Consultas en access
Consultas en accessConsultas en access
Consultas en accessVictor Hugo
 
Cuestionario tatiana
Cuestionario tatianaCuestionario tatiana
Cuestionario tatiana273325
 
Guía 04. Consultas MySQL sobre varias tablas. Composición externa - José J Sá...
Guía 04. Consultas MySQL sobre varias tablas. Composición externa - José J Sá...Guía 04. Consultas MySQL sobre varias tablas. Composición externa - José J Sá...
Guía 04. Consultas MySQL sobre varias tablas. Composición externa - José J Sá...José Ricardo Tillero Giménez
 
manejo de filtros y ordenación de datos.
manejo de filtros y ordenación de datos.manejo de filtros y ordenación de datos.
manejo de filtros y ordenación de datos.MPGaby
 
Presentacion consultas access pilarchoco
Presentacion consultas access pilarchocoPresentacion consultas access pilarchoco
Presentacion consultas access pilarchocoPily Caiza
 

La actualidad más candente (10)

Consultas
ConsultasConsultas
Consultas
 
Consultas en access
Consultas en accessConsultas en access
Consultas en access
 
Cuestionario tatiana
Cuestionario tatianaCuestionario tatiana
Cuestionario tatiana
 
Guía 04. Consultas MySQL sobre varias tablas. Composición externa - José J Sá...
Guía 04. Consultas MySQL sobre varias tablas. Composición externa - José J Sá...Guía 04. Consultas MySQL sobre varias tablas. Composición externa - José J Sá...
Guía 04. Consultas MySQL sobre varias tablas. Composición externa - José J Sá...
 
Alumno valoracion 1.1 de programacion
Alumno valoracion 1.1 de programacionAlumno valoracion 1.1 de programacion
Alumno valoracion 1.1 de programacion
 
Teoria sql
Teoria sqlTeoria sql
Teoria sql
 
manejo de filtros y ordenación de datos.
manejo de filtros y ordenación de datos.manejo de filtros y ordenación de datos.
manejo de filtros y ordenación de datos.
 
Presentacion consultas access pilarchoco
Presentacion consultas access pilarchocoPresentacion consultas access pilarchoco
Presentacion consultas access pilarchoco
 
Sillagana RAMIRO
Sillagana RAMIROSillagana RAMIRO
Sillagana RAMIRO
 
Formularios i
Formularios iFormularios i
Formularios i
 

Similar a Taller indices 01 (20)

Access Clase 02
Access Clase 02Access Clase 02
Access Clase 02
 
Indices y Vistas.pptx
Indices y Vistas.pptxIndices y Vistas.pptx
Indices y Vistas.pptx
 
INDICES EN SQL SERVER
INDICES EN SQL SERVERINDICES EN SQL SERVER
INDICES EN SQL SERVER
 
Manejo De Sentencias De Definicion
Manejo De Sentencias De DefinicionManejo De Sentencias De Definicion
Manejo De Sentencias De Definicion
 
INDEX_MySQL
INDEX_MySQLINDEX_MySQL
INDEX_MySQL
 
Ejercicio de access 2
Ejercicio de access 2Ejercicio de access 2
Ejercicio de access 2
 
Univer compu tyt
Univer compu tytUniver compu tyt
Univer compu tyt
 
Univer compu tyt
Univer compu tytUniver compu tyt
Univer compu tyt
 
Univer compu tyt
Univer compu tytUniver compu tyt
Univer compu tyt
 
Johan nuevo
Johan nuevoJohan nuevo
Johan nuevo
 
Johan nuevo
Johan nuevoJohan nuevo
Johan nuevo
 
Johan nuevo 2
Johan nuevo 2Johan nuevo 2
Johan nuevo 2
 
Tipos de consultas
Tipos de consultasTipos de consultas
Tipos de consultas
 
Tarea bd
Tarea bdTarea bd
Tarea bd
 
Ejer acces preactica
Ejer acces  preacticaEjer acces  preactica
Ejer acces preactica
 
Unidad 9y10
Unidad 9y10Unidad 9y10
Unidad 9y10
 
Consultas en access
Consultas en accessConsultas en access
Consultas en access
 
Susanasailematipos de consultas en access
Susanasailematipos de consultas en accessSusanasailematipos de consultas en access
Susanasailematipos de consultas en access
 
Mejoras en T-SQL para SQL Server 2005
Mejoras en T-SQL para SQL Server 2005Mejoras en T-SQL para SQL Server 2005
Mejoras en T-SQL para SQL Server 2005
 
Ejercicios bbdd
Ejercicios bbddEjercicios bbdd
Ejercicios bbdd
 

Taller indices 01

  • 1. Taller Indices Ejercicio1: OrdenaciónenIndices Los compradores del departamento de compras de Adventure Works Cycles tienen que evaluar la calidad de los productos que compran a los proveedores. Los compradores están especialmente interesados en buscar productos enviados por estos proveedores con una tasa alta de rechazos. Como se muestra en la siguiente consulta, para recuperar los datos que cumplen estos criterios es necesario organizar la columna RejectedQty de la tabla Purchasing.PurchaseOrderDetail en orden descendente (de mayor a menor) y la columna ProductID en orden ascendente (de menor a mayor). SELECT RejectedQty, ((RejectedQty/OrderQty)*100) AS RejectionRate, ProductID, DueDate FROM Purchasing.PurchaseOrderDetail ORDER BY RejectedQty DESC, ProductID ASC; El siguiente plan de ejecución para esta consulta muestra que el optimizador de consultas utilizó un operador SORT para devolver el conjunto de resultados en el orden especificado mediante la cláusula ORDER BY. Si se crea un índice con columnas de clave que coincidan con las de la cláusula ORDER BY de la consulta, se puede eliminar el operador SORT del plan de consultas y éste resulta más eficaz. CREATE NONCLUSTERED INDEX IX_PurchaseOrderDetail_RejectedQty ON Purchasing.PurchaseOrderDetail (RejectedQty DESC, ProductID ASC, DueDate, OrderQty); Cuando se ejecuta de nuevo la consulta, el plan de consultas siguiente muestra que se ha eliminado el operador SORT y se utiliza el índice no clúster que se acaba de crear.
  • 2. Ejemplo2: Indice que abarcala consulta Crear un índice para abarcar la siguiente consulta: SELECT AddressLine1, AddressLine2, City, StateProvinceID, PostalCode FROM Person.Address WHERE PostalCode BETWEEN N'98000' and N'99999'; Para abarcar la consulta, cada columna debe definirse en el índice. Aunque puede definir todas las columnas como columnas de clave, el tamaño de clave debe ser de 334 bytes. Como la única columna que se usa de verdad como criterio de búsqueda es la columnaPostalCode, que tiene una longitud de 30 bytes, un mejor diseño del índice definiría PostalCode como columna de clave e incluiría todas las demás columnas como columnas sin clave. La siguiente instrucción crea un índice con columnas incluidas para abarcar la consulta. CREATE INDEX IX_Address_PostalCode ON Person.Address (PostalCode) INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID); EjecutarConsulta. Ejercicio3: Índices filtrados para subconjuntos de datos La base de datos AdventureWorks2012 tiene una tabla Production.BillOfMaterials con 2679 filas. La columna EndDate solo tiene 199 filas que contienen un valor distinto de NULL y las otras 2.480 filas contienen valores NULL. El siguiente índice filtrado atenderá consultas que devuelven las columnas definidas en el índice y que seleccionan únicamente filas con un valor distinto de NULL para EndDate. CREATE NONCLUSTERED INDEX FIBillOfMaterialsWithEndDate ON Production.BillOfMaterials (ComponentID, StartDate) WHERE EndDate IS NOT NULL ; GO El índice filtrado FIBillOfMaterialsWithEndDate es válido para la consulta siguiente.Puede mostrar el plan de ejecución de consultas para determinar si el optimizador de consultas ha utilizado el índice filtrado. SELECT ProductAssemblyID, ComponentID, StartDate FROM Production.BillOfMaterials WHERE EndDate IS NOT NULL AND ComponentID = 5 AND StartDate > '20080101' ;
  • 3. Ejercicio4: Índices filtrados para datos heterogéneos cada uno de los productos de la tabla Production.Product está asignado a un ProductSubcategoryID que, a su vez, está asociado a las categorías de producto Bikes, Components, Clothing o Accessories.Estas categorías son heterogéneas porque sus valores de columna en la tabla Production.Product no están suficientemente correlacionados.Por ejemplo, las columnas Color, ReorderPoint,ListPrice, Weight, Class y Style tienen características únicas para cada categoría de producto. Suponga que se realizan consultas frecuentes de accesorios cuyas subcategorías están comprendidas entre 27 y 36 inclusive. Puede mejorar el rendimiento de las consultas de accesorios si crea un índice filtrado en las subcategorías de accesorios como se muestra en el ejemplo siguiente. CREATE NONCLUSTERED INDEX FIProductAccessories ON Production.Product (ProductSubcategoryID, ListPrice) Include (Name) WHERE ProductSubcategoryID >= 27 AND ProductSubcategoryID <= 36; El índice filtrado FIProductAccessories abarca la consulta siguiente porque los resultados de las consultas se incluyen en el índice y el plan de consulta no incluye búsquedas en una tabla base. Por ejemplo, la expresión de predicado de la consultaProductSubcategoryID = 33 es un subconjunto del predicado del índice filtrado ProductSubcategoryID >= 27 y ProductSubcategoryID <= 36, las columnas ProductSubcategoryID y ListPrice del predicado de la consulta son ambas columnas de clave del índice, y el nombre se almacena en el nivel hoja del índice como una columna incluida. SELECT Name, ProductSubcategoryID, ListPrice FROM Production.Product WHERE ProductSubcategoryID = 33 AND ListPrice > 25.00 ;
  • 4. Tareas para el diseño de índices 1. Comprender las características de la propia base de datos. 2. Comprender las características de las consultas utilizadas con frecuencia. 3. Comprender las características de las columnas utilizadas en las consultas. 4. Determinar qué opciones de índice podrían mejorar el rendimiento al crear o mantener el índice. Por ejemplo, la creación de un índice clúster en una tabla grande existente se beneficiaría de la opción de índice ONLINE. 5. Determinar la ubicación de almacenamiento óptima para el índice. La ubicación de almacenamiento de índices puede mejorar el rendimiento de las consultas aumentando el rendimiento de las operaciones de E/S en disco. Por ejemplo, el almacenamiento de un índice no clúster en un grupo de archivos que se encuentra en un disco distinto que el del grupo de archivos de la tabla puede mejorar el rendimiento, ya que se pueden leer varios discos al mismo tiempo. Las siguientes directrices indican que el uso de un índice debe ser examinada de nuevo :  Los índices no se deben utilizar en tablas pequeñas.  Tablas que tienen frecuentes operaciones de actualización o de inserción .  Los índices no se deben utilizar en las columnas que contienen un elevado número de valores NULL .  Evite crear demasiados índices en tablas que se actualizan con mucha frecuencia y mantenga los índices estrechos, es decir, defínalos con el menor número de columnas posible.  Utilice un número mayor de índices para mejorar el rendimiento de consultas en tablas con pocas necesidades de actualización, pero con grandes volúmenes de datos.  Los índices en vistas pueden mejorar de forma significativa el rendimiento si la vista contiene agregaciones, combinaciones de tabla o una mezcla de agregaciones y combinaciones.  Tenga en cuenta el orden de las columnas si el índice va a contener varias columnas. La columna que se usa en la cláusula WHERE en una condición de búsqueda igual a (=), mayor que (>), menor que (<) o BETWEEN, o que participa en una combinación, debe situarse en primer lugar.
  • 5. Más Ejemplos A.Crear un índice no clúster sencillo En el ejemplo siguiente se crea un índice no clúster en la columna VendorID de la tabla Purchasing.ProductVendor en la base de datos AdventureWorks2012. IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_ProductVendor_VendorID') DROP INDEX IX_ProductVendor_VendorID ON Purchasing.ProductVendor; GO CREATE INDEX IX_ProductVendor_VendorID ON Purchasing.ProductVendor (VendorID); B.Crear un índice compuesto no clúster sencillo En el ejemplo siguiente se crea un índice compuesto no clúster en las columnas SalesQuota y SalesYTD de la tabla Sales.SalesPerson en la base de datos AdventureWorks2012. IF EXISTS (SELECT name FROM sys.indexes WHERE name = N'IX_SalesPerson_SalesQuota_SalesYTD') DROP INDEX IX_SalesPerson_SalesQuota_SalesYTD ON Sales.SalesPerson ; GO CREATE NONCLUSTERED INDEX IX_SalesPerson_SalesQuota_SalesYTD ON Sales.SalesPerson (SalesQuota, SalesYTD); GO C.Crear un índice no clúster único En el ejemplo siguiente se crea un índice no clúster único en la columna Name de la tabla Production.UnitMeasure en la base de datos AdventureWorks2012.El índice exigirá unicidad en los datos insertados en la columna Name. IF EXISTS (SELECT name from sys.indexes WHERE name = N'AK_UnitMeasure_Name') DROP INDEX AK_UnitMeasure_Name ON Production.UnitMeasure; GO CREATE UNIQUE INDEX AK_UnitMeasure_Name ON Production.UnitMeasure(Name); La consulta siguiente prueba la restricción de unicidad intentando insertar una fila con el mismo valor que el de una fila existente. --Verify the existing value. SELECT Name FROM Production.UnitMeasure WHERE Name = N'Ounces'; GO INSERT INTO Production.UnitMeasure (UnitMeasureCode, Name, ModifiedDate) VALUES ('OC', 'Ounces', GetDate());
  • 6. El mensaje de error resultante es: Server: Msg 2601, Level 14, State 1, Line 1