科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道理解 DB2 中的列组统计信息

理解 DB2 中的列组统计信息

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

DB2 SQL 优化器(后文简称为优化器)可以估计每个备选访问计划的执行成本,并根据其估计结果选择一个最佳访问计划。一个访问计划可以指定用来解析一条 SQL 语句的操作次序。

来源:IT专家网 2008年6月3日

关键字: IBM 数据库 DB2

  • 评论
  • 分享微博
  • 分享邮件

多个等式连接谓词的统计相关性

DB2 SQL 优化器同样尝试检测两个表中的多个等式连接谓词间的统计相关性。

示例 2:考虑示例 1 中描述的 SHOW_LISTINGS 表,另外,RATINGS 表包含如下列:

表 2. RATINGS 表的描述

列名 描述
SHOW_ID 表外键,包含关于各演出清单的信息
CHANNEL_ID 表外键,包含关于播放演出的每个频道的信息
STATION_ID 表外键,包含和频道相关的每个电视台的信息
CITY_ID 表外键,包含关于上演该演出的每个城市的信息
DAY 播放演出的日期
TIME 播放演出的时间
RATING 在一天的某个时间,在特定城市中,某个电视台频道的演出清单的收视率

RATINGS 表包含描述不同城市演出清单的收视率信息,用户可能需要查询 RATINGS 表和 SHOW_LISTINGS 表的连接以检索这两个表的属性。一个查询在该连接上应用的谓词集包含以下内容:

P1: SHOW_LISTINGS.SHOW_ID = RATINGS.SHOW_ID
P2: SHOW_LISTINGS.CHANNEL_ID = RATINGS.CHANNEL_ID
P3: SHOW_LISTINGS.STATION_ID = RATINGS.STATION_ID

P1-P3 这三个谓词可能不是互相独立的;优化器试图使用任何可用的多列统计信息来检测谓词之间的相关性。

优化器只能检测和说明每一对连接表上的多个连接谓词间的统计相关性。例如,如果一条 SQL 语句包含如下谓词:

P1: T1.A = T2.A
P2: T1.B = T2.B
P3: T1.C = T3.C

优化器只尝试检测 P1 和 P2 间的统计相关性,因为它们只应用于相同的两个表的连接,T1 和 T2。P3 应用于 T1 和 T2 的连接;那是一个不同的连接。如果添加了第四个谓词,例如:

P4: T1.D = T2.D

优化器将进一步尝试检测 P3 和 P4 间的统计相关性。

为了说明等式连接谓词间的统计相关性,优化器使用连接所涉及的两表之一的多列统计信息;这个表被视为连接的父表。因此只需要在连接的父表中收集列组统计信息。连接的另一个表被指定为子表。如果父表不能确定,那么优化器就不能使用多列统计信息来检测连接谓词间的统计相关性。

附录 B 提供了优化器如何确定两个连接表中的父表和子表的具体示例和描述。对连接中的父表进行标识,或者判断连接中是否有父表,这对于避免收集无用的列组统计信息是非常有用的。如果尚无合适的索引可用,那么在连接中的每个表上收集列组统计信息即可。

收集多列统计信息

优化器考虑使用所有可用的索引 keycard 统计信息。如果具有统计相关性的谓词所引用的列集中,索引 keycard 统计信息不可用,可以使用 RUNSTATS 命令收集列组统计信息。下面是从 DB2 V82 提取的语法。

注意:对于 DB2 9,请在 Info Center 的 DB2 9 文档中查看语法。.

>>-RUNSTATS--ON TABLE--table name--+-USE PROFILE------------+--->
  '-| Statistics Options |-'
Statistics Options:

 .-ALLOW WRITE ACCESS-.
|--+--------------------------+--+--------------------+--------->
 '-| Table Object Options |-'  '-ALLOW READ ACCESS--'


Table Object Options:

|--+-FOR--| Index Clause |----------------------------------+---|
  '-+-------------------------+--+-----------------------+-'
 '-| Column Stats Clause |-'  '-AND--| Index Clause |-'

Column Stats Clause:

|--+-ON--| Cols Clause |------------------------------+---------|
  '-+---------------------+--| Distribution Clause |-'
  '-ON--| Cols Clause |-'

On Cols Clause:

 .-ON ALL COLUMNS-------------------------------------------------.
 |                                           .-,-------------.    |
 |                                           V               |    |
|--+-ON--+----------------------+--COLUMNS--(----Column Option-+--)-+--|
 |     '-+-ALL-+--COLUMNS AND-'                                      |
|       '-KEY-'                                                  |
 '-ON KEY COLUMNS-------------------------------------------------'

	
“ON COLUMNS” 子句允许您指定一个列的列表,为它们收集统计信息。如果您指定了一组列,则会收集该组中惟一值的数量。未列出的列的统计信息非常明确。您可以在 “on-cols-clause” 和 “on-dist-cols-clause” 中使用这个子句。

注意:目前还不支持为一组列收集分布统计信息。

注意:如果启用了 automatic runstats 并使用 RUNSTATS 命令收集了列组统计信息,automatic runstats 将覆盖这些统计信息,并丢弃列组统计信息。

AUTO_RUNSTATS 数据库配置设置表明是否启用了 automatic runstats:

Automatic runstats (AUTO_RUNSTATS)=ON

如果设置为 “ON”,则启用 automatic runstats。

AUTO_RUNSTATS 默认情况下使用 “具有所有分布和示例的详细索引” 的 RUNSTATS 选项。

您可以使用统计信息配置文件来覆盖默认的 RUNSTATS 选项。您可以将希望收集的任意列组统计信息添加到此配置文件中,以避免 automatic runstats 覆盖它们。

“统计信息配置文件” 提供了关于统计信息配置文件的详细资料。

对于数据库分区特性(database partitioning feature,DPF)环境,automatic runstats 总是在目录分区上收集统计信息。如果表不存在于这个目录节点上,将使用表驻留的节点组的第一个分区。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章