在sql server中调优 - 视图

时间:2015-01-25 12:30:44

标签: sql-server hint

我在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

我不想在执行视图时强制使用视图添加提示的最终用户 - 只需使用正确的索引提示将视图作为他的视图。 (或者,如果不可能 - 我该怎么做)。

需要样品。

谢谢:)

2 个答案:

答案 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)的索引

在这种情况下不应该使用任何提示。 一般来说,你应该避免使用提示。