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