noexpand натяк на видання та продуктивність, що не входить до програми


11

Мені доводиться використовувати індексовані представлення для досягнення продуктивності. Як я бачу з цієї таблиці порівняння, стандартне видання не підтримує індексовані види. Але BOL каже:

Проіндексовані представлення можна створити в будь-якому виданні SQL Server. У SQL Server Enterprise оптимізатор запитів автоматично враховує індексований вигляд. Щоб використовувати індексований вигляд у всіх інших виданнях, слід використовувати підказку таблиці NOEXPAND.

Так буде працювати (я кажу про ефективність)

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

на стандартній версії SQL Server, а також вона працює

select * from dbo.OrderTotals

на Enterprise One?

Ось код для перегляду:

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 є дещо розумовим у цьому. Мені майже завжди доводиться використовувати підказку: запит швидше з набагато меншим IO, хоча план "виглядає" гірше, коли сканування на поданні не шукає індексу в базових таблицях. І це працює також більш послідовно

YMMV звичайно :-)

Отже, щоб відповісти, вона (повинна?) Працює так само, базуючись на тому, що я бачив. Інші люди можуть мати різний досвід, і мене цікавлять інші відповіді

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


Я отримав "Підказки підказки не можна вказати в об'єкті, пов'язаному зі схемою", коли намагався створити зовнішній вигляд із прив'язкою до схеми як select * з OrderTotals з (noexpand, index = IXCU_xxx). :)
garik

2
@garik: Я просто маю NOEXPAND, а не натяк на індекс. Так чи інакше, є лише один індекс: він згрупований, тому сканування таблиці = сканування індексу
gbn

ніякої дискусії. закрито :)
garik

Woaaa ... вбудовування NOEXPAND ... Розумний, любе це ...
Jérôme Verstrynge
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.