解决位图筛选器选择性问题

通过先删除查询计划中不合格的行,位图筛选可显著提高使用星型架构的数据仓库查询的性能。 这会减少通过联接运算符和所有后续运算符传递的行,从而减少查询响应时间。 在 SQL Server 2008 中,可在优化后将位图筛选引入查询计划,也可在生成查询计划期间通过查询优化器动态引入位图筛选。 当动态引入筛选器时,此筛选器即被称为“已优化的位图筛选器”。 有关位图筛选的详细信息,请参阅通过位图筛选优化数据仓库查询性能

仅当位图筛选器变为非选择性时才会出现特定于位图筛选的性能问题。 非选择性位图筛选器会在查询处理过程中造成不必要的开销而不是提高性能,从而会使查询的执行速度更加缓慢。

诊断和解决非选择性位图筛选器问题

若要诊断和解决与非选择性位图筛选器相关的查询性能问题,请执行下列步骤:

  1. 识别导致出现性能问题的查询。

    使用 SQL Server Profiler帮助识别速度缓慢的查询。 有关详细信息,请参阅使用 SQL Server Profiler。 也可以通过产生显示计划(该显示计划可以为文本、XML)或查询优化器生成的查询执行计划的图形表示形式,分析查询性能。 有关详细信息,请参阅 SET SHOWPLAN_TEXT (Transact-SQL)XML 显示计划显示图形执行计划 (SQL Server Management Studio)

  2. 验证查询是否使用位图筛选器。

    可使用 sys.dm_exec_query_plansys.dm_exec_query_stats (Transact-SQL) 捕获查询计划来验证查询是否实际使用了位图筛选器。 或者,也可以在查询的 XML 显示计划或图形执行计划中查找位图筛选器。 有关详细信息,请参阅解释包含位图筛选器的执行计划

  3. 验证位图筛选是否为导致性能问题的原因。

    位图筛选仅应用于使用哈希联接或合并联接的并行查询计划。 优化的位图筛选仅应用于使用哈希联接的并行查询计划。 若要验证位图筛选器是否在影响查询性能,请在查询语句中指定联接提示 LOOP 来手动禁用位图筛选。 这将强制优化器选择指定的联接类型而非哈希联接。 还可在查询语句中指定联接提示 MERGE 来禁用优化的位图筛选。 有关使用这些提示的详细信息,请参阅联接提示 (Transact-SQL)查询提示 (Transact-SQL)

  4. 使用跟踪事件位图警告跟踪禁用了位图筛选器的查询。

    默认情况下,查询优化器会自动禁用非选择性位图筛选器。 如果激发了此跟踪事件,将尝试消除导致位图筛选器变为非选择性的原因。 位图筛选器可由于下列原因变为非选择性:

    • 查询优化器所做的基数估计不适当。

      SQL Server 主要通过创建索引或统计信息时所创建的直方图,以手动或自动方式估计基数。 统计信息过期和缺少索引都会导致不正确的基数估计,从而造成开销计算不准确,而这又可能导致查询计划不是最佳的。 对查询中所包含的列生成有用的索引或统计信息。 有关详细信息,请参阅排除查询性能不佳故障:基数估计

    • 系统内存不足。

      在内存不足的高负荷系统中,对于查询计划中带有位图筛选器的查询,如果无法获得创建位图所需的最小内存,则可删除位图运算符。 系统监视器可用于监视可能导致系统内存不足的 SQL Server 和非 SQL Server 组件的性能。 例如,可使用 Memory Manager 对象监视服务器内存总体使用量。 有关详细信息,请参阅监视资源使用情况(系统监视器)。 有关解决内存不足问题的信息,请参阅 Troubleshooting Performance Problems in SQL Server 2005(解决 SQL Server 2005 中的性能问题)。

    • 没有足够的线程来以并行方式运行查询。

      位图筛选器仅应用于并行查询计划。 当无法满足特定并行度的并行计划的线程要求时,数据库引擎将自动减少并行度或完全放弃指定的工作负荷上下文中的并行计划。 然后执行串行计划(一个线程)。 有关详细信息,请参阅并行度