que acaba de comenzar buscando en la optimización de mis consultas a través de índices, porque los datos de SQL está creciendo grande y rápido. Miré cómo el optimizador está procesando mi consulta a través del plan de ejecución en SSMS y noté que se está utilizando un operador de clasificación. He oído que un operador de Sort indica un diseño incorrecto en la consulta, ya que el ordenamiento se puede realizar prematuramente a través de un índice. Así que aquí es una tabla de ejemplo y datos similares a lo que estoy haciendo:Optimización de consultas SQL mediante la eliminación de operador Clasificar en el plan de ejecución
IF OBJECT_ID('dbo.Store') IS NOT NULL DROP TABLE dbo.[Store]
GO
CREATE TABLE dbo.[Store]
(
[StoreId] int NOT NULL IDENTITY (1, 1),
[ParentStoreId] int NULL,
[Type] int NULL,
[Phone] char(10) NULL,
PRIMARY KEY ([StoreId])
)
INSERT INTO dbo.[Store] ([ParentStoreId], [Type], [Phone]) VALUES (10, 0, '2223334444')
INSERT INTO dbo.[Store] ([ParentStoreId], [Type], [Phone]) VALUES (10, 0, '3334445555')
INSERT INTO dbo.[Store] ([ParentStoreId], [Type], [Phone]) VALUES (10, 1, '0001112222')
INSERT INTO dbo.[Store] ([ParentStoreId], [Type], [Phone]) VALUES (10, 1, '1112223333')
GO
Aquí es una consulta de ejemplo:
SELECT [Phone]
FROM [dbo].[Store]
WHERE [ParentStoreId] = 10
AND ([Type] = 0 OR [Type] = 1)
ORDER BY [Phone]
creo un índice no agrupado para ayudar a acelerar la consulta:
CREATE NONCLUSTERED INDEX IX_Store ON dbo.[Store]([ParentStoreId], [Type], [Phone])
Para construir el índice IX_Store, comienzo con los predicados simples
[ParentStoreId] = 10
AND ([Type] = 0 OR [Type] = 1)
Luego añadir la columna de la [Phone]
para el ORDER BY y para cubrir la salida SELECT
lo tanto, incluso cuando el índice se construye, el optimizador todavía utiliza el operador Ordenar (y no el índice de clasificación) porque [Phone]
está ordenada según [ParentStoreId]
Y [Type]
. Si quito la columna de la [Type]
del índice y funciono con la pregunta:
SELECT [Phone]
FROM [dbo].[Store]
WHERE [ParentStoreId] = 10
--AND ([Type] = 0 OR [Type] = 1)
ORDER BY [Phone]
Entonces, por supuesto, el operador Ordenar no es utilizado por el optimizador porque [Phone]
está ordenada por [ParentStoreId]
.
Entonces, la pregunta es ¿cómo puedo crear un índice que cubra la consulta (incluido el predicado [Type]
) y que el optimizador no utilice Sort?
EDIT:
La tabla Estoy trabajando con más de 20 millones de filas
que realmente debería hacer '' una tecla [StoreID] primaria (que también a los valores predeterminados en clúster por cierto), no sólo tiene que añadir un índice único. – Lucero
Es posible que pueda solucionar este problema creando un * segundo * índice en la columna del Teléfono. –
@Lucero, que modificó mi post para marcar '[StoreID]' como la clave principal, aunque no creo que esto va a resolver el problema Ordenar – jodev