noexpand hint per edizione non performante e performance


11

Devo usare le viste indicizzate per raggiungere le prestazioni. Come posso vedere da questa tabella di confronto, l'edizione standard non supporta le visualizzazioni indicizzate. Ma BOL dice:

Le viste indicizzate possono essere create in qualsiasi edizione di SQL Server. In SQL Server Enterprise, Query Optimizer considera automaticamente la vista indicizzata. Per utilizzare una vista indicizzata in tutte le altre edizioni, è necessario utilizzare il suggerimento per la tabella NOEXPAND.

Quindi funzionerà (sto parlando di performance)

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

su SQL Server Standard Edition e funziona

select * from dbo.OrderTotals

su quello Enterprise?

Ecco il codice per la visualizzazione:

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)

Risposte:


14

La differenza è che l'edizione Enterprise senza il suggerimento potrebbe decidere di non utilizzare la vista indicizzata ma le tabelle di base.

La mia esperienza personale è che SQL Server è piuttosto bravo in questo. Devo quasi sempre usare il suggerimento: la query è più veloce con molto meno IO anche se il piano "sembra" peggio con una scansione sulla vista che l'indice non cerca nelle tabelle di base. E funziona anche in modo più coerente

YMMV ovviamente :-)

Quindi, per rispondere, funzionerà (dovrebbe?) Lo stesso in base a ciò che ho visto. Altre persone possono avere esperienze diverse e sono interessato ad altre risposte

Per evitare di usare il suggerimento ovunque, puoi avvolgere la vista indicizzata in un'altra vista con il suggerimento: i suggerimenti si propagano verso l'interno a tutte le query esterne avranno automaticamente NOEXPAND.


Ho ottenuto "I suggerimenti sull'indice non possono essere specificati all'interno di un oggetto associato a schema" quando ho provato a creare una vista esterna con schema come selezionare * da OrderTotals con (noexpand, index = IXCU_xxx). :)
garik,

2
@garik: avrei solo NOEXPAND, non il suggerimento sull'indice. C'è comunque un solo indice: è raggruppato, quindi table scan = index scan
gbn

nessuna discussione. chiuso :)
garik

Woaaa ... incorporando NOEXPAND ... Intelligente, amore ...
Jérôme Verstrynge,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.