最近db2学习笔记(06.29--07.03)

有点乱 ,我认为重要的用绿色标注下,可以看重点:

 

1.关于syscat.tables中个别字段说明:<o:p></o:p>

npagesfpages的区别说明要计算表中的空页数,查询 SYSCAT.TABLES 中的 FPAGES NPAGES 列并从 FPAGES 数减去 NPAGES 数。FPAGES 列存储正在使用的总页数;NPAGES 列存储包含一些行的页数。当删除整个范围内的行时,可能出现空页。 <o:p></o:p>

随着空页数的增多,就更需要进行表重组。重组表时将回收空页并减少表所使用的空间量。另外,因为会将空页读入缓冲池以进行表扫描,所以回收未使用的页可以提高表扫描的性能。<o:p></o:p>

Overflow字段说明:查询 SYSSTAT.TABLES 表中的 OVERFLOW 列以监视溢出值。此列中的值表示不适合其原始页的行数。当使用比初始值更长的值来更新 VARCHAR 列时,行数据可能会溢出。在这些情况下,在行中的原始位置将保留一个指针,而实际值存储在由指针指示的另一个位置。这可能会影响性能,因为数据库管理器必须根据指针来查找行的内容。这个包括两个步骤的过程增加了处理时间,并且可能还会增加需要的 I/O 数目。 <o:p></o:p>

重组表数据将消除行溢出;因此,随着溢出行数的增加,重组表数据就可能会具有更多好处。 <o:p></o:p>

<o:p> </o:p>

2.通过db2的控制中心查看死锁情况(这个太长,还没时间写(有时间会补上的,只是时间不怎么够用),大家可以到控制中心右边那个 “应用程序列表”里面的“显示锁定链” 。要是谁还不明白,可以发邮件到这: [email protected].)<o:p></o:p>

3.关于日志文件的情况<o:p></o:p>

4.关于db2QUIESCE 命令的用法说明:<o:p></o:p>

  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状态。<o:p></o:p>

    b.停顿状态有share/intent to update/EXCLUSIVE  3类。为shareintent to update时此表空间所有的表可以执行查询操作,但不可以执行insertupdate操作。为exclusiveselectinsertupdate都不行。当然了,在quiesce状态下不可以在此表空间中增加表。<o:p></o:p>

5.rename table命令: db2 rename table  tablea to  tableb 或者 db2 rename tablea to tableb<o:p></o:p>

6.db2 list tablespaces show detail  对于数据库管理的表空间有个高水位标记(high water mark),这个参数的意义:High water mark是记录tablespace使用的pages最峰值,如果high water mark过高,而used pages较小说明该表空间可能存在大量碎片,会一定程度影响数据库性能。这种情况下通过对tablespace中的表和视图进行reorg可以一定程度的降低high water mark的值!<o:p></o:p>

7.一般数据和索引放在独自的表空间里面。<o:p></o:p>

8.关于reorgchkrunstatsreorg命令说明:<o:p></o:p>

       a.db2  reorgchk  (update/current) statistics on table (all/tablename)  注:使用update statistics时会执行runstats操作。<o:p></o:p>

reorgchk 所使用的度量的考虑因素包括:(当查看 reorgchk 工具的输出时,找到用于表的 F1F2 F3 这几列,以及用于索引的 F4F5F6F7 F8 这几列。如果这些列中的任何一列有星号 (*),则说明当前的表和/或索引超出了阈值。)<o:p></o:p>

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 列上将有一个星号 (*)<o:p></o:p>

  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

<o:p> </o:p>

9. 操作系统时间不对 会导致某些函数不能用 ,比如 ltrim() rtrim(),一般是系统时间晚于实践时间引起的(注:如果在操作系统时间不对前数据库已经使用过上面2个函数,就不会出现上述错误,可能是db2在第一次使用的时候执行函数,并把结果放在内存中,下次使用的时候直接从内存中取,而不用去执行其他太多的代码,这个不知道想的对不对)

<o:p> </o:p>

10. db2 '正式  ' '正式'效果是一样的,原因:因为在字符串比较的过程是对于短的字符串在右边补位(blanks),直到两个字符串长度相等,然后对每一个byte进行比较。用 select * from t_dn_ht where hex(htlx_d)=hex('正式')做到 区分 '正式  ' '正式'  ;HEX(..)   返回值的十六进制表示  (注:这个在oracle中是不成立的)

<o:p> </o:p>

11. 我们知道在使用中文字符集的数据库中,当你对一列中文数据使用order by 排序时,排序的结果正是按照每行记录第一个汉字的拼音首字母进行排列的,<o:p></o:p>

<o:p> </o:p>

12. sysibm.sysdummy1”是一个类似于 oracle 中的 dual 的东西,是一个没有实际数据的虚拟表。用“sysibm.sysdummy1”可能会比用“sysibm.systables 性能高,因为前者不用dbms去验证表的有效性,但是这种性能的差别,不是一般的小系统中能体现出的。Sysibmsysdummy1是一个特殊的内存中的表<o:p></o:p>

<o:p> </o:p>

13. 在频繁进行排序或分组(即进行group byorder by操作)的列上建立索引。按索引来排序或分组,可以提高效率。<o:p></o:p>

<o:p> </o:p>

14SQL语句中,LIKE关键字支持通配符匹配,但这种匹配特别耗费时间。例如:SELECT * FROM Order WHERE CreateUser LIKE M_ _ _ 。即使在CreateUser字段上建立了索引,在这种情况下也还是采用顺序扫描的方式,Order表中有1000条记录,就需要比较1000次。如果把语句改为SELECT * FROM Order WHERE CreateUser >M AND CreateUser <N’,在执行查询时就会利用索引来查询,显然会大大提高速度。(注:这个感觉不错)<o:p></o:p>

<o:p> </o:p>

15. distinct<o:p></o:p>

<o:p> </o:p>

使用distinct是为了保证在结果集中不出现重复值,但是distinct会产生一张工作表,并进行排序来删除重复记录,这会大大增加查询和I/O的操作次数。因此应当避免使用distinct关键字。(注:这个还没怎么做过测试,就当个知识写这吧)<o:p></o:p>

<o:p> </o:p>

16. 临时表<o:p></o:p>

<o:p> </o:p>

使用临时表时数据库会在磁盘中建立相应的数据结构,因为内存的访问速度远远大于外部存储器的访问速度,在复杂查询中使用临时表时,中间结果会被导入到临时表中,这种磁盘操作会大大降低查询效率。另外,在分布式系统中,临时表的使用还会带来多个查询进程之间的同步问题。所以,在进行复杂查询时最好不要使用临时表。(这个不是很明白,还没查好,你要是明白可以留言,先谢谢了<o:p></o:p>

<o:p> </o:p>

17.db2存储过程方面(这里的都是一些很浅的东西,为初次接触笔记)<o:p></o:p>

  a.对于声明变量的一个建议:对于varchar变量 前缀 v_开头,int变量用n_开头<o:p></o:p>

  b.<o:p></o:p>

 

<o:p> 注:还在学习中,后面的还会继续贴上 </o:p>

你可能感兴趣的:(数据结构,oracle,sql,IBM,db2)