第七十八章 SQL命令 TUNE TABLE
基于代表性数据调优表。
大纲
TUNE TABLE tablename [ tune_options ]
参数
-
tablename
- 要调优的现有表的名称。
表名可以是限定的(schema.table
),也可以是非限定的(table
)。
非限定表名接受默认模式名。 -
tune_options
- 可选—如果指定,一个或多个TUNE TABLE
选项,以任意顺序指定,由空格分隔。
这些tune_options
不区分大小写。
描述
TUNE TABLE
命令根据表中当前的数据对现有表进行调优。
该数据应该代表表完全填充时所期望的数据。
TUNE TABLE
根据代表性数据计算和设置表的块大小、选择性和范围大小。
通常,TUNE TABLE
设置一个或多个这些值,并清除所有使用这个持久类(表)的缓存查询,以便查询将使用这些新值。
但是,如果TUNE TABLE
没有更改这些值(例如,自上次对该表运行TUNE TABLE
以来数据没有更改),则缓存查询不会被清除,该表的类定义也不会被标记为需要重新编译。
TUNE TABLE
更新SQL表定义(因此需要特权来更改表定义)。
通常,TUNE TABLE
还会更新相应的持久类定义。
这允许查询优化器使用调优后的值,而不需要进行类编译。
但是,如果部署了类,那么TUNE TABLE
只更新SQL表定义;
查询优化器间接使用表定义中的调优值。
如果TUNE TABLE
成功,它将SQLCODE
设置为0
。
如果指定的表名不存在,TUNE TABLE
将发出SQLCODE -30
错误。
权限
TUNE TABLE
命令是一个特权操作。
用户必须具有%ALTER_TABLE
管理权限才能执行TUNE TABLE
。
如果不这样做,将导致%msg
的SQLCODE -99
错误,User 'name' does not have %ALTER_TABLE privileges
。
如果拥有适当的权限,可以使用GRANT
命令为用户或角色分配%ALTER_TABLE
权限。
管理权限是特定于名称空间的。
用户必须对指定的表具有%ALTER
权限。
如果用户是表的Owner
(创建者),则自动授予该用户对该表的%ALTER权限。
否则,用户必须被授予%ALTER
权限。
如果不这样做,将导致一个带有%msg
的SQLCODE -99
错误。
可以通过调用%CHECKPRIV
命令来确定当前用户是否具有%ALTER
权限。
可以使用GRANT
命令为指定的表分配%ALTER权限。
调表选项
-
%KEEP_UP_TO_DATE
:如果未指定(默认值),则未设置修改后的类定义上的最新标志。
这表明类定义已经过期,并且被标记为需要重新编译。
如果指定,则类定义将保持标记为最新的。
这是在活动系统上更改统计信息时的首选选项,因为它降低了重新编译表类定义的可能性。 -
%CLEAR_VALUES
:如果指定了现有的SELECTIVITY
,EXTENTSIZE
等值将从类和表定义中清除。
不指定此选项将提供默认的调优表行为。 -
%SAMPLE_PERCENT
百分比:指定用于对TuneTable
实用程序的数据进行抽样的表行的百分比。
这个百分比可以指定为。##
或##%
;
例如,在采样数据时,.12
或12%
将导致TuneTable
使用表中12%
的行。
指定大于0
且小于等于100%
的百分比值;
超出此范围的值将发出SQLCODE -1
错误。
这个值通常不需要指定。
仅当字段的潜在离群值不是均匀分布在整个表的行中时指定此值。
注意,对于任何区段大小< 1000
行的表,无论%SAMPLE_PERCENT
值如何,整个区段都将由TuneTable
使用。 -
%RECOMPILE_CQ
:如果指定了,TuneTable
将使用新的调优表统计信息重新编译缓存的查询类,而不仅仅是清除调优表的缓存查询。
不指定此选项将提供默认的TuneTable
行为。
如果指定的tune_options
值不存在,TUNE TABLE
将发出SQLCODE -25
错误。
如果两次指定相同的tune_options
值,TUNE TABLE
将发出SQLCODE -326
错误。
缓存查询
执行TUNE TABLE
将创建一个缓存查询。
显示“Show Plan”
表示没有创建查询计划。
未创建SQL语句。
缓存的查询对名称空间是通用的;
在具体的表格中没有列出。
可以使用缓存查询重新运行相同的TUNE TABLE
语句。
执行TUNE TABLE
将清除指定表的所有现有缓存查询,包括上次执行TUNE TABLE
的缓存查询。
可以选择让TUNE TABLE
使用新的TUNE TABLE
值重新编译所有这些缓存的查询。
如果运行TUNE TABLE
没有更改任何TUNE TABLE
值,则不会清除缓存的查询。
运行调优表的其他方法
有两个其他接口运行Tune Table
:
- 通过使用M
anagement Portal SQL
接口Actions
下拉列表,您可以在单个表或模式中的所有表上运行Tune Table
。 - 为单个表或当前名称空间中的所有表调用
$SYSTEM.SQL.Stats.Table.GatherTableStats()
方法。
示例
下面的动态SQL示例调优一个表:
ClassMethod TuneTable()
{
try {
s mysql = "TUNE TABLE Sample.MyTest %KEEP_UP_TO_DATE"
s tStatement = ##class(%SQL.Statement).%New()
s qStatus = tStatement.%Prepare(mysql)
if qStatus '= 1 {
w "%Prepare failed:"
d $System.Status.DisplayError(qStatus)
q
}
s rset = tStatement.%Execute()
if rset.%SQLCODE = 0 {
w !,"Executed Tune Table",!
} else {
s badSQL=##class(%Exception.SQL).%New(,rset.%SQLCODE,,rset.%Message)
throw badSQL }
ret
}
catch exp {
w "In the CATCH block",!
if 1 = exp.%IsA("%Exception.SQL") {
w "SQLCODE: ",exp.Code,!
w "Message: ",exp.Data,!
} else {
w "Not an SQL exception",!
}
ret
}
}