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 命令时,也可以产生统计信息。
将表 tab_1 中列组 c00、c01 的范围密度更改为 0.50000000:
sp_modifystats "tab_1", "c00, c01", MODIFY_DENSITY, range, absolute, "0.5"
将 tab_1 中列组 c00、c01 的总密度乘以 0.5,也就是将其除以 2:
sp_modifystats "tab_1", "c00,c01", MODIFY_DENSITY, total, factor, "0.5"
将表 tab_1 中所有列的总密度乘以 0.5:
sp_modifystats "tab_1", "all", MODIFY_DENSITY, total, factor, "0.5"
将始于 c12 的所有列组的总密度更改为和范围密度相等:
sp_modifystats "tab_1", "c12" REMOVE_SKEW_FROM_DENSITY
将带有未知常量(例如,a1>@v1)的非等同性谓词的缺省选择性值设置为 0.09:
sp_modifystats t10, a1, MODIFY_DEFAULT_SELECTIVITY, inequality, absolute, "0.09"
如果指定了带有未知常量(例如,a2>@v1 和 a2<@v2)的上限和下限谓词,请将列 a2 的缺省选择性值设置为值 0.11:
sp_modifystats t10, a2, MODIFY_DEFAULT_SELECTIVITY, inbetween, absolute, "0.11"
通过因子 0.13 修改表 t10 的所有列的范围值:
sp_modifystats t10, "all", MODIFY_UNIQUE, range, factor, "0.13"
将表 t110 的所有列的总唯一值修改为绝对值 0.14,这表示表中每列的唯一值是(1.0 / 0.14)= 7.1428:
sp_modifystats t10, "all", MODIFY_UNIQUE, total, absolute, "0.14"
使用 sp_modifystats 时,还存在一些其它注意事项:
>=、<=、>、< 范围运算符的列。包含 inbetween 搜索参数的搜索参数缺省选择性值是 25%。inbetween 搜索参数包括同时具有上限谓词和下限谓词或使用 between 运算符的列。