Тюнинг в sql server - просмотры

Я создал представление в SQL Server 2012, например:

create myview as
select mytable2.name
from mytable1 t1
join myTable2 t2
on t1.id = t2.id

Я хочу, чтобы соединения table1 и table2 были с правильным индексом (id), но когда я это сделаю:

select * from myview
where name = 'abcd'

Я хочу, чтобы последний выбор был с индексом столбца "имя".

Какой правильный синтаксис в SQL Server с подсказками (настройка), которые лучше всего работают, как я описал?

Я хочу принудительно использовать индекс только для целей соединения (column = id) и форсировать имя индекса при выполнении:

select name from myview 
where name = 'abcd'.

Что-то вроде

create myview as
select mytable2.name
/* index hint name on  column name */
from mytable1 t1
join myTable2 t2
/* index hint name on  column id - just for join */
on t1.id = t2.id

Я не хочу заставлять конечного пользователя, который использует подсказку добавления представления, делать представление - просто принесите ему представление как его с надлежащими указателями индекса. (или, если это невозможно - как я могу это сделать).

Нужны образцы, пожалуйста.

Спасибо:)

2 ответа

Решение

Индексы в SqlServer построены из двух наборов столбцов. Создайте индекс IX в таблице B (Фильтровать столбцы, Сортировка столбцов) ВКЛЮЧИТЬ (дополнительные столбцы должны быть включены).

А при выборе из представлений оптимизатор будет включать индексы в ссылочных таблицах.

Первый набор - это сама таблица индексации. Рекомендуется размещать столбцы, по которым вы сначала фильтруете, а затем столбцы, по которым вы сортируете. Второй набор (Включить) - это дополнительные столбцы, которые вы добавляете в таблицу индексации, поэтому все данные, которые вам требуются, находятся в индексе (чтобы избежать поиска ключей - в зависимости от дизайна таблицы).

В вашем случае, порядок будет 1) Перейдите к MyTable2 по имени и получите все соответствующие идентификаторы. 2) С помощью идентификаторов из шага 1 найдите соответствующие идентификаторы в Mytable1

Ваши индексы должны быть:

1) Индекс в Таблице 2(Имя,ID) или Таблице 2(Имя) Включить (ID)

2) Индекс в Таблице 1(ID)

В этом случае не должно быть никаких подсказок. И вообще, вы должны избегать использования подсказок.

Я считаю, что создание индекса на Name В столбце будет использоваться индекс, при выборе из представления с приведенным выше предложением where вам не нужно явно указывать какие-либо подсказки запроса, чтобы это представление использовало индекс.

Индекс должен быть что-то вроде...

Индекс

CREATE NONCLUSTERED INDEX [IX_MyTable1_Name] 
ON [dbo].[myTable2] ([CompanyName] ASC)
GO

Посмотреть определение

CREATE VIEW myview 
 AS
SELECT t2.name  --<-- Use alias here since you have alised your table in from clause
FROM mytable1 t1
INNER JOIN myTable2 t2 ON t1.id = t2.id
Другие вопросы по тегам