noexpand wskazówka dotycząca edycji i wydajności niezwiązanej z przedsiębiorczością


11

Muszę użyć widoków indeksowanych, aby osiągnąć wydajność. Jak widzę z tej tabeli porównawczej edycja standardowa nie obsługuje widoków indeksowanych. Ale BOL mówi:

Widoki indeksowane można tworzyć w dowolnej edycji SQL Server. W SQL Server Enterprise optymalizator zapytań automatycznie uwzględnia widok indeksowany. Aby użyć widoku indeksowanego we wszystkich innych edycjach, należy zastosować wskazówkę dotyczącą tabeli NOEXPAND.

Więc to zadziała (mówię o wydajności)

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

w wersji SQL Server Standard, a także działa

select * from dbo.OrderTotals

na Enterprise?

Oto kod do wyświetlenia:

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)

Odpowiedzi:


14

Różnica polega na tym, że edycja Enterprise bez podpowiedzi może zdecydować, że nie będzie korzystać z widoku indeksowanego, ale zamiast tabel podstawowych.

Moje osobiste doświadczenie jest takie, że SQL Server jest w tym nieco odważny. Prawie zawsze muszę skorzystać z podpowiedzi: zapytanie jest szybsze przy znacznie mniejszej liczbie operacji we / wy, mimo że plan „wygląda” gorzej dzięki skanowi w widoku, a nie indeksowi, który szuka tabel bazowych. I działa również bardziej konsekwentnie

YMMV oczywiście :-)

Tak więc, aby odpowiedzieć, będzie (powinno?) Działać tak samo w oparciu o to, co widziałem. Inni ludzie mogą mieć różne doświadczenia i interesują mnie inne odpowiedzi

Aby uniknąć używania podpowiedzi w dowolnym miejscu, można owinąć widok indeksowany w innym widoku za pomocą podpowiedzi: podpowiedzi propagowane do wewnątrz do wszystkich zapytań zewnętrznych będą automatycznie mieć NOEXPAND.


Dostałem „Podpowiedzi indeksu nie można określić w obiekcie powiązanym ze schematem”, gdy próbowałem utworzyć widok zewnętrzny z powiązaniem schematu, jak wybierz * z OrderTotals za pomocą (noexpand, index = IXCU_xxx). :)
garik

2
@garik: Chciałbym mieć NOEXPAND, a nie wskazówkę dotyczącą indeksu. W każdym razie jest tylko jeden indeks: jest on zgrupowany, więc skanowanie tabeli = skanowanie indeksu
GB

bez dyskusji. zamknięte :)
garik

Woaaa ... osadzanie NOEXPAND ... Inteligentne,
kochanie
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.