Подсказка noexpand для некоммерческого издания и производительности


11

Я должен использовать индексированные представления для достижения производительности. Как видно из этой таблицы сравнения, стандартное издание не поддерживает индексированные представления. Но 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 без подсказки может решить не использовать индексированное представление, а базовые таблицы.

Мой личный опыт заключается в том, что SQL Server является чем-то вроде мозгов в этом. Мне почти всегда приходится использовать подсказку: запрос выполняется быстрее с гораздо меньшим количеством операций ввода-вывода, даже если план «выглядит» хуже при сканировании представления, а не при поиске индекса в базовых таблицах. И это работает более последовательно

YMMV конечно :-)

Итак, чтобы ответить, это будет (должно?) Работать так же, основываясь на том, что я видел. Другие люди могут иметь другой опыт, и я заинтересован в других ответах

Чтобы избежать использования подсказки везде, вы можете обернуть индексированное представление в другом представлении подсказкой: подсказки, распространяющиеся внутрь для всех внешних запросов, автоматически будут иметь NOEXPAND.


При попытке создать внешнее представление с привязкой к схеме, как select * from OrderTotals with (noexpand, index = IXCU_xxx), я получил сообщение «Подсказки индекса нельзя указывать в объекте, привязанном к схеме». :)
Гарик

2
@garik: у меня просто есть NOEXPAND, а не указатель индекса. В любом случае существует только один индекс: он кластеризован, поэтому сканирование таблицы = сканирование индекса
gbn

нет обсуждения закрыто :)
гарик

Ваааа ... встраивание NOEXPAND ... Умный, дорогой ...
Жером Верстринж
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.