Тюнинг в 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