Muchos clientes se quejan de consultas lentas, para ello os voy a dar unas guías básicas como una e-pildora que ampliaré en vista de la utilidad y éxito ahora que tengo un ratito más:
Para acelerar las consultas en SQL Server y en cualquier motor de base de datos debemos usar apropiadamente los índices
Las columnas que se aconseja indexar son:
– Las que son clave primaria o ajena
– Aquellas que se usan frecuentemente en búsquedas de rangos de valores con BETWEEN
– Aquellas que se usan frecuentemente en ordenaciones con ORDER BY
– Aquellas que se usan frecuentemente en cruces de tabla o JOIN
– Aquellas que se usan frecuentemente en agrupaciones con GROUP BY
Tampoco se trata señores de ponerse a indexar todos los campos! No es oro todo lo que reluce pues penalizará el rendimiento de la base de datos
en las inserciones , actualizaciones y borrados por la cantidad de índices a mantener. De lo que se trata es de seleccionar las consultas que más se usan en nuestra aplicación todos los días y coger las más importantes y fijarse en la parte WHERE.
Es importante indicar que no merece la pena indexar campos con pocos valores como true, false, o 1,2,3 por ejemplo porque tienen poca selectividad y
una alta densidad de valores habitualmente. También decir que solo puede haber un índice agrupado por tabla y hasta 249 índices no agrupados.
Hay otras consideraciones que se deben tener en cuenta como consultar el Plan de Ejecución de la consulta CTRL+L en el QueryAnalizer, os comento algunas más aunque alguno se ha adelantado 😉
– Usar procedimientos almacenados
– Usar la opción FILLFACTOR al crear el indice para envitar divisiones de página en las modificaciones si nuestra base de datos sufre muchas modificaciones.
– Usar DBCC SHOWCONTIG para ver la fragmentación de un índice y ver si merece la pena desfragmentarlo con DBCC INDEXDEFRAG
– Usar la opción WITH DROP EXISTING al crear el indice para no tener que eliminarlo y volver a crearlo
Os pongo algunas sentencias de ejemplo ilustrativas sobre la archiconocida NorthWind que seguro ayudarán a más de uno:
USE Northwind
DBCC SHOWCONTIG (nombre tabla,indice)
DBCC INDEXDEFRAG(credit, member, mem_no_CL)
USE ClassNorthwind
CREATE INDEX OrderID_ind
ON Orders(OrderID)
WITH PAD_INDEX, FILLFACTOR=10
Para encontrar duplicados antes de crear un índice único sobre la tabla products
SELECT ProductName, COUNT(ProductName) AS ‘# of Duplicates’
FROM Northwind.dbo.Products
GROUP BY ProductName
HAVING COUNT(ProductName)>1
ORDER BY ProductName
Creación del índice no agrupado único compuesto sobre 2 campos
Use ClassNorthwind
CREATE UNIQUE NONCLUSTERED INDEX U_LastName_FirstName
ON Employees (LastName, FirstName)
Para ver la fragmentación sobre la tabla member:
DBCC SHOWCONTIG (‘member’)
Para ver los índices y restricciones y espacio ocupado por los datos y por los índices:
USE Northwind
EXEC sp_helpindex Customers
EXEC sp_help Customers
EXEC sp_spaceused products
Saludos
Sergio Vázquez
http://www.pangeaes.com/mutisdotnet