简介
XXL表质量规则是与性能相关的质量规则,它有助于检测在XXL表上运行的不正确或性能较差的SQL查询。XXL表可以定义为包含大量数据的超大表。目标是使用来自生产系统的表规模,因为开发/集成系统可能不具有规模大的表,并且不能帮助检测应用性能水平上的真正威胁。如果信息在物理上不可访问(例如:没有生产环境应用的第一个发行版),那么就有必要模拟这些信息,方法是识别预期较大的表,并输入一个假规模,但要大于“XXL表”诊断中使用的阈值。
启用XXL质量规则
要启用这些XXL表质量规则,必须向分析器提供基于*.sqltablesize 文件在XML中的表行大小信息。这可以如下进行:
使用“开箱即用”分析器
如果正在为Microsoft SQL Server、Sybase ASE、Oracle Server、SAP ABAP和Oracle Forms/Reports使用CAST AIP中的“开箱即用”分析程序,那么可以在CAST 管理器中的相关分析单元编辑器中配置表大小文件夹选项。必须用定义表行大小信息的*.sqltablesize文件填充此文件夹。例如:
使用SQL 分析器插件
如果使用SQL 分析器插件,那么只需交付**.sqltablesize文件即可,其定义表行在同一个文件夹中的源代码规模信息。CAST 管理器中相关分析单元编辑器中的表规模文件夹选项对于用于SQL分析器插件的通用分析器分析单元不存在。
.sqltablesize文件样本
sqltablesize文件有两种格式:
下面将解释这两种格式。
注意没有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管理器
每个XXL质量规则都有特定的环境参数来定义阈值。例如质量规则7666“避免使用SELECT…”在XXL表上的ENDSELECT语句“使用环境参数如下:
编辑参数显示阈值:
因此可以更改这个值,也可以更改将表视为“XXL”的阈值。
使用.sqltablesize文件中的参数
如果使用的是新版.sqltablesize格式,只被SQL分析器插件接受,那么可以通过在.sqltablesize文件的顶部添加以下内容来覆盖所有XXL质量规则的阈值——例如,将值设置为200,000:
xxl_threshold=200000
.sqltablesize文件生成方法
可以通过执行以下脚本来生成.sqltablesize文件:
- 如果在分析开发系统时从生产系统收集表大小,请记住更改生成文件中的服务器名称值。
- 没有SAP ABAP的示例,因为CAST SAP提取器NG会自动生成文件。
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