SQL语句优化DB2应用程序性能(三)

本文介绍了在SQL查询中使用FOR UPDATE防止死锁、通过CLI设置读写模式、利用OPTIMIZE FOR n ROWS提高性能、以及使用FETCH FIRST n ROWS ONLY限制结果集等技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 如果在DECLARE CURSOR语句中指定FOR UPDATE子句,当应用程序1提取该行时,将会给该行加上U锁,应用程序2将会等待应用程序1释放U锁,这样,两个应用程序之间就不会发生死锁了。

  下面举例说明如何在SELECT语句中使用FOR UPDATE子句。

 

 


EXEC SQL DECLARE c1 CURSOR FOR SELECT * FROM employee 
FOR UPDATE OF job; 
EXEC SQL OPEN c1; 
EXEC SQL FETCH c1 INTO …; 
If(strcmp(change,“YES”)= =0) 
EXEC SQL UPDATE employee SET job = :newjob 
WHERE CURRENT OF c1; 
EXEC SQL CLOSE c1;

 
  对于CLI编程,我们可以使用函数SQLSetConnectAttr()将DB2 CLI的连接属性SQL_ATTR_ACCESS_MODE的值设置为:SQL_MODE_READ_WRITE,效果是一样的。

 

  4、指定OPTIMIZE FOR n ROWS子句

 

  当我们希望提取的行数远远小于可能返回的行数时,在SELECT语句中指定OPTIMIZE FOR n ROWS子句。基于提取n行的假设,OP

 

  TIMIZE FOR子句会影响查询的优化,同时也决定了通讯缓冲区中行的数目。 

 

 

SELECT projno,projname,repemp FROM project 
WHERE deptno=’D11’ OPTIMIZE FOR 10 ROWS 


  运用行的分块技术,通过在单一操作中一次性地提取一组行来减轻管理器的负担,这些行存储在缓冲区中,应用程序中的每一个FETCH请求都会从该缓冲区中提取下一行,如果指定OPTIMIZE FOR 10 ROWS,那么,系统会以10行为一组返回给用户。数据库

 

  需要注意的是,OPTIMIZE FOR n ROWS子句既不会限制可以提取的行数,也不会影响提取的结果,但是,该子句会影响应用程序的性能,如果最终提取的行数小于或等于n,该子句会改善性能;否则,如果大于n,性能就会下降。

 

  5、指定FETCH FIRST n ROWS ONLY子句

 

  如果不希望应用程序提取n行以上的记录,我们可以在编程时指定FETCH FIRST n ROWS ONLY子句;反之,如果不指定该子句,结果集中可能就会有很多行(大于n)。注意,该子句不能与FOR UPDATE子句同时使用。

 

  参看下面的例子,程序最多能提取5行。

 

 

SELECT projno,projname,repemp FROM project 
WHERE deptno=’D11’ 
FETCH FIRST 5 ROWS ONLY 


  该子句同OPTIMIZE FOR n ROWS子句一样,也决定通讯缓冲区中行的数目;如果同时指定FETCH FIRST n1 ROWS ONLY子句和OPTIMIZE FOR n2 ROWS子句,则取n1和n2二者中的较小值作为通讯缓冲区的大小。

目录 1. DB2 1.1. 创建一个返回结果集的存储过程\自定义函数 12 1.2. DB2 高级应用 14 1.3. 删除表数据时候出现日志已满的解决方法 24 1.4. DB2快照函数全解析 25 1.5. DB2中的22个命令小技巧 26 1.6. DB2实现类型ORACLE的一些功能 29 1.7. 字符数据类型转换的时候需要注意的问题() 30 1.8. 本地谓词的使用注意() 31 1.9. windows/Linux或Unix下查看DB2端口号 31 1.10. 尽量让fetch first n row only或者分页的时候结合optimize for n rows使用() 32 1.11. 格式化字符串() 33 1.12. 10大DB2优化技巧 33 1.13. 使用DB2的整数转换浮点小数时注意() 41 1.14. 使用递归制造测试数据() 42 1.15. 尽量使用自定义函数来代替存储过程 42 1.16. VALUES() 与 VALUES …的区别() 44 1.17. DB2的表锁和行锁 45 1.18. 修改表结构后不允许对表进行任何操作() 57 1.19. 解决暂挂表() 58 1.20. DB2LOOK语法及使用 58 导出表结构的表结构脚本 59 1.21. DB2的函数大全 64 1.22. DB2数据库为单个会话锁定技巧 64 1.23. EXISTS和COUNT(*)的使用() 68 1.24. 如果表比较大,进行COUNT的时候,可选择COUNT_BIG(*) 69 1.25. 序列(SEQUENCE) () 69 1.26. 数据的导入和导出 69 1 加载数据: 69 2 卸载数据: 70 3 在Load过程中使用的Exception 表有何作用,该如何创建?() 70 4如何导出(EXPORT),导入(LOAD)包含由公式生成字段的表 70 5 LOAD命令和自生成列值 72 6 用load命令和identityoverride参数向有identity列的表中装载数据后的注意事项 74 1.27. 利用快照函数查询数据库服务器本地以及远程的连接数 74 1.28. 查看SQL的执行计划 74 1.29. 如何查看数据库ABC的配置文件的内容? 75 1.30. 查看是哪张表挂起() 75 1.31. 导出(导入)数据库的所有表数据(db2move) 75 1.32. 备份数据库,恢复数据库 75 1.33. 建立数据库、缓冲池、表空间、表案例 77 1.34. 建立别名 78 1.35. 建立视图 78 1.36. 建立唯一性索引 78 1.37. 查看表的索引 79 1.38. 查看表 79 1.39. 建立触发器 79 1.40. 查看存储过程 79 1.41. view application 79 1.42. kill application 79 1.43. lock table(x) 79 1.44. lock table(s) 80 1.45. 列出所有的系统表 80 1.46. 列出系统数据库目录 80 1.47. 显示当前活动数据库 80 1.48. 查看命令选项 80 1.49. 表空间 80 1.50. 表空间容器 80 1.51. 如何知道SEQUENCE的状况 81 1.52. 如何知道SCHEMA的状况 81 1.53. 如何知道INDEX的状况 81 1.54. 查看装载数据库的instance 81 1.55. 创建数据库的instance 81 1.56. 创建数据库的catalog 81 1.57. 如何在命令行下执行DB2脚本(script) 82 1.58. 怎么样获取表结构以及索引的信息 82 1.59. 如果怀疑应用程序有死锁现象,如何确认是否死锁,并判断是哪些程序引起的死锁? 84 1.60. 数据库创建以后相关的目录和文件都有哪一些? 85 1.61. 自增列(IDENTITY) 86 1.62. 修改表结构的注意事项() 86 1.63. 可使用VALUES 来代替多个[not] in的条件语句 87 1.64. 计算数据库缓冲池的命中率公式 87 1.65. 查看表空间状态 88 1.66. UPDATE的N种用法 88 Examples 88 1.67. 查看表状态的快照命令 90 1.68. RUNSTATS的使用案例 91 1.69. Bufferpool设置过大导致数据库无法启动的解决方案 98 1.70. 查看DB2是否存在僵尸进程 98 1.71. 监控执行成本最高的SQL语句 99 1.72. 监控运行最长的SQL语句 99 1.73. 给表增加generated always时需要注意() 99 1.74. 给表增加索引的时候,可以增加collect detailed statistics参数来避免对表索引重新runstats() 100 1.75. DB2 LOAD命令所提供的选项及注册表变量使用 100 1.76. 在windows上配置数据源() 109 1.77. DB2 Advisors的使用 110 1.78. 修改表结构的数据类型、删除非空语法 111 1.79. 使用import导入表中指定列的数据 111 1.80. 使用SQL查询出存储过程中的锁以及引发锁的SQL 112 1.81. 关于标识列(自增列)的对比试验、使用示例 113 示例 121
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值