noexpand sugerencia para edición y rendimiento no empresarial

11

Tengo que usar vistas indexadas para alcanzar el rendimiento. Como puedo ver en esta tabla de comparación , la edición estándar no admite vistas indexadas. Pero BOL dice:

Las vistas indizadas se pueden crear en cualquier edición de SQL Server. En SQL Server Enterprise, el optimizador de consultas considera automáticamente la vista indizada. Para usar una vista indizada en todas las demás ediciones, se debe usar la sugerencia de tabla NOEXPAND.

Entonces funcionará (estoy hablando de rendimiento)

select * from dbo.OrderTotals with (noexpand, index=IXCU_OrderTotals)

en la edición estándar de SQL Server, así como funciona

select * from dbo.OrderTotals

en el Enterprise?

Aquí hay un código para ver:

CREATE VIEW dbo.OrderTotals
WITH SCHEMABINDING
AS
select 
    OrderId     =   r.OrderId                   
  , TotalQty            =   SUM(r.Quantity)
  , TotalGrossConsid    =   SUM(r.Price * r.Quantity)
  , XCount      =   COUNT_BIG(*)
from dbo.Order r
group by r.OrderId

CREATE UNIQUE CLUSTERED INDEX IXCU_OrderTotals ON OrderTotals (OrderId)
Garik
fuente

Respuestas:

14

La diferencia es que la edición Enterprise sin la sugerencia puede decidir no usar la vista indexada sino las tablas base.

Mi experiencia personal es que SQL Server tiene algo de cerebro en esto. Casi siempre tengo que usar la sugerencia: la consulta es más rápida con mucho menos IO a pesar de que el plan "se ve" peor con un escaneo en la vista que no busca el índice en las tablas base. Y también funciona de manera más consistente

YMMV por supuesto :-)

Entonces, para responder, funcionará (¿debería?) Lo mismo basado en lo que he visto. Otras personas pueden tener diferentes experiencias y estoy interesado en otras respuestas

Para evitar usar la sugerencia en todas partes, puede ajustar la vista indexada en otra vista con la sugerencia: las sugerencias se propagan hacia adentro a todas las consultas externas automáticamente tendrán NOEXPAND.

gbn
fuente
Obtuve "Las sugerencias de índice no se pueden especificar dentro de un objeto vinculado al esquema" cuando intenté crear una vista externa con el enlace de esquema como select * de OrderTotals con (noexpand, index = IXCU_xxx). :)
garik
2
@garik: solo tendría NOEXPAND, no la pista del índice. De todos modos, solo hay un índice: está agrupado, por lo que el escaneo de tabla = escaneo de índice
gbn
Sin discusión. cerrado :)
garik
Woaaa ... incrustando NOEXPAND ... Inteligente, amor ...
Jérôme Verstrynge