美文网首页
第七十八章 SQL命令 TUNE TABLE

第七十八章 SQL命令 TUNE TABLE

作者: Cache技术分享 | 来源:发表于2021-11-17 08:01 被阅读0次

    第七十八章 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
        }
    }
    

    相关文章

      网友评论

          本文标题:第七十八章 SQL命令 TUNE TABLE

          本文链接:https://www.haomeiwen.com/subject/kpxltrtx.html