【问题标题】:tuning in sql server - views调整 sql server - 视图
【发布时间】:2015-03-24 01:21:03
【问题描述】:

我在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 中,运行得最好的正确语法是什么?

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

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

需要样品,请。

谢谢:)

【问题讨论】:

  • myTable1 和 myTable2 是什么关系?是一对多吗?
  • 一对多。我只是想知道这是什么概念,拜托。谢谢:)
  • Name 列上有索引吗?
  • 即使我有一个索引,我的查询也有大约 200 行——更复杂。我只是想知道这个概念(例如使用(index(indx_name))从myview中选择名称),作为我对下面第一个答案的评论。
  • 我更改了我原来的帖子,以便更好地理解。

标签: sql-server hint


【解决方案1】:

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

【讨论】:

  • 没有。我的意思是我想强制使用索引或连接,作为我之前的评论(比如从 myview 中选择名称 with(index(myindex_name)),但没有这样的语法。这样做的正确语法是什么?
  • 不推荐,但是你可以这样做,只需在连接子句中的表名后面使用WITH (INDEX([IX_MyTable1_Name]))
  • 是的,但我不能用它来查看,我想同时使用 IX_Name(用于视图选择 - 不知道怎么做)和 IX_ID 用于连接(或者说它是join,索引提示只针对join)。简而言之 - IX_ID 仅用于连接,而 IX_NAME 用于视图(视图的语法是什么)?
  • 我想在从视图中选择之前使用提示,因为我想按原样带来视图(它有特定的列,我想选择快速强制在它上面使用特定的索引,当选择)。然而,'select name with(index(IX_MyTable1_Name)) from myview' 不是正确的语法。
【解决方案2】:

SqlServer 中的索引由两组列组成。 在表 B 上创建索引 IX(过滤列、排序列)包括(要包括的其他列)。

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

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

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

你的索引应该是:

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

2) Table1(ID) 上的索引

在这种情况下不应该使用任何提示。 通常,您应该避免使用提示。

【讨论】:

  • 我的意思是我想强制选择带有特定索引(原始 sql 大约 100 行)。 'Select name with(index(myindex_forname)) from MyView'中的'with index()'之类的东西(myindex_forname ='name'列的索引)但没有这样的语法。此外,table1 和 table2 与 'ID' 列连接 - 如果我添加 'with (index(myindex_forid)) (myindex_forid = 'id' 列的索引)。我首先需要知道该语法 - 我没有找到正确的语法。谢谢:)
猜你喜欢
  • 2011-01-01
  • 2015-03-03
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 2011-02-16
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
相关资源
最近更新 更多