文章
姚 鑫 · 十一月 16, 2021 阅读大约需 4 分钟

第七十八章 SQL命令 TUNE TABLE

第七十八章 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
如果不这样做,将导致%msgSQLCODE -99错误,User 'name' does not have %ALTER_TABLE privileges
如果拥有适当的权限,可以使用GRANT命令为用户或角色分配%ALTER_TABLE权限。
管理权限是特定于名称空间的。

用户必须对指定的表具有%ALTER权限。
如果用户是表的Owner(创建者),则自动授予该用户对该表的%ALTER权限。
否则,用户必须被授予%ALTER权限。
如果不这样做,将导致一个带有%msgSQLCODE -99错误。
可以通过调用%CHECKPRIV命令来确定当前用户是否具有%ALTER权限。
可以使用GRANT命令为指定的表分配%ALTER权限。

调表选项

  • %KEEP_UP_TO_DATE:如果未指定(默认值),则未设置修改后的类定义上的最新标志。
    这表明类定义已经过期,并且被标记为需要重新编译。
    如果指定,则类定义将保持标记为最新的。
    这是在活动系统上更改统计信息时的首选选项,因为它降低了重新编译表类定义的可能性。
  • %CLEAR_VALUES:如果指定了现有的SELECTIVITY, EXTENTSIZE等值将从类和表定义中清除。
    不指定此选项将提供默认的调优表行为。
  • %SAMPLE_PERCENT百分比:指定用于对TuneTable实用程序的数据进行抽样的表行的百分比。
    这个百分比可以指定为。####%;
    例如,在采样数据时,.1212%将导致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:
- 通过使用Management 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
    }
}
00
1 0 0 7
登录或注册以继续