Я постійно будую індексовані представлення на SQL Server для налаштування існуючих продуктів. Оптимізатор досить розумний, щоб використовувати індекс, якщо ви використовуєте відповідні стовпці.
Використовуючи ваш приклад, схоже, ви створили подання, але насправді не створили на ньому індекс.
if object_id(N'mytable1') is not null
drop table mytable1
if object_id(N'mytable2') is not null
drop table mytable2
go
Create table mytable1 (ID int identity(1,1), Name1 nvarchar(100))
GO
Create table mytable2 (ID int identity(1,1), Name2 nvarchar(100))
GO
insert into mytable1 values ('steve')
insert into mytable1 values ('jack')
insert into mytable1 values ('mike')
insert into mytable1 values ('ralph')
insert into mytable1 values ('simon')
insert into mytable2 values ('smith')
insert into mytable2 values ('jackson')
insert into mytable2 values ('mikaelson')
insert into mytable2 values ('montalvo')
insert into mytable2 values ('singer')
go
if object_id(N'myview') is not null
drop view myview
go
Create view myview
with schemabinding
as
select a.id, a.name1, b.name2
from dbo.mytable1 a
join dbo.mytable2 b on a.Id = b.Id
GO
select a.name1, b.name2
from mytable1 a join mytable2 b on a.Id = b.Id
GO
Оскільки в цьому поданні немає індексу, ми скануємо основні таблиці:
Але як тільки ми додамо індекс, оптимізатор може використовувати його:
CREATE UNIQUE CLUSTERED INDEX [ix_cl_names] ON [myview]
(
[name1] ASC,
[name2] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Цей спосіб належним чином використав подання:
Я не можу змінити всі мої сценарії SQL для вибору з подання замість таблиць. Я хочу створити індексовані представлення та змусити SQL Server отримувати дані з них замість таблиць.
Немає підказки чи іншого методу, щоб змусити SQL Server використовувати індексований вигляд, коли на нього не посилається запит.
Додаткова інформація (від Geoff Patterson )
Одним із додаткових моментів є те, що, хоча оптимізатор може лише в Enterprise Edition використовувати в цьому випадку індексований вигляд, може мати сенс безпосередньо посилатися на подання, використовуючи NOEXPAND
підказку, якщо вам потрібно бути 100% впевненим у використанні індексу перегляду або якщо ви хочете, щоб він використовувався в стандартній версії.
Я часто бачив запити навіть у Enterprise Edition, де оптимізатор не підбирає той факт, що індекс перегляду може бути використаний, якщо NOEXPAND
не використовується. Він частіше зустрічається зі складними запитами, але може траплятися і з простими запитами.
У Пола Уайта є одна з кращих статей, яку я читав, вивчаючи нюанси NOEXPAND
; крім простого використання індексу перегляду, підказка також може впливати на такі речі, як те, чи автоматично створюються статистичні дані щодо індексованого перегляду та оцінок кардинальності для плану.
І від Zane : Як бічна примітка, будьте обережні з індексованими поданнями, як і будь-який інший індекс, який він додасть до ваших оновлень, вставки та видалення разів.