我在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'
我希望最后一次选择将使用列' name'。
的索引正如我所描述的那样,带有提示(调优)的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
我不想在执行视图时强制使用视图添加提示的最终用户 - 只需使用正确的索引提示将视图作为他的视图。 (或者,如果不可能 - 我该怎么做)。
需要样品。
谢谢:)
答案 0 :(得分:2)
我认为在Name
列上创建索引会使用索引,当从具有上面显示的where子句的视图中进行选择时,您不必显式提供任何查询提示以使该视图使用索引。 / p>
指数应该像......
<强>索引强>
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
答案 1 :(得分:1)
SqlServer中的索引由两组列构成。 在表B上创建索引IX(筛选列,排序列)INCLUDE(要包括的其他列)。
从视图中进行选择时,优化器将在引用的表中包含索引。
第一组是索引表本身。最佳做法是放置首先过滤的列,然后放置排序的列。 第二组(包含)是您添加到索引表的其他列,因此您需要的所有数据都在索引中(以防止关键查找 - 依赖于您的表设计)。
在您的情况下,订单将是 1)按名称转到MyTable2,获取所有匹配的ID。 2)使用步骤1中的Id,在Mytable1中找到匹配的ID
您的索引应该是:
1)表2(名称,ID)或表2(名称)的索引包括(ID)
2)表1(ID)的索引
在这种情况下不应该使用任何提示。 一般来说,你应该避免使用提示。