Page tree
Skip to end of metadata
Go to start of metadata

简介

XXL表质量规则是与性能相关的质量规则,它有助于检测在XXL表上运行的不正确或性能较差的SQL查询。XXL表可以定义为包含大量数据的超大表。目标是使用来自生产系统的表规模,因为开发/集成系统可能不具有规模大的表,并且不能帮助检测应用性能水平上的真正威胁。如果信息在物理上不可访问(例如:没有生产环境应用的第一个发行版),那么就有必要模拟这些信息,方法是识别预期较大的表,并输入一个假规模,但要大于“XXL表”诊断中使用的阈值。

启用XXL质量规则

要启用这些XXL表质量规则,必须向分析器提供基于*.sqltablesize 文件在XML中的表行大小信息。这可以如下进行:

使用“开箱即用”分析器

如果正在为Microsoft SQL ServerSybase ASEOracle ServerSAP ABAPOracle Forms/Reports使用CAST AIP中的“开箱即用”分析程序,那么可以在CAST 管理器中的相关分析单元编辑器中配置表大小文件夹选项。必须用定义表行大小信息的*.sqltablesize文件填充此文件夹。例如:

使用SQL 分析器插件

如果使用SQL 分析器插件,那么只需交付**.sqltablesize文件即可,其定义表行在同一个文件夹中的源代码规模信息。CAST 管理器中相关分析单元编辑器中的表规模文件夹选项对于用于SQL分析器插件通用分析器分析单元不存在

.sqltablesize文件样本

sqltablesize文件有两种格式:

  • 旧版——开箱即用”CAST AIP分析器和SQL 分析器插件都接受这两种格式    
  • 新版——这种格式只被SQL 分析器插件所接受,因此不能与“开箱即用”CAST AIP分析器一起使用。    

下面将解释这两种格式。

注意没有SAP ABAP的示例,因为CAST SAP提取器NG 会自动生成文件。

旧版格式

下面的“旧版”格式被“开箱即用”CAST AIP分析器和SQL分析器插件两者所接受:

Oracle 服务器

<?xml version="1.0" encoding="UTF-8" ?>
<config name="SQL Table Size" version="1.0.0.0" extraction-date="2009/02/10" >
<oracle castformat="7.0">
<!-- "server name" is equal to the value defined for the CAST_Oracle_Instance item in the .UAXdirectory file resulting from the extraction process -->
<server name="ORA10G" >
<schema name="CASTPUBS">
...
<table name="ORDER_LINE" rows="2000000000"/>
...
</schema>
</server>
</oracle>
</config>

Microsoft SQL 服务器

<?xml version="1.0" encoding="UTF-8" ?>
<config name="SQL Table Size" version="1.0.0.0" extraction-date="2009/02/10" >
<microsoft>
<!-- server name can be written as HOST\INSTANCE_NAME but INSTANCE_NAME alone will also function -->
<server name="PDOXPLAP2\SQLS2K5" >
<!-- schema name is optional - if it is not applied, then the table row value is applied to all tables of that name in the database -->
<schema name="schema or user name">
<database name="CASTPUBS">
...
<table name="Order_line" rows="20000000000"/>
...
</database>
</schema>
</server>
</microsoft>
</config>

Sybase ASE 服务器

<?xml version="1.0" encoding="UTF-8" ?>
<config name="SQL Table Size" version="1.0.0.0" extraction-date="2009/02/10" >
<sybase>
<!-- server name can be written as HOST\INSTANCE_NAME but INSTANCE_NAME alone will also function -->
<server name="Bordeaux" >
<!-- schema name is optional - if it is not applied, then the table row value is applied to all tables of that name in the database -->
<schema name="schema or user name">
<database name="cwmm">
...
<table name="ACC" rows="20000000000"/>
...
</database>
</schema>
</server>
</sybase>
</config> 

IBM DB2-UDB 服务器

<?xml version="1.0" encoding="UTF-8" ?>
<config name="SQL Table Size" version="1.0.0.0" extraction-date="2009/02/10" >
<ibm-udb>
<server name="Bordeaux" >
<schema name="cwmm">
...
<table name="ACC" rows="1000000"/>
...
</schema>
</server>
</ibm-udb>
</config> 

IBM DB2 z/OS 服务器

<?xml version="1.0" encoding="UTF-8" ?>
<config name="SQL Table Size" version="1.0.0.0" extraction-date="2009/02/10" >
<ibm-zos>
<server name="Bordeaux" >
<database name="cwmm">
<schema name="cwmm">
...
<table name="ACC" rows="1000000"/>
...
</schema>
</database>
</server>
</ibm-zos>
</config> 

新版格式

以下格式仅为SQL分析器插件所接受,因此不能与“开箱即用”CAST AIP分析器一起使用。

新版格式使用模式:schema_name.table_name=<table row count>,即每XXL表一行。“xxl_threshold”选项允许覆盖评估模型(100,000)中触发质量规则的默认阈值:

xxl_threshold=100000
xxs_threshold=10
 
CASTPUBS.ORDER_LINE=2000000000
cwmm.ACC=2000000000

管理阈值

每个XXL质量规则都有一个阈值,该阈值决定何时将表视为“XXL”。默认情况下这个阈值设置为100,000。可以通过两种方式覆盖默认阈值:

使用CAST管理器

该方法对新版和旧版.sqltablesize格式都有效。

每个XXL质量规则都有特定的环境参数来定义阈值。例如质量规则7666“避免使用SELECT…”在XXL表上的ENDSELECT语句“使用环境参数如下:

编辑参数显示阈值:

因此可以更改这个值,也可以更改将表视为“XXL”的阈值。

使用.sqltablesize文件中的参数

此方法仅对新版.sqltablesize格式有效。

如果使用的是新版.sqltablesize格式,只被SQL分析器插件接受,那么可以通过在.sqltablesize文件的顶部添加以下内容来覆盖所有XXL质量规则的阈值——例如,将值设置为200,000:

xxl_threshold=200000

.sqltablesize文件生成方法

可以通过执行以下脚本来生成.sqltablesize文件:

  • 如果在分析开发系统时从生产系统收集表大小,请记住更改生成文件中的服务器名称值。

Oracle 服务器

使用您感兴趣的模式所有者执行以下脚本。这将以“旧版格式”生成输出。

set echo off;
set heading off;
set feedback off;
spool ORACLE.SQLTABLESIZE;
select '<?xml version="1.0"encoding="UTF-8" ?>' from dual;
select '<config name="SQL Table Size" version="1.0.0.0" extraction-date="' ||to_char(sysdate, 'YYYY' )||'/'||to_char(sysdate, 'MM' ) ||'/'||to_char(sysdate, 'dd' )||'" >' from dual;
select '<oracle castformat="7.0">' from dual;
select '<server name="'|| sys_context('USERENV', 'INSTANCE_NAME')||'" >' from dual;
select '<schema name="'||sys_context('USERENV', 'CURRENT_SCHEMA')||'">' from dual;
select '<table name="'||table_name||'" rows="'||nvl(num_rows,0) ||'"/>' from user_tables ;
select '</schema>' from dual;
select '</server>' from dual;
select '</oracle>' from dual;
select '</config>' from dual;
spool off;
exit;

还可以将其自动化,如下所示:

sqlplus <owner>/<password>@<connect identifier> @<script name>

Microsoft SQL 服务器

对感兴趣的数据库执行以下脚本。这将以“旧版格式”生成输出。

set nocount on
select '<?xml version="1.0" encoding="UTF-8" ?>'
select '<config name="SQL Table Size" version="1.0.0.0" extraction-date="' + convert(varchar(10),GETDATE()) + '" >'
select char(9) + '<microsoft>'
select char(9) + char(9) + '<server name="'+ @@servername +'">'
select char(9) + char(9) + char(9) + '<database name="'+ DB_NAME() +'">'
select char(9) + char(9) + char(9) + char(9) +'<table name="' + so.name + '" rows="' + convert(varchar(10),convert(int,MAX(si.rows))) +'"/>'
FROM
sysobjects so,
sysindexes si
WHERE
so.xtype = 'U'
AND
si.id = so.id
GROUP BY
so.name
select char(9) + char(9) + char(9) + '</database>'
select char(9) + char(9) + '</server>'
select char(9) + '</microsoft>'
select '</config>'
go

还可以将其自动化,如下所示:

sqlcmd -U sa -P <password> -S <server> -H <host> -d <target database> -i <script> -o SQLSERVER.SQLTABLESIZE -h -1

请注意,如果在Microsoft SQL 服务管理器中运行上述查询,则无法轻松将默认输出模式复制到“结果”窗口中。因此CAST建议查询输出更改为文本文件,如下所示:

  • 单击查询菜单(在查询窗口中工作时可用)
  • 选择结果,然后选择:
    • 以文本显示结果
    • 以文件显示结果

Sybase ASE

对感兴趣的数据库执行以下脚本。这将以“旧版格式”生成输出。

select "<?xml version="1.0" encoding="UTF-8" ?>"
select "<configSQL Table Size"" version=""1.0.0.0"" extraction-date="""|| convert(varchar(12),getdate()) || """>"
select char(9) ||"<sybase>"
select char(9) || char(9) || "<server name="'+ @@servername +'">"
select char(9) || char(9) || char(9) || "<database>"
begin SELECT "<table" || o.name || """ rows=""" || convert(varchar(50),convert(int,s.rowcnt)) || """ />"
FROM sysobjects o, systabstats s
WHERE o.id = s.id AND s.indid IN (0,1)
AND o.type = 'U'
ORDER BY o.type, o.name end
select char(9) || char(9) || char(9) || "</database>"
select char(9) || char(9) || "</server>"
select char(9) || "</sybase>"
select "</config>"
go

IBM DB2 UDB

根据您感兴趣的模式执行以下脚本。

旧版格式

这将以“旧版格式”生成输出。

connect to <server> user <user> using <role>;
select '<?xml version="1.0" encoding="UTF-8" ?>' from SYSIBM.SYSDUMMY1;
select '<config name="SQL Table Size" version="1.0.0.0" extraction-date="' || varchar(current date) || '" >' from SYSIBM.SYSDUMMY1;
select CAST(char(' ') as char(4)) || '<ibm-udb>' from SYSIBM.SYSDUMMY1;
select CAST(char(' ') as char(8)) || '<server name="' || HOST_NAME || '">' FROM TABLE(SYSPROC.ENV_GET_SYS_INFO()) AS SYSTEMINFO;
select CAST(char(' ') as char(12)) || '<database name="'DB2UDB'">' from SYSIBM.SYSDUMMY1;
select CAST(char(' ') as char(16)) || '<schema name="CASTPUBS">' from SYSIBM.SYSDUMMY1;
select CAST(char(' ') as char(20)) || '<table name="' || tabname || '" rows="' || TRIM(TRAILING FROM CAST(card as char(128))) || '" />' FROM syscat.tables where tabschema = 'CASTPUBS' and type = 'T' order by tabname;
select CAST(char(' ') as char(16)) || '</schema>' from SYSIBM.SYSDUMMY1;
select CAST(char(' ') as char(12)) || '</database>' from SYSIBM.SYSDUMMY1;
select CAST(char(' ') as char(8)) || '</server>' from SYSIBM.SYSDUMMY1;
select CAST(char(' ') as char(4)) || '</ibm-udb>' from SYSIBM.SYSDUMMY1;
select '</config>' from SYSIBM.SYSDUMMY1;

请确保:

  • 修改第一行以使用登录凭据。   
  • 需要针对感兴趣的每个模式运行此脚本,对于每个模式,需要修改包含以下内容的行:
    • <schema name="CASTPUBS">
    • where tabschema = 'CASTPUBS'
  • 结果DB2UDB.SQLTABLESIZE文件不是有效的XML,请确保删除不属于有效生成的XML的前几行。

SQL分析器插件的新版格式

有关更多信息,请参见SQL分析器 - 使用DB2数据库的XXL或XXS表

这将为SQL 分析器插件生成“新版格式”的输出。

SELECT concat(concat(trim(TABSCHEMA), '.') , trim(TABNAME)) concat '='  concat trim(cast(COLCOUNT as char(50))) TableSize
FROM SYSCAT.TABLES
WHERE type = 'T'
AND TABSCHEMA = 'YOUR SCHEMA NAME'
ORDER BY TableSize

示例:

SELECT concat(concat(trim(TABSCHEMA), '.') , trim(TABNAME)) concat '='  concat trim(cast(COLCOUNT as char(50))) TableSize
FROM SYSCAT.TABLES
WHERE type = 'T'
AND TABSCHEMA = 'TT3'
ORDER BY TableSize

将产生以下输出:

TT3.BAN_IM_1=7
TT3.BAN_IM_2=7
TT3.BATCH_REF=4
TT3.BUS_LIST_1=18
....

IBM DB2 z/OS

旧版格式

对于驻留在IBM DB2 z/OS服务器上的模式,没有可用的脚本以旧版格式生成XXL表规模信息。在以前的CAST AIP版本中,DB2 z/OS提取器将自动生成原始的XXL表规模数据,因此不需要手动创建文件,但是,这个提取器不再用于CAST AIP≥8.3.x中的IBM DB2 z/OS分析。请使用如下“新格式”替代。

SQL分析器插件的新版格式  

有关更多信息,请参见SQL分析器 - 使用DB2数据库的XXL或XXS表

此JCL语句可用于生成SQL 分析器插件的“新版格式”输出:

/*
//*------------------------------------------------------
//*
//* 26 - EXTRACTING NUMBER OF ROWS FOR TABLES
//*
//* COLUMN        TYPE     COL-SIZE EXTRACT-SIZE
//* ============= ======== ======== ============
//* CREATOR       VARCHAR  128      128
//* NAME          VARCHAR  128      128
//* CARDF         FLOAT    11       11
//*------------------------------------------------------
//* Following filters can be inserted in the WHERE clause:
//*   - CREATOR IN ('xxx','yyy', ...)
//*   - CHAR(DBNAME) IN ('xxx','yyy', ...)
//*------------------------------------------------------
//STEP26   EXEC PGM=IKJEFT01,DYNAMNBR=20
//SYSTSPRT DD SYSOUT=*
//SYSPRINT DD SYSOUT=*
//SYSUDUMP DD SYSOUT=*
//*
//SYSREC00 DD DSN=CAST.DB2.TABROWS,DISP=(NEW,CATLG,),
//            SPACE=(TRK,(100,100),RLSE)
//SYSPUNCH DD SYSOUT=*
//SYSPUNCH DD DUMMY
//SYSTSIN  DD *
  DSN SYSTEM(DBx)
  RUN  PROGRAM(DSNTIAUL) PLAN(DSNTIBxx) -
      LIB('DSNxxx.RUNLIB.LOAD') PARMS('SQL')
//SYSIN    DD *

  SELECT
      CONCAT(CREATOR, CONCAT('.', CONCAT(NAME, CONCAT('=', CARDF))))
  FROM SYSIBM.SYSTABLES
  WHERE TYPE = 'T'
  ORDER BY DBNAME, CREATOR, NAME;

MySQL

SQL分析器插件的新版格式

这将为SQL分析器插件生成“新版格式”的输出(注意,这只是一个示例,没有官方支持):

select concat(TABLE_SCHEMA, '.', TABLE_NAME, '=', TABLE_ROWS) as TABLESIZE 
from INFORMATION_SCHEMA.TABLES 
where TABLE_TYPE = 'BASE TABLE'
and TABLE_SCHEMA not in ('INFORMATION_SCHEMA', 'MYSQL', 'PERFORMANCE_SCHEMA', 'SYS')
and TABLE_SCHEMA = 'XXX' --  to be specified

提示——服务器、数据库、模式、表标识     

sqltablesize文件的新版和旧版格式中的服务器数据库/模式节点必须在初始分析之后匹配CAST分析服务模式中存储的信息。可以通过以下几种方式确定此信息:

查找服务器名称

使用 CAST Enlighten

  • 对象浏览器图形视图中右键单击实例

  • 选择Properties以更新属性窗口。下面突出显示的“host”名称可以用来定义.SQLTABLESIZE文件中的“Server”节点:

使用CAST系统视图

可以在分析服务中查询CAST系统视图,以标识“服务器”名称。运行以下查询(这是为CSS服务器自定义的,但可以适用于Microsoft SQL 服务器和Sybase ASE):

select DESCRIPTION
from <analysis_service>.CSV_OBJECT_DESCRIPTIONS
where DESC_TYPE = 'host name'

查找数据库和表名  

数据库/模式表可以很容易的识别在CAST Enlighten使用对象浏览器图形视图

故障排除

检查sqltablesize信息上传

要确定已经使用sqltablesize信息进行标记的表,可以对CAST分析服务模式运行以下查询:

Select OBJECT_NAME, OBJECT_FULLNAME, OI.InfVal
From CDT_OBJECTS CO, ObjInf OI
Where OI.IdObj = CO.OBJECT_ID
And OI.InfTyp = 115
And OI.InfSubTyp = 1

查找XXL表

要识别XXL表,可以对CAST分析服务模式运行以下查询:

Select OBJECT_NAME, OBJECT_FULLNAME, OI.InfVal
From CDT_OBJECTS CO, ObjInf OI
Where OI.IdObj = CO.OBJECT_ID
And OI.InfTyp = 115
And OI.InfSubTyp = 1
And OI.InfVal >= 100000 -- change the value if you changed the threshold
  • No labels