调整 sql 服务器 - 视图

tuning in sql server - views

我在sql服务器2012中创建了一个视图,例如:

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

我希望连接表 1 和表 2 具有正确的索引 (id),但是当我这样做时:

select * from myview
where name = 'abcd'

我希望最后一个 select 包含列 'name' 的索引。

sql 带有提示(调整)的服务器中的正确语法是什么,正如我所描述的那样,运行 做得最好?

我想强制使用索引仅用于连接目的(列 = 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

我不想强迫最终用户在执行视图时使用视图添加提示 - 只需为他提供带有适当索引提示的视图即可。 (或者,如果不可能 - 我该怎么做)。

需要样品,请。

谢谢:)

SqlServer 中的索引由两组列构建。 在 table B(筛选列、排序列)上创建索引 IX(要包含的其他列)。

并且在从视图中选择时,优化器将在引用的 table 上合并索引。

第一组是索引 table 本身。最佳做法是先放置过滤依据的列,然后放置排序依据的列。 第二组(包含)是您添加到索引 table 的附加列,因此您需要的所有数据都在索引中(以防止键查找 - 取决于您的 table 设计)。

在您的情况下,订单将是 1) 按名称转到 MyTable2,并获取所有匹配的 ID。 2) 使用步骤 1 中的 ID,在 Mytable1

中找到匹配的 ID

您的索引应该是:

1) Table2(Name,ID) 或 Table2(Name)Include(ID) 上的索引

2) Table1(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