第七十八章 SQL命令 TUNE TABLE

2021-11-17  本文已影响0人  Cache技术分享

第七十八章 SQL命令 TUNE TABLE

基于代表性数据调优表。

大纲

TUNE TABLE tablename [ 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权限。

调表选项

如果指定的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:

示例

下面的动态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
    }
}
上一篇下一篇

猜你喜欢

热点阅读