비 엔터프라이즈 판 및 성능에 대한 비 확장 힌트


11

성능을 얻으려면 인덱싱 된 뷰를 사용해야합니다. 이 비교표 에서 볼 수 있듯이 Standard Edition은 인덱싱 된 뷰를 지원하지 않습니다. 그러나 BOL은 말합니다.

인덱싱 된 뷰는 모든 버전의 SQL Server에서 만들 수 있습니다. SQL Server Enterprise에서 쿼리 최적화 프로그램은 인덱싱 된 뷰를 자동으로 고려합니다. 다른 모든 에디션에서 인덱싱 된 뷰를 사용하려면 NOEXPAND 테이블 힌트를 사용해야합니다.

작동합니다 (성능에 대해 이야기하고 있습니다)

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

SQL Server Standard Edition 및 작동

select * from dbo.OrderTotals

엔터프라이즈 하나?

보기 코드는 다음과 같습니다.

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)

답변:


14

차이점은 힌트가없는 Enterprise Edition은 인덱싱 된 뷰를 사용하지 않고 기본 테이블을 대신 사용하기로 결정할 수 있다는 것입니다.

내 개인적인 경험은 SQL Server가 다소 두뇌 적이라는 것입니다. 필자는 항상 힌트를 사용해야합니다. 기본 테이블에서 인덱스를 찾지 않는 뷰를 스캔하면 계획이 "보이지"않더라도 훨씬 적은 IO로 쿼리가 더 빠릅니다. 더 일관되게 실행됩니다.

물론 YMMV :-)

그래서 대답하자면, 내가 본 것에 따라 동일하게 작동해야합니다. 다른 사람들은 경험이 다를 수 있으며 다른 답변에 관심이 있습니다.

어디에서나 힌트를 사용하지 않으려면 힌트로 다른 뷰에서 인덱싱 된 뷰를 래핑 할 수 있습니다. 힌트는 모든 외부 쿼리로 안쪽으로 전파되어 NOEXPAND를 자동으로 갖습니다.


orderTotals with (noexpand, index = IXCU_xxx)와 같은 스키마 바인딩을 사용하여 외부 뷰를 만들려고 할 때 "스키마 바인딩 객체 내에 인덱스 힌트를 지정할 수 없습니다"라는 메시지가 나타납니다. :)
garik

2
@ garik : 인덱스 힌트가 아닌 NOEXPAND 만 있습니다. 어쨌든 하나의 인덱스 만 있습니다 : 클러스터되어 있으므로 테이블 스캔 = 인덱스 스캔
gbn

토론이 없습니다. 휴관일 :)
garik

Woaaa ... NOEXPAND 포함 ... 똑똑하고, luv it ...
Jérôme Verstrynge
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.