Noexpand-Hinweis für nicht unternehmerische Edition und Leistung


11

Ich muss indizierte Ansichten verwenden, um die Leistung zu erreichen. Wie ich aus dieser Vergleichstabelle ersehen kann, unterstützt die Standard Edition keine indizierten Ansichten. Aber BOL sagt:

Indizierte Ansichten können in jeder Edition von SQL Server erstellt werden. In SQL Server Enterprise berücksichtigt das Abfrageoptimierungsprogramm automatisch die indizierte Ansicht. Um eine indizierte Ansicht in allen anderen Editionen zu verwenden, muss der NOEXPAND-Tabellenhinweis verwendet werden.

So wird es funktionieren (ich spreche von Leistung)

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

auf SQL Server Standard Edition sowie es funktioniert

select * from dbo.OrderTotals

auf der Enterprise?

Hier ist Code zur Ansicht:

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)

Antworten:


13

Der Unterschied besteht darin, dass die Enterprise Edition ohne Hinweis möglicherweise nicht die indizierte Ansicht, sondern die Basistabellen verwendet.

Meine persönliche Erfahrung ist, dass SQL Server in dieser Hinsicht etwas verrückt ist. Ich muss fast immer den Hinweis verwenden: Die Abfrage ist schneller mit weitaus weniger E / A, obwohl der Plan mit einem Scan der Ansicht "schlechter" aussieht, nicht mit Indexsuchen für die Basistabellen. Und es läuft auch konsequenter

YMMV natürlich :-)

Um zu antworten, wird (sollte?) Dasselbe funktionieren, basierend auf dem, was ich gesehen habe. Andere Leute haben möglicherweise andere Erfahrungen und ich bin an anderen Antworten interessiert

Um zu vermeiden, dass der Hinweis überall verwendet wird, können Sie die indizierte Ansicht in eine andere Ansicht mit dem Hinweis einschließen: Hinweise, die sich nach innen auf alle äußeren Abfragen ausbreiten, haben automatisch NOEXPAND.


Ich habe die Meldung "Indexhinweise können nicht in einem schemagebundenen Objekt angegeben werden" erhalten, als versucht wurde, eine äußere Ansicht mit Schemabindung als select * aus OrderTotals mit (noexpand, index = IXCU_xxx) zu erstellen. :)
Garik

2
@garik: Ich hätte nur NOEXPAND, nicht den Index-Hinweis. Es gibt sowieso nur einen Index: Er ist gruppiert, also Tabellenscan =
Indexscan

keine Diskussion. geschlossen :)
Garik

Woaaa ... NOEXPAND einbetten ... Smart, luv it ...
Jérôme Verstrynge
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.