sql-server-2008 - tipos - indices clustered y nonclustered sql server
Agregar un ÍNDICE a un CTE (3)
Debería ser una pregunta bastante directa. ¿Puedo agregar un ÍNDICE a una Expresión de tabla común (CTE)?
@BH: para evitar el problema DISTINCT al usar TOP 100% o TOP 1000000, siempre puede usar GROUP BY. Sirve para el mismo propósito y algunas veces es más rápido que DISTINCT.
He tenido el mismo requisito. Los índices no se pueden agregar a un CTE. Sin embargo, en el CTE, seleccionar agregar una cláusula ORDER BY en los campos unidos redujo el tiempo de ejecución de 20 minutos o más a menos de 10 segundos.
(También debe agregar SELECT TOP 100 PERCENT para permitir un ORDER BY en una selección CTE).
[Editar para agregar una cita parafraseada de un comentario a continuación]:
Si tiene DISTINCT en el CTE, TOP 100 PERCENT no funciona. Este método engañoso está siempre disponible: sin necesidad de TOP en absoluto en la selección, modifique la instrucción ORDER BY para que lea:
ORDER BY [Blah] OFFSET 0 ROWS
No.
Un CTE es una vista temporal "en línea"; no puede agregar un índice a dicho constructo.
Si necesita un índice, cree una vista regular con el SELECTO de su CTE y conviértalo en una vista indizada (agregando un índice agrupado a la vista). Deberá obedecer un conjunto de reglas que se describen a continuación: Crear una vista indizada .