在 SQL Server 2008 中将两个表合并到一个索引视图中

Posted

技术标签:

【中文标题】在 SQL Server 2008 中将两个表合并到一个索引视图中【英文标题】:Merge two tables into a single indexed view in SQL Server 2008 【发布时间】:2015-03-13 18:43:04 【问题描述】:

所以这是我的困境,我目前将所有记录存储到一个巨大的平面表中,其中包含电影、剧集、系列、游戏等。70% 的记录是我不希望默认完整索引的剧集-文本目录,因为它们构成了超过 200 万条记录,并且 90% 的时间人们都在搜索电影/连续剧,所以我想将这些记录移动到一个单独的表中,这样他们就可以拥有自己单独的全文目录和一些额外的列也不适用于电影/系列(季节、剧集 # 等)。

我的问题在于,在我去下载数据或更新该 ID 的数据之前,我用来检查表中是否存在 ID 的存储过程。

我想为两个表中的所有 ID 创建一个视图,这样如果该 ID 存在,我就可以在一个地方查找,但是当我尝试合并这些表时,它不允许我在视图上创建索引。

ID          Type      |     ID          Type
1           movie     |     2           episode
3           movie     |     4           episode
5           movie     |     6           episode

ID 是唯一的,不会在任一表中重复。

我觉得由于这个视图将有超过 200 万条记录,因此索引可能很重要,因为它每秒调用超过 250-500 条以上,因此优化是一个重要因素。

有没有比使用 UNION ALL 将 ID 的 1、2、3、4、5、6 放入单个视图更好的方法?

【问题讨论】:

有人建议的一个“hack”是创建联合视图的第二个视图并将我的索引放在上面... 您不能将索引放在从未编入索引的视图中选择的视图上,所以我认为这行不通。 @TabAlleman 这很烦人!我想我唯一的选择是每次都在两个表中查找 ID。 也许你可以交叉连接表并合并列;我不知道在索引视图中是否允许这样做。 【参考方案1】:

您最好的解决方案可能是创建一个执行 UNION ALL 的两个表的视图,但不要尝试为视图建立索引,而是确保您在表本身上实施了良好的索引策略。

您可以在视图中使用索引提示来强制视图在有人从视图中选择时使用这些索引。

【讨论】:

两个表的主索引是 ID (int) 列,但它也是一个聚集索引,我必须每隔一天手动重建/优化。 您需要一个索引来覆盖视图查询中最常用作 sargs 的列。如果那是 ID,那么您已经设置好了。您可能不会从索引视图中获得更好的性能。如果特定查询运行缓慢,请检查执行计划并查看是否正在使用索引,或者是否正在进行表扫描。 我对提示不是很熟悉,我用 NOEXPAND 提示查找了另一个视图,它显示了按日期更新的记录总数......没有那个 NOEXPAND,查找非常慢。

以上是关于在 SQL Server 2008 中将两个表合并到一个索引视图中的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server 2008 中将行切换到列,反之亦然

sql server 2008中“Merge”子句的性能如何?

在 SQL Server 2008 R2 中将 varchar 转换为时间戳

如何在 sql server 2008r2 中将行名更改为列名

如何在SQL Server中合并两个表

如何在 SQL Server 2008 中通过单个查询更新两个表 [重复]