扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:Scott Hayes 来源:论坛整理 2007年11月17日
关键字: DB2
在本页阅读全文(共2页)
对于每个表,确定 DB2 为每个事务读取的行数。您必须发出两个命令:
db2 "get snapshot for database on DBNAME"
db2 "get snapshot for tables on DBNAME"
在发出第一个命令以后,确定发生了多少个事务(通过取Commit statements attempted和Rollback statements attempted之和 - 请参阅 技巧 3)。
在发出第二个命令以后,将读取的行数除以事务数(RowsPerTX)。在每个事务中,OLTP 应用程序通常应该从每个表读取 1 到 20 行。如果您发现对每个事务有成百上千的行正被读取,那么发生了扫描操作,也许需要创建索引。(有时以分布和详细的索引来运行 runstats 也可提供了一个解决的办法。)
“get snapshot for tables on DBNAME”的样本输出如下:
Snapshot timestamp = 09-25-2000
4:47:09.970811
Database name= DGIDB
Database path= /fs/inst1/inst1/NODE0000/SQL00001/
Input database alias= DGIDB
Number of accessed tables= 8
Table List
Table Schema= INST1
Table Name= DGI_
SALES_ LOGS_TB
Table Type= User
Rows Written= 0
Rows Read= 98857
Overflows= 0
Page Reorgs= 0
Overflows 的数量很大就可能意味着您需要重组表。当由于更改了行的宽度从而 DB2 必须在一个不够理想的页上定位一个行时就会发生溢出。
3. 表空间分析
表空间快照对理解访问什么数据以及如何访问是极其有价值的。要得到一个表空间快照,请发出以下命令:
db2 "get snapshot for tablespaces on DBNAME"
对每个表空间,回答以下问题:
平均读取时间(ms)是多少?
平均写入时间(ms)是多少?
异步(预取)相对于同步(随机)所占的物理 I/O 的百分比是多少?
每个表空间的缓冲池命中率是多少?
每分钟读取多少物理页面?
对于每个事务要读取多少物理和逻辑页面?
对于所有表空间,回答以下问题:
哪个表空间的读取和写入的时间最慢?为什么?是因为其容器在慢速的磁盘上吗?容器大小是否相等?对比异步访问和同步访问,访问属性是否和期望的一致?随机读取的表应该有随机读取的表空间,这是为了得到高的同步读取百分比、通常较高的缓冲池命中率和更低的物理 I/O 率。
对每个表空间,确保预取大小等于数据块大小乘以容器数。请发出以下命令:
db2 "list tablespaces show detail"
如果需要,可以为一个给定表空间改变预取大小。可以使用以下命令来检查容器定义:
db2 "list tablespace containers for N show detail"
在此,N 是表空间标识号。
2. 缓冲池优化
我时常发现一些 DB2 UDB 站点,虽然机器具有 2、4 或 8GB 内存,但是 DB2 数据库却只有一个缓冲池(IBMDEFAULTBP),其大小只有 16MB!
如果在您的站点上也是这种情况,请为 SYSCATSPACE 目录表空间创建一个缓冲池、为TEMPSPACE表空间创建一个缓冲池以及另外创建至少两个缓冲池:BP_RAND和BP_SEQ。随机访问的表空间应该分配给用于随机访问的缓冲池(BP_RAND)。顺序访问(使用异步预取 I/O)的表空间应该分配给用于顺序访问的缓冲池(BP_SEQ)。根据某些事务的性能目标,您可以创建附加的缓冲池;例如,您可以使一个缓冲池足够大以存储整个“热”(或者说访问非常频繁的)表。当涉及到大的表时,某些 DB2 用户将重要表的索引放入一个索引(BP_IX)缓冲池取得了很大成功。
太小的缓冲池会产生过多的、不必要的物理 I/O。太大的缓冲池使系统处在操作系统页面调度的风险中并消耗不必要的 CPU 周期来管理过度分配的内存。正好合适的缓冲池大小就在“太小”和“太大”之间的某个平衡点上。适当的大小存在于回报将要开始减少的点上。如果您没有使用工具来自动进行回报减少分析,那么您应该在不断增加缓冲池大小上科学地测试缓冲池性能(命中率、I/O 时间和物理 I/O 读取率),直到达到最佳的缓冲池大小。因为业务一直在变动和
1. SQL 成本分析
一条糟糕的 SQL 语句会彻底破坏您的一整天。我不止一次地看到一个相对简单的 SQL 语句搞糟了一个调整得很好的数据库和机器。对于很多这些语句,天底下(或在文件中)没有 DB2 UDB 配置参数能够纠正因错误的 SQL 语句导致的高成本的情况。
更糟糕的是,DBA 常常受到种种束缚:不能更改 SQL(可能是因为它是应用程序供应商提供的,例如 SAP、 PeopleSoft或 Siebel)。这给 DBA 只留下三条路可走:
1. 更改或添加索引
2. 更改群集
3. 更改目录统计
另外,如今健壮的应用程序由成千上万条不同的 SQL 语句组成。这些语句执行的频率随应用程序的功能和日常的业务需要的不同而不同。SQL 语句的实际成本是它执行一次的成本乘以它执行的次数。
每个 DBA 所面临的重大的任务是,识别具有最高“实际成本”的语句的挑战,并且减少这些语句的成本。
通过本机 DB2 Explain 实用程序、一些第三方供应商提供的工具或 DB2 UDB SQL Event Monitor 数据,您可以计算出执行一次 SQL 语句所用的资源成本。但是语句执行频率只能通过仔细和耗时地分析 DB2 UDB SQL Event Monitor 的数据来了解。
在研究 SQL 语句问题时,DBA 使用的标准流程是:
1. 创建一个 SQL Event Monitor,写入文件:
$> db2 "create event monitor SQLCOST for statements write to ..."
2. 激活事件监视器(确保有充足的可用磁盘空间):
$> db2 "set event monitor SQLCOST state = 1"
3. 让应用程序运行。
4. 取消激活事件监视器:
$> db2 "set event monitor SQLCOST state = 0"
5. 使用 DB2 提供的 db2evmon 工具来格式化 SQL Event Monitor 原始数据(根据 SQL 吞吐率可能需要数百兆字节的可用磁盘空间):
$> db2evmon -db DBNAME -evm SQLCOST
> sqltrace.txt
6. 浏览整个已格式化的文件,寻找显著大的成本数(一个耗时的过程):
$> more sqltrace.txt
7. 对已格式化的文件进行更完整的分析,该文件试图标识唯一的语句(独立于文字值)、每个唯一语句的频率(它出现的次数)和其总 CPU、排序以及其它资源成本的总计。如此彻底的分析在 30 分钟的应用程序 SQL 活动样本上可能要花一周或更多的时间。
要减少确定高成本 SQL 语句所花的时间,您可以考虑许多可用的信息来源:
从 技巧 4,务必要计算在每个事务中从每个表中读取的行数。如果产生的
继续调节
最佳性能不仅需要排除高成本 SQL 语句,而且需要确保相应的物理基础结构是适当的。当所有的调节旋钮都设置得恰到好处、内存被有效地分配到池和堆而且 I/O 均匀地分配到各个磁盘时,才可得到最佳性能。虽然量度和调整需要时间,但是执行这 10 个建议的 DBA 将非常成功地满足内部和外部的 DB2 客户。因为电子
快速回顾最棒的 10 个技巧
一旦排除了高成本 SQL,马上重新评估配置和物理设计设置。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者