1.在视图上使用非聚集索引
视图上的非聚集索引可提供更好的查询性能。与表上的非聚集索引类似,视图上的非聚集索引可提供更多选项,供查询优化器在编译过程中选择。例如,如果查询包含聚集索引所未涉及的列,那么优化器可在计划中选择一个或多个辅助索引,避免对索引视图或基表进行费时的完全扫描。
对架构添加索引会增加数据库的开销,因为索引需要持续的维护。在索引数量和维护开销问寻求适当的平衡点时,应谨慎权衡。
2.在查询优化器中使用索引视图
SQL Server查询优化器自动决定何时对给定的查询执行使用索引视图。不必在查询中直接引用视图以供优化器在查询执行计划中使用。所以,现有的应用程序可运用索引视图,而不用更改应用程序本身。
查询优化器通过考虑几个条件来决定索引视图能否涵盖整个或部分查询。这些条件对应查询中的一个FROM子句并由下列这几个部分组成:
(1)查询FROM子句中的表必须是索引视图FROM子句中的表的超集。
(2)查询中的连接条件必须是视图中的连接条件的超集。
(3)查询中的聚合列必须可从视图中的聚合列的子集派生。
(4)查询选择列表中的所有表达式必须可从视图选择列表或未包含在视图定义中的表派生。
(5)如果与其他谓词所匹配的行的超集相匹配,那么该谓词将归入另一个谓词。例如,“T.a=10”归入“T.a=10 and T.b=20”。任何谓词都可归入其自身。视图中限制表值的那部分谓词必须归入查询中限制相同表的那部分谓词。此外,必须以SQL Server可验证的方式实现这一点。
(6)属于视图定义中的表的查询搜索条件谓词的所有列必须出现在下列视图定义的一项或多项中:①一个GROUP BY列表。②视图选择列表(如不存在GROUP BY)。③视图定义中相同或等价的谓词。情况①和②允许SQL Server对视图的列应用查询谓词,以便进一步限制视图的列。情况③比较特殊,它不需要对列进行筛选,因此该列不必出现在视图中。如果查询不包含一个FROM子句(子查询、派生表、UNION),优化器可能选择几个索引视图来处理查询,并将它们应用到不同FROM子句。
3.使用NOEXPAND视图提示(www.xing528.com)
当SQL Server处理按名称引用视图的查询时,视图的定义只有在仅引用基表时才会被正常扩展。这个过程称为视图扩展。其属于一种宏扩展形式。
NOEXPAND视图提示可强制查询优化器将视图视为带有聚集索引的普通表。其可防止视图扩展。只有在FROM子句中直接引用索引视图,才会应用NOEXPAND提示。例如:
SELECT Column1,Column2,...FROM Tablel,View1
WITH(NOEXPAND)WHERE…
4.使用EXPAND VIEWS查询提示
处理按名称引用视图的查询时,除非对视图引用添加NOEXPAND提示,否则SQL Server总会扩展视图。该提示会尝试匹配索引视图和扩展查询,除非在查询末尾的一个OPTION子句中指定EXPAND VIEWS查询提示。例如,假设数据库中有一个索引视图View1,以下,根据其逻辑定义(其CREATE VIEW语句)对View1进行了扩展,然后EXPANDVIEWS选项会阻比在计划中使用View1的索引视图来解析该查询。使用语句如下:
SELECT Column1,Column2,…FROM Tablel,View1
WHERE…
OPTION(EXPAND VIEWS)
如要确保让SQL Server通过从查询所引用的基表直接访问数据来处理该查询,而不必访问索引视图,那么可使用EXPAND VIEWS。在某些情况下,EXPAND视图有助于消除因使用索引视图而导致的锁争用。在测试应用程序时,NOEXPAND和EXPAND VIEWS都可帮助用户在使用和不使用索引视图的情况下进行性能评估。对数据库系统确定一组适当的索引可能很复杂。如果在设计一般索引时需要考虑众多可能性,那么对架构添加索引视图会大幅提高设计和潜在结果的复杂性。例如,索引视图可用于:(1)查询中引用的表的任何子集。(2)该表子集的查询中的条件的任何子集。(3)组合的列。(4)聚合函数(比如:SUM)。
在SQL数据库中,视图是其中一大关键对象,它从本质上来说是一种数据表虚拟化的表现形式。通常情况下,SQL数据库下的视图分为三种形式,即分区视图、标准视图和索引视图。其中分区视图对于分布式数据表查询效率的提高有着重要的作用,在对整个SQL数据库的效率进行提高的过程中应该格外注重这一点,可以在预先各个区域的服务器成寻中存储代表其区域仓库信息的Warehouse表,从而促使此区域的查询业务不会受到外部区域服务器的信号影响,并且有效的提升此区域仓库信息的查询效率。尤其要强调的是,随着现阶段数据库处理系统逐步向多元化、集成化发展的情况下,终端用户在对一些数据库进行信息查询时,通常需要对包括此区域仓库信息在内的两个或者多个仓库信息进行访问,因此在把仓库划分为多个区域的作业过程中,要对各个仓库区域的ID信息进行差异性的定义,帮助用户在查询分区的时候可以根据ID进行判定,从而达到高效整合的动态合并查询的目的。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。