Sha*_*ehr 8 index sql-server view union
我有一个大表(数千万到数亿条记录),出于性能原因,我们将其拆分为活动表和存档表,使用直接字段映射,并每晚运行存档过程。
在我们代码的几个地方,我们需要运行结合活动表和存档表的查询,几乎总是由一个或多个字段过滤(我们显然在两个表中都放置了索引)。为方便起见,有一个这样的视图是有意义的:
create view vMyTable_Combined as
select * from MyTable_Active
union all
select * from MyTable_Archive
Run Code Online (Sandbox Code Playgroud)
但是如果我运行一个查询
select * from vMyTable_Combined where IndexedField = @val
Run Code Online (Sandbox Code Playgroud)
它将在过滤之前对Active 和 Store 中的所有内容进行联合@val
,这会降低性能。
@val
在创建联合之前,是否有任何巧妙的方法可以让联合的两个子查询查看每个过滤器?
或者,您可能会建议使用其他一些方法来实现我的目标,即一种简单有效的方法来获取由索引字段过滤的联合记录集?
编辑:这是执行计划(您可以在这里看到真实的表名):
奇怪的是,活动表实际上使用了正确的索引(加上 RID 查找?)但存档表正在执行表扫描!
对该问题的评论表明,问题在于 OP 用于开发查询的测试数据库与生产数据库具有完全不同的数据特征。它的行要少得多,而且用于过滤的字段选择性不够。
当列中不同值的数量太小时,索引可能没有足够的选择性。在这种情况下,顺序表扫描比索引查找/行查找操作便宜。通常,表扫描会大量使用顺序 I/O,这比随机访问读取快得多。
通常,如果查询将返回超过百分之几的行,那么仅执行表扫描比索引查找/行查找或大量使用随机 I/O 的类似操作更便宜。