SQL Server - Indice ideal

 
Vista:

Indice ideal

Publicado por Rogelio (9 intervenciones) el 13/07/2017 23:36:01
Saludos colegas: Utilizo SQL Server 2008 R2. Tengo un Stored Procedure el cual realiza una consulta grande, 30 campos en el SELECT, 11 tablas en el FROM con JOIN's, más dos vistas también en el FROM y 4 campos en el WHERE con algunas variables de tipo tabla de este modo:

AND (@Emisor IS NULL OR A.emisor IN (SELECT emisor FROM @tEmisor))

El caso es que he leido tutoriales de microsoft y entiendo el concepto, pero no hablan de consultas tan grandes, los ejemplos que vienen son pequeños, como éste:

Crear un índice no clúster sencillo

El ejemplo siguiente crea un índice no clúster en la columna BusinessEntityID de la tabla Purchasing.ProductVendor.

1
2
3
4
5
6
7
8
9
USE AdventureWorks2008R2;
GO
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 (BusinessEntityID);
GO

No puedo usar el "Analyze Query in Database Engine Tuning Advisor" porque aquí dónde trabajo tienen restringidas algunas herramientas de la consola de SQL Server. He creado índices antes, pero según lo que leo en las páginas de Microsoft, si no creas el o los índices de forma adecuada según la consulta, puede ser que en vez de mejorar el performance suceda todo lo contrario.

Por lo que solicito de su ayuda para crear el o los índices más recomendables para una consulta como esta.

Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

Indice ideal

Publicado por Isaias (4558 intervenciones) el 14/07/2017 22:18:21
Hola Rogelio

2008, es una version obsoleta, fuera de soporte por parte de Microsoft

El crear un indice, no es cuestion de "magia" o de "adivinanza", se deben revisar algunos otras cosas como PLANES DE EJECUCION, asi como dejar de utilizar codigo antiguo.

Explico el siguiente codigo

A.emisor IN (SELECT emisor FROM @tEmisor))

Si en emisor tuviera 20 millones de registros y en el subselect tiene otros 20 millones de registros, debe multiplicar 20x20 (MILLONES) y esas serian las lecturas que haria hacia su base de datos.

¿Es logico?

No, porque el IN, ya se volvio obsoleto, ahora existe EXISTS o NOT EXISTS, que es 100% mas eficiente.

Recuerde que indice clustered, solo puede tener UNO, aunque sea compuesto
Indices no clustered, puede tener varios, incluso compuestos

Por aqui andaremos para cualquier comentario adicional
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar