DB2编程序技巧(六)
DB2 技巧 编程序
2023-06-13 09:13:53 时间
正在看的db2教程是:DB2编程序技巧(六)。2.2SQL语句尽量写复杂SQL
尽量使用大的复杂的SQL语句,将多而简单的语句组合成大的SQL语句对性能会有所改善。
DB2的SQL Engieer对复杂语句的优化能力比较强,基本上不用当心语句的性能问题。
Oracle 则相反,推荐将复杂的语句简单化,SQL Engieer的优化能力不是特别好。
这是因为每一个SQL语句都会有reset SQLCODE和SQLSTATE等各种操作,会对数据库性能有所消耗。
一个总的思想就是尽量减少SQL语句的个数。
2.3SQL SP及C SP的选择
首先,C的sp的性能比sql 的sp 的要高。
一般而言,SQL语句比较复杂,而逻辑比较简单,sql sp 与 c sp 的性能差异会比较小,这样从工作量考虑,用SQL写比较好。
而如果逻辑比较复杂,SQL比较简单,用c写比较好。
2.4查询的优化(HASH及RR_TO_RS)
db2set DB2_HASH_JOIN=Y(HASH排序优化)
指定排序时使用HASH排序,这样db2在表join时,先对各表做hash排序,再join,这样可以大大提高性能。
剧沈刚说做实验,7个一千万条记录表的做join取10000条记录,再没有索引的情况下 72秒。
db2set DB2_RR_TO_RS=Y
该设置后,不能定义RR隔离级别,如果定义RR,db2也会自动降为RS.
这样,db2不用管理Next key,可以少管理一些东西,这样可以提高性能。
2.5避免使用count(*) 及exists的方法
1、首先要避免使用count(*)操作,因为count(*)基本上要对表做全部扫描一遍,如果使用很多会导致很慢。
2、exists比count(*)要快,但总的来说也会对表做扫描,它只是碰到第一条符合的记录就停下来。
如果做这两中操作的目的是为
select into 服务的话,就可以省略掉这两步。
直接使用select into 选择记录中的字段。
如果是没有记录选择到的话,db2 会将 sqlcode=100 和 sqlstate="20000"
如果是有多条记录的话,db2会产生一个错误。
程序可以创建 continue handler for exception
continue handler for not found
来检测。
这是最快速的方法。
3、如果是判断是不是一条,可以使用游标来计算,用一个计数器,累加,达到预定值后就离开。这个速度也比count(*) 要快,因为它只要扫描到预定值就不再扫描了,不用做全表的scan,不过它写起来比较麻烦。
3DB2表及sp管理
3.1看存储过程文本
select text from syscat.procedures where procname="PROC1";
3.2看表结构
describe table syscat.procedures
describe select * from syscat.procedures
3.3查看各表对sp的影响(被哪些sp使用)
select PROCNAME from SYSCAT.PROCEDURES where SPECIFICNAME in(select dname from sysibm.sysdependencies where bname in ( select PKGNAME from syscat.packagedep where bname="TB_BRANCH"))
尽量使用大的复杂的SQL语句,将多而简单的语句组合成大的SQL语句对性能会有所改善。
DB2的SQL Engieer对复杂语句的优化能力比较强,基本上不用当心语句的性能问题。
Oracle 则相反,推荐将复杂的语句简单化,SQL Engieer的优化能力不是特别好。
这是因为每一个SQL语句都会有reset SQLCODE和SQLSTATE等各种操作,会对数据库性能有所消耗。
一个总的思想就是尽量减少SQL语句的个数。
2.3SQL SP及C SP的选择
首先,C的sp的性能比sql 的sp 的要高。
一般而言,SQL语句比较复杂,而逻辑比较简单,sql sp 与 c sp 的性能差异会比较小,这样从工作量考虑,用SQL写比较好。
而如果逻辑比较复杂,SQL比较简单,用c写比较好。
2.4查询的优化(HASH及RR_TO_RS)
db2set DB2_HASH_JOIN=Y(HASH排序优化)
指定排序时使用HASH排序,这样db2在表join时,先对各表做hash排序,再join,这样可以大大提高性能。
剧沈刚说做实验,7个一千万条记录表的做join取10000条记录,再没有索引的情况下 72秒。
db2set DB2_RR_TO_RS=Y
该设置后,不能定义RR隔离级别,如果定义RR,db2也会自动降为RS.
这样,db2不用管理Next key,可以少管理一些东西,这样可以提高性能。
2.5避免使用count(*) 及exists的方法
1、首先要避免使用count(*)操作,因为count(*)基本上要对表做全部扫描一遍,如果使用很多会导致很慢。
2、exists比count(*)要快,但总的来说也会对表做扫描,它只是碰到第一条符合的记录就停下来。
如果做这两中操作的目的是为
select into 服务的话,就可以省略掉这两步。
直接使用select into 选择记录中的字段。
如果是没有记录选择到的话,db2 会将 sqlcode=100 和 sqlstate="20000"
如果是有多条记录的话,db2会产生一个错误。
程序可以创建 continue handler for exception
continue handler for not found
来检测。
这是最快速的方法。
3、如果是判断是不是一条,可以使用游标来计算,用一个计数器,累加,达到预定值后就离开。这个速度也比count(*) 要快,因为它只要扫描到预定值就不再扫描了,不用做全表的scan,不过它写起来比较麻烦。
3DB2表及sp管理
3.1看存储过程文本
select text from syscat.procedures where procname="PROC1";
3.2看表结构
describe table syscat.procedures
describe select * from syscat.procedures
3.3查看各表对sp的影响(被哪些sp使用)
select PROCNAME from SYSCAT.PROCEDURES where SPECIFICNAME in(select dname from sysibm.sysdependencies where bname in ( select PKGNAME from syscat.packagedep where bname="TB_BRANCH"))
相关文章
- DB2存储过程语法解析
- 迁移展开db2到oracle数据库迁移之旅(db2到oracle)
- 在Linux上卸载DB2服务的指南(db2linux卸载)
- 深入比较:DB2与Oracle的异同(db2和oracle的区别)
- 数据库的比较DB2数据库与Oracle数据库的功能对比(db2数据库与oracle)
- 比较DB2与Oracle数据库的差异(db2与oracle)
- 数据库在Linux系统中连接DB2数据库的指南(linux下连接db2)
- Linux上如何使用DB2进行数据还原?(linuxdb2还原)
- 数据MySQL实现DB2数据库的数据导入(mysql 导入 db2)
- 在Linux下使用DB2命令进行数据库管理(db2 linux 命令)
- 实现DB2数据库到Oracle的迁移(db2转换成oracle)
- 降低迁移成本从DB2到Oracle的语法对照(db2语法转oracle)
- 研究DB2表的导入到Oracle的方法(db2表导入oracle)
- DB2移植到Oracle技术挑战与极限(db2移植到oracle)
- 比较DB2与Oracle哪种更胜一筹(db2对比oracle)
- 比较比较DB2与Oracle数据库的价格优劣(db2和oracle价格)
- 从DB2到Oracle的数据库迁移实践(db2 oracle迁移)
- DB2和Oracle用法对比究竟该怎么用(db2oracle怎么用)
- 选择DB2或者Oracle在企业级数据库中成功落地(db2或oracle)
- 比较Oracle与DB2数据库技术的异同(oracle与db2关系)
- 如何使用JSP连接DB2数据库
- DB2编程序小小技巧
- 在DB2中提高INSERT性能的技巧(1)