您好,我是小DAI,专注于数据库管理员相关的技术问答,请问有什么可以帮您?

sp_modifystats

语法


sp_modifystats [<database>].[<owner>].<table_name>, {"<column_group>" | "all"}, 
  modify_density, {range | total}, {absolute | factor}, "<value>" 
  modify_default_selectivity, {inequality | inbetween}, {absolute | factor}, "<value>" 
  modify_unique {range | total}, {absolute | factor}, "<value>"

或:


sp_modifystats [<database>].[<owner>].<table_name>, 
<column_name> | null,
	REMOVE_SKEW_FROM_DENSITY
	REMOVE_STICKINESS

参数

<table_name>

是要更改的表的名称。如果该表位于另一数据库中,请指定数据库名,如果数据库中有多个具有该名称的表,请指定所有者的名称。<owner> 的缺省值是当前用户,而 <database> 的缺省值是当前数据库。

<column_group>

列名称的有序列表。若要更改多个列的统计信息(例如密度值),请按用于创建统计信息的顺序列出这些列。各列名用逗号分隔。例如,如果您的表具有关于列 a1、a2、a3、a4 的密度统计信息:

- “a1”修改列 a1。

- “a1,a2,a3”修改列组 a1、a2 和 a3。

- 也可以将通配符 % 用于 column_group 参数,以代表一定范围的字符。例如,“a1,%,a3”修改组 a1、a2、a3 和 a1、a4、a3,依此类推;“a1,%”修改组 a1、a2 和 a1、a2、a3,依此类推,但不修改 a1;“a1%”修改组 a1、a2 和 a1、a2、a3,依此类推,并且修改 a1。

all

修改此表的所有列组。由于“all”是关键字,因此需要为其加上引号。

modify_density

允许将单列或列组的范围或总密度修改为 <value> 参数中指定的粒度。范围单元密度表示直方图中范围单元代表的所有值的平均重复数。<value> 既可以是指定的密度值,也可以是当前密度的倍数。如果指定了 absolute,则该值必须在 0 到 1 之间(包括 0 和 1)。

其中:

- range – 修改范围单元密度。

- total – 修改总单元密度。

- absolute – 忽略当前值,使用 参数指定的数值。

- factor – 用 参数乘以当前统计值。

modify_default_selectivity

指定缺省选择性值。该值必须在 0 到 1 之间(包括 0 和 1)。

其中:

- inequality – 指示谓词在其中有上限或下限,但不同时具有上限和下限的列,并包括以下范围运算符:> =、<=、>、<。inequality 的缺省值为 33。

- inbetween – 指示谓词在其中包括上限和下限的列,并包括以下范围运算符:> =、<=、>、<。inbetween 的缺省值为 25。

- absolute – 忽略当前值,使用 value 参数指定的数值。

- factor – 用 value 参数乘以当前统计值。

modify_unique

允许将单列或列组的 range 唯一值或 total 唯一值修改为 value 参数中指定的粒度。

- range – 修改直方图范围单元中的唯一值数目的估计值。范围不包括频率单元(即单一值的直方图单元)。估计值由 0.0 和 1.0 之间的小数表示,该值等于:


unique_range_values / (range_cell_rows * total rows_in_table)

- total – 修改列或列组的唯一值数目的估计值(包括 NULL 值)。优化程序使用该值来估计 group by 和 distinct 基数。它由 0.0 和 1.0 之间的小数表示,其中 1.0/<唯一计数> 存储在目录中。

- absolute – 忽略当前值,使用 value 参数指定的数值。

- factor – 用 value 参数乘以当前统计值。

REMOVE_STICKINESS

删除与指定列相关的粘性。指定 null 以删除表中所有列的粘性。

SAP ASE 服务器保留以下 update statistics 参数的内存时,将出现“粘性”:

- using step values

- sampling

- histogram_tuning_factor

- hashing

- no_hashing

- partial_hashing

短语具有“粘性”后,SAP ASE 服务器会针对后续 update statistics 命令保留其对于该列的行为,即使未明确指定参数。

<column_name >

是表中列的名称。

REMOVE_SKEW_FROM_DENSITY

允许系统管理员更改单列的总密度,使其等于范围密度,这在出现数据不对称时很有用。总密度表示频率单元和范围单元中所有值的重复平均数。总密度用于估计连接和搜索参数(其值在查询优化时为未知)的匹配行数。

REMOVE_SKEW_FROM_DENSITY 也更新任何组合列统计信息的总密度,该列是组合列的最主要属性。通常,该列是其最主要属性的组合索引会产生这些组合列的统计信息,但当发出一个组合 update statistics 命令时,也可以产生统计信息。

示例

示例 1

将表 tab_1 中列组 c00、c01 的范围密度更改为 0.50000000:


sp_modifystats  "tab_1", "c00, c01", MODIFY_DENSITY, range, absolute, "0.5"

示例 2

将 tab_1 中列组 c00、c01 的总密度乘以 0.5,也就是将其除以 2:


sp_modifystats  "tab_1", "c00,c01", MODIFY_DENSITY, total, factor, "0.5"

示例 3

将表 tab_1 中所有列的总密度乘以 0.5:


sp_modifystats  "tab_1", "all", MODIFY_DENSITY, total, factor, "0.5"

示例 4

将始于 c12 的所有列组的总密度更改为和范围密度相等:


sp_modifystats "tab_1", "c12" REMOVE_SKEW_FROM_DENSITY

示例 5

将带有未知常量(例如,a1>@v1)的非等同性谓词的缺省选择性值设置为 0.09:


sp_modifystats t10, a1, MODIFY_DEFAULT_SELECTIVITY, inequality, absolute, "0.09"  

示例 6

如果指定了带有未知常量(例如,a2>@v1 和 a2<@v2)的上限和下限谓词,请将列 a2 的缺省选择性值设置为值 0.11:


sp_modifystats t10, a2, MODIFY_DEFAULT_SELECTIVITY, inbetween, absolute, "0.11"  

示例 7

通过因子 0.13 修改表 t10 的所有列的范围值:


sp_modifystats t10, "all", MODIFY_UNIQUE, range, factor, "0.13" 

示例 8

将表 t110 的所有列的总唯一值修改为绝对值 0.14,这表示表中每列的唯一值是(1.0 / 0.14)= 7.1428:


sp_modifystats t10, "all", MODIFY_UNIQUE, total, absolute, "0.14"  

用法

使用 sp_modifystats 时,还存在一些其它注意事项:

  • 允许系统管理员修改 sysstatistics 中单列或多列的密度值。

  • 用 optdiag 查看表的统计信息。

  • 用 sp_modifystats 对统计信息所做的任何修改在运行 update statistics 后会被覆盖。为了确保使用最新的有关统计信息的修改,应该在运行 update statistics 后运行 sp_modifystats。

  • 因为 sp_modifystats 修改存储在 sysstatistics 表中的信息,所以在生产系统中执行 sp_modifystats 前,应该备份统计信息。

  • 仅可以在单个列上使用 modify_default_selectivity,而不能在列组上使用。

  • 如果未知常量阻止其使用直方图估计各个谓词的选择性,则 SAP ASE 将使用 modify_default_selectivity 的缺省选择性。使用 inequality 的搜索参数缺省选择性为 33%。inequality 搜索参数包括存在上限谓词或下限谓词(但二者不同时存在)并使用 >=、<=、>、< 范围运算符的列。包含 inbetween 搜索参数的搜索参数缺省选择性值是 25%。inbetween 搜索参数包括同时具有上限谓词和下限谓词或使用 between 运算符的列。