有点乱 ,我认为重要的用绿色标注下,可以看重点:
1.关于syscat.tables中个别字段说明:
npages和fpages的区别说明:要计算表中的空页数,查询 SYSCAT.TABLES 中的 FPAGES 和 NPAGES 列并从 FPAGES 数减去 NPAGES 数。FPAGES 列存储正在使用的总页数;NPAGES 列存储包含一些行的页数。当删除整个范围内的行时,可能出现空页。
随着空页数的增多,就更需要进行表重组。重组表时将回收空页并减少表所使用的空间量。另外,因为会将空页读入缓冲池以进行表扫描,所以回收未使用的页可以提高表扫描的性能。
Overflow字段说明:查询 SYSSTAT.TABLES 表中的 OVERFLOW 列以监视溢出值。此列中的值表示不适合其原始页的行数。当使用比初始值更长的值来更新 VARCHAR 列时,行数据可能会溢出。在这些情况下,在行中的原始位置将保留一个指针,而实际值存储在由指针指示的另一个位置。这可能会影响性能,因为数据库管理器必须根据指针来查找行的内容。这个包括两个步骤的过程增加了处理时间,并且可能还会增加需要的 I/O 数目。
重组表数据将消除行溢出;因此,随着溢出行数的增加,重组表数据就可能会具有更多好处。
2.通过db2的控制中心查看死锁情况(这个太长,还没时间写(有时间会补上的,只是时间不怎么够用),大家可以到控制中心右边那个 “应用程序列表”里面的“显示锁定链” 。要是谁还不明白,可以发邮件到这: [email protected].)
3.关于日志文件的情况
4.关于db2的QUIESCE 命令的用法说明:
a.Db2 quiesce tablespaces for table tablename (share/intent to update/EXCLUSIVE) 停顿 ,可以用db2 list tablespaces show detail 查看那个表空间和那个表被停顿了(select tabschema,tabname from syscat.tables where tbspaceid=? And tableid=? With ur).用 db2 quiesce tablespaces for table tablename reset 去除quiesce状态。
b.停顿状态有share/intent to update/EXCLUSIVE 3类。为share、intent to update时此表空间所有的表可以执行查询操作,但不可以执行insert和update操作。为exclusive时select、insert、update都不行。当然了,在quiesce状态下不可以在此表空间中增加表。
5.rename table命令: db2 rename table tablea to tableb 或者 db2 rename tablea to tableb
6.db2 list tablespaces show detail 对于数据库管理的表空间有个高水位标记(high water mark),这个参数的意义:High water mark是记录tablespace使用的pages最峰值,如果high water mark过高,而used pages较小说明该表空间可能存在大量碎片,会一定程度影响数据库性能。这种情况下通过对tablespace中的表和视图进行reorg可以一定程度的降低high water mark的值!
7.一般数据和索引放在独自的表空间里面。
8.关于reorgchk、runstats、reorg命令说明:
a.db2 reorgchk (update/current) statistics on table (all/tablename) 注:使用update statistics时会执行runstats操作。
对 reorgchk 所使用的度量的考虑因素包括:(当查看 reorgchk 工具的输出时,找到用于表的 F1、F2 和 F3 这几列,以及用于索引的 F4、F5、F6、F7 和 F8 这几列。如果这些列中的任何一列有星号 (*),则说明当前的表和/或索引超出了阈值。)
F1: 属于溢出记录的行所占的百分比。当这个百分比大于 5% 时,在输出的 F1 列中将有一个星号 (*)。
F2: 数据页中使用了的空间所占的百分比。当这个百分比小于 70% 时,在输出的 F2 列上将有一个星号 (*)。
F3: 其中含有包含某些记录的数据的页所占的百分比。当这个百分比小于 80% 时,在输出的 F3 列上将有一个星号 (*)。
F4: 群集率,即表中与索引具有相同顺序的行所占的百分比。当这个百分比小于 80% 时,那么在输出的F4 列上将有一个星号 (*)。
F5: 在每个索引页上用于索引键的空间所占的百分比。当这个百分比小于 50% 时,在输出的 F5 列上将有一个星号 (*)。
F6: 可以存储在每个索引级的键的数目。当这个数字小于 100 时,在输出的 F6 列上将有一个星号 (*)。
F7: 在一个页中被标记为 deleted 的记录 ID(键)所占的百分比。当这个百分比大于 20% 时,在输出的 F7 列上将有一个星号 (*)。
F8: 索引中空叶子页所占的百分比。当这个百分比大于 20% 时,在输出的 F8 列上将有一个星号 (*)。
B. REORG TABLE
REORG TABLE命令的语法如下:
>>-REORG TABLE--table-name----+--------------------+------------>
'-INDEX--index-name--'
>-----+-----------------------+--------------------------------><
'-USE--tablespace-name--'
执行REORG可以考虑分为表上有索引和没有索引两种情况:
1) 如果表上有索引
如表名为DB2INST1.STAFF,索引名为DB2INST1.ISTAFF,命令如下:
db2 reorg table db2inst1.staff index db2inst1.istaff use tempspace1
建议REORG时使用USE参数指定数据重排时使用的临时表空间,否则,REORG工作将会在表所在表空间中原地执行。
如果表上有多个索引,INDEX参数值请使用最为重要的索引名。
2) 如果表上没有索引
如表名为DB2INST1.STAFF, SYSIBM.SYSTABLES
db2 reorg table db2inst1.staff use tempspace1
db2 reorg table sysibm.systables use tempspace1
C.runstats
收集所有列上的统计信息:
RUNSTATS ON TABLE db2admin.department ON ALL COLUMNS 等同于:RUNSTATS ON TABLE db2admin.department
收集单个列上的目录统计信息:RUNSTATS ON TABLE db2admin.department ON COLUMNS (deptno, deptname)
收集关键列上的目录统计信息(索引的列,如果没有索引存在,这条命令不会收集任何列的统计信息):RUNSTATS ON TABLE db2admin.department ON KEY COLUMNS
收集关键列上和一个非关键列上的目录统计信息:RUNSTATS ON TABLE db2admin.department ON KEY COLUMNS AND COLUMNS (deptname)
收集表和索引上的目录统计信息:RUNSTATS ON TABLE db2admin.department AND INDEXES ALL
详细信息:http://www.ibm.com/developerworks/cn/db2/library/techarticles/dm-0412pay/
d.db2rebind命令:db2rbind dbname -l errorfilelog.out
9. 操作系统时间不对 会导致某些函数不能用 ,比如 ltrim()和 rtrim(),一般是系统时间晚于实践时间引起的(注:如果在操作系统时间不对前数据库已经使用过上面2个函数,就不会出现上述错误,可能是db2在第一次使用的时候执行函数,并把结果放在内存中,下次使用的时候直接从内存中取,而不用去执行其他太多的代码,这个不知道想的对不对)
10. db2中 '正式 ' 和'正式'效果是一样的,原因:因为在字符串比较的过程是对于短的字符串在右边补位(blanks),直到两个字符串长度相等,然后对每一个byte进行比较。用 select * from t_dn_ht where hex(htlx_d)=hex('正式')做到 区分 '正式 ' 和'正式' ;HEX(..) 返回值的十六进制表示 (注:这个在oracle中是不成立的)
11. 我们知道在使用中文字符集的数据库中,当你对一列中文数据使用order by 排序时,排序的结果正是按照每行记录第一个汉字的拼音首字母进行排列的,
12. sysibm.sysdummy1”是一个类似于 oracle 中的 “dual” 的东西,是一个没有实际数据的虚拟表。用“sysibm.sysdummy1”可能会比用“sysibm.systables” 性能高,因为前者不用dbms去验证表的有效性,但是这种性能的差别,不是一般的小系统中能体现出的。Sysibm。sysdummy1是一个特殊的内存中的表
13. 在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。按索引来排序或分组,可以提高效率。
14.在SQL语句中,LIKE关键字支持通配符匹配,但这种匹配特别耗费时间。例如:SELECT * FROM Order WHERE CreateUser LIKE ‘M_ _ _’ 。即使在CreateUser字段上建立了索引,在这种情况下也还是采用顺序扫描的方式,Order表中有1000条记录,就需要比较1000次。如果把语句改为SELECT * FROM Order WHERE CreateUser >’M’ AND CreateUser <’N’,在执行查询时就会利用索引来查询,显然会大大提高速度。(注:这个感觉不错)
15. distinct
使用distinct是为了保证在结果集中不出现重复值,但是distinct会产生一张工作表,并进行排序来删除重复记录,这会大大增加查询和I/O的操作次数。因此应当避免使用distinct关键字。(注:这个还没怎么做过测试,就当个知识写这吧)
16. 临时表
使用临时表时数据库会在磁盘中建立相应的数据结构,因为内存的访问速度远远大于外部存储器的访问速度,在复杂查询中使用临时表时,中间结果会被导入到临时表中,这种磁盘操作会大大降低查询效率。另外,在分布式系统中,临时表的使用还会带来多个查询进程之间的同步问题。所以,在进行复杂查询时最好不要使用临时表。(这个不是很明白,还没查好,你要是明白可以留言,先谢谢了)
17.db2存储过程方面(这里的都是一些很浅的东西,为初次接触笔记)
a.对于声明变量的一个建议:对于varchar变量 前缀 用 v_开头,int变量用n_开头
b.