﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Prayer-随笔分类-DB2</title><link>http://www.cppblog.com/prayer/category/7986.html</link><description>在一般中寻求卓越</description><language>zh-cn</language><lastBuildDate>Mon, 24 Jun 2019 10:41:26 GMT</lastBuildDate><pubDate>Mon, 24 Jun 2019 10:41:26 GMT</pubDate><ttl>60</ttl><item><title>DB2 缓冲池调优Bufferpools</title><link>http://www.cppblog.com/prayer/archive/2019/06/24/216446.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Mon, 24 Jun 2019 02:09:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2019/06/24/216446.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/216446.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2019/06/24/216446.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/216446.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/216446.html</trackback:ping><description><![CDATA[<div>https://blog.csdn.net/liujinwei2005/article/details/8547190<br /><h1>DB2 缓冲池调优Bufferpools</h1><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; word-wrap: break-word; color: #333333; font-family: -apple-system, 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun; background-color: #ffffff;" /><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4d4d4d; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;"></p><div style="box-sizing: border-box; outline: 0px; margin: 0px 0px 24px; word-wrap: break-word; overflow-x: auto; color: #333333; font-family: -apple-system, 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun; background-color: #ffffff;"><table border="0" cellpadding="0" cellspacing="0" width="100%" style="box-sizing: border-box; outline: 0px; margin: 0px auto; padding: 0px; border-collapse: collapse; border-spacing: 0px; width: 712px; word-wrap: break-word;"><tbody style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; border: 0px; word-wrap: break-word;"><tr style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; border-width: 1px 0px 0px; border-top-style: solid; border-top-color: #dddddd; word-wrap: break-word;"><td style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 8px; word-wrap: break-word; border-style: solid; border-color: #dddddd; font-size: 14px; color: #4f4f4f; line-height: 22px;"><div id="art" style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">背景知识</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">缓冲池是内存中的一块存储区域，用于临时读入和更改<a target="_blank" style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; color: #4ea1db; cursor: pointer; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; word-wrap: break-word;"><u style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; word-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-weight: 700; word-wrap: break-word;">数据库</span></u></a>页（包含表行或索引项）。缓冲池的用途是为了提高数据库系统的性能。从内存访问数据要比从磁盘访问数据快得多。因此，数据库<a target="_blank" style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; color: #4ea1db; cursor: pointer; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; word-wrap: break-word;"><u style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; word-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-weight: 700; word-wrap: break-word;">管理</span></u></a>器需要从磁盘读取或写入磁盘的次数越少，性能就越好。对一个或多个缓冲池进行配置之所以是调优的最重要方面，是因为连接至数据库的应用程序的大多数数据（不包括大对象和长字段数据）操作都在缓冲池中进行。</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">缺省情况下，应用程序使用缓冲池 IBMDEFAULTBP，它是在创建数据库时创建的。当 SYSCAT.BUFFERPOOLS 目录表中该缓冲池的 NPAGES 值为 -1 时，<a target="_blank" style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; color: #4ea1db; cursor: pointer; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; word-wrap: break-word;"><u style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; word-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-weight: 700; word-wrap: break-word;">DB2</span></u></a>&nbsp;数据库配置参数 BUFFPAGE 控制着缓冲池的大小。否则会忽略 BUFFPAGE 参数，并且用 NPAGES 参数所指定的页数创建缓冲池。</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">建议</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">对于仅使用一个缓冲池的应用程序，将 NPAGES 更改成 -1，这样 BUFFPAGE 就可以控制该缓冲池的大小。这使得更新和报告缓冲池大小以及其它 DB2 数据库配置参数变得更加方便。</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">确保可以使用数据库配置中的 BUFFPAGE 参数来控制缓冲池大小之后，将该参数设置成合适的值。根据数据库的大小和应用程序的性质将该参数设置成一个合理的大值，这种做法很安全。通常，该参数的缺省值非常小，可能满足不了要求。请考虑下列情况：</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">一开始，如果您的机器上有足够大的内存，请将 BUFFPAGE 设置成 40000 个页（160 MB），或者等于机器总内存的 10%。&nbsp;</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">对于大型 OLTP 数据库，在保持系统稳定的同时为缓冲池留出尽可能多的内存。一开始，先尝试使用 1.6 GB 的内存，然后尝试用更多内存。&nbsp;</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">如何更改该参数</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">运行下面这个脚本，以便：&nbsp;</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">验证目录值&nbsp;</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">启用数据库配置参数 BUFFPAGE&nbsp;</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">更新所有数据库的 BUFFPAGE 值。&nbsp;</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">db2 -v connect to DB_NAME</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">db2 -v select * from syscat.bufferpools</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">db2 -v alter bufferpool IBMDEFAULTBP size -1</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">db2 -v connect reset</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">db2 -v update db cfg for dbname using BUFFPAGE bigger_value</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">db2 -v terminate</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">研究步骤</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">要确定数据库的缓冲池大小是否由 BUFFPAGE 参数所决定，请运行：</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">db2 -v connect to DB_NAME</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">db2 -v SELECT * from SYSCAT.BUFFERPOOLS</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">db2 -v connect reset</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">db2 -v terminate</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">检查结果。如果每个缓冲池都有一个为&#8220;-1&#8221;的 NPAGES 值，那么缓冲池大小是由数据库配置中的 BUFFPAGE 参数控制的。</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">要确定缓冲池大小是否足够大，请在运行应用程序时收集数据库和／或缓冲池的快照。类似于下面的脚本为您提供这些所需的信息：</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">db2 -v update monitor switches using bufferpool on</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">db2 -v get monitor switches</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">db2 -v reset monitor all</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">-- run your application --</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">db2 -v get snapshot for all databases &gt; snap.out</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">db2 -v get snapshot for dbm &gt;&gt; snap.out</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">db2 -v get snapshot for all bufferpools &gt;&gt; snap.out</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">db2 -v reset monitor all</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">db2 -v terminate</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">请确保您在断开数据库连接之前发出&#8220;db2 -v get snapshot&#8221;。当最后一个应用程序与数据库断开连接时，该数据库停止运行，同时所有快照统计信息将会丢失。要确保一直存在使数据库处于正常运行状态的连接，请使用下列方法之一：</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">在收集快照的窗口中保持一个单独的连接。&nbsp;</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">使用 DB2 ACTIVATE DATABASE 命令。</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">在数据库快照或缓冲池快照的快照输出中，查找下列&#8220;logical reads&#8221;和&#8220;physical reads&#8221;，这样就可以计算出缓冲池命中率，它可以帮助您调优缓冲池：</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">-- Related lines from a sample of bufferpool snapshots --</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">Buffer pool&nbsp;<a target="_blank" style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; color: #4ea1db; cursor: pointer; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; word-wrap: break-word;"><u style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; word-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-weight: 700; word-wrap: break-word;">data</span></u></a>&nbsp;logical reads = 702033</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">Buffer pool data physical reads = 0</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">Buffer pool data writes = 414</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">Buffer pool index logical reads = 168255</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">Buffer pool index physical reads = 0</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">缓冲池命中率表明数据库管理器不需要从磁盘装入页（即该页已经在缓冲池中）就能处理页请求的时间百分比。缓冲池的命中率越高，使用磁盘 I/O 的频率就越低。按如下计算缓冲池命中率：</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">(1 - ((buffer pool data physical reads + buffer pool index physical reads) /</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">(buffer pool data logical reads + pool index logical reads))</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">) * 100%</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">这个计算考虑了缓冲池高速缓存的所有页（索引和数据）。理想情况下，该比率应当超过 95%，并尽可能接近 100%。要提高缓冲池命中率，请尝试下面这些方法：</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">增加缓冲池大小。&nbsp;</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">考虑分配多个缓冲池，如果可能的话，为每个经常被访问的大表所属的表空间分配一个缓冲池，为一组小表分配一个缓冲池，然后尝试一下使用不同大小的缓冲池以查看哪种组合会提供最佳性能。&nbsp;</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word;">如果已分配的内存不能帮助提高性能，那么请避免给缓冲池分配过多的内存。应当根据取自测试环境的快照信息来决定缓冲池的大小。</div></div></td></tr></tbody></table></div><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4d4d4d; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">缓冲池命中率</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4d4d4d; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">这个比率说明了为页面请求提供服务时，数据库管理器不需从磁盘装入页（即该页已经在缓冲池中）就能处理页请求的时间百分比。</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4d4d4d; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">计算：</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4d4d4d; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">BPHR = (1 - ((缓冲池数据物理读 + 缓冲池索引物理读) /</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4d4d4d; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">(缓冲池数据逻辑读 + 缓冲池索引逻辑读) ) ) * 100%</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4d4d4d; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">索引命中率</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4d4d4d; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">这个比率表明了可以在缓冲池中找到的页面能够满足的对索引页的所有读请求所占的百分比。</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4d4d4d; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">计算：</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4d4d4d; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">IHR = (1 - (缓冲池索引物理读 / 缓冲池索引逻辑读) ) ) * 100%</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4d4d4d; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">数据命中率</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4d4d4d; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">这个比率说明了可以在缓冲池中找到的页面能够满足的对数据页的所有读请求所占的百分比。</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4d4d4d; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">计算：</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4d4d4d; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">DHR = (1 - (缓冲池数据物理读 / 缓冲池数据逻辑读) ) ) * 100%</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4d4d4d; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">结论</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4d4d4d; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">缓冲池命中率大于 80% 被认为是理想的。对于 OLTP 系统来说，该值的理想情况是尽可能接近于 100% （索引命中率更是如此）。</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4d4d4d; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">要提高缓冲池的命中率，可以增加缓冲池的大小，也可以考虑分配多个缓冲池，可以为每个经常访问的具有自己的表空间的大型表使用一个缓冲池，也可以为一组小型表使用一个缓冲池。</p></div><img src ="http://www.cppblog.com/prayer/aggbug/216446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2019-06-24 10:09 <a href="http://www.cppblog.com/prayer/archive/2019/06/24/216446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>db2 查看 修改 端口号</title><link>http://www.cppblog.com/prayer/archive/2019/03/25/216311.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Mon, 25 Mar 2019 03:41:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2019/03/25/216311.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/216311.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2019/03/25/216311.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/216311.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/216311.html</trackback:ping><description><![CDATA[<p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4f4f4f; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;"><span style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-family: 'Microsoft YaHei'; word-wrap: break-word;">db2安装完成后，tcp/ip连接端口默认为50000，可通过下面的方法确认：</span></p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4f4f4f; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">&nbsp;</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4f4f4f; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;"><span style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-family: 'Microsoft YaHei'; word-wrap: break-word;">1、使用命令 db2 get dbm cfg |find "SVCENAME" 查找到TCP/IP 服务名</span></p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4f4f4f; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">&nbsp;</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4f4f4f; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;"><span style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-family: 'Microsoft YaHei'; word-wrap: break-word;">2、到系统配置文件里找到service name 对应的 port number<br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; word-wrap: break-word;" /><a href="https://www.baidu.com/s?wd=windows&amp;tn=24004469_oem_dg&amp;rsv_dl=gh_pl_sl_csd" target="_blank" style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; color: #6795b5; text-decoration: none; cursor: pointer; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; word-wrap: break-word;">windows</a>：查看 c:\windows\system32\drivers\etc\<a href="https://www.baidu.com/s?wd=services&amp;tn=24004469_oem_dg&amp;rsv_dl=gh_pl_sl_csd" target="_blank" style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; color: #6795b5; text-decoration: none; cursor: pointer; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; word-wrap: break-word;">services</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4f4f4f; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;"><span style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-family: 'Microsoft YaHei'; word-wrap: break-word;">aix：&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查看 /etc/services</span></p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4f4f4f; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;"><span style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-family: 'Microsoft YaHei'; word-wrap: break-word;">如下：</span></p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4f4f4f; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;"><span style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-family: 'Microsoft YaHei'; word-wrap: break-word;">DB2_DB2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;60000/tcp<br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; word-wrap: break-word;" />DB2_DB2_1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 60001/tcp<br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; word-wrap: break-word;" />DB2_DB2_2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 60002/tcp<br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; word-wrap: break-word;" />DB2_DB2_END&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;60003/tcp</span></p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4f4f4f; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;"><span style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-family: 'Microsoft YaHei'; word-wrap: break-word;">db2c_DB2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;50000/tcp</span></p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4f4f4f; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">&nbsp;</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4f4f4f; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;"><span style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-family: 'Microsoft YaHei'; word-wrap: break-word;">3、使用 netstat -an 命令查找tcp/ip 服务的端口</span></p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4f4f4f; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;"><span style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-family: 'Microsoft YaHei'; word-wrap: break-word;">&nbsp;<br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; word-wrap: break-word;" />4、修改端口号<br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; word-wrap: break-word;" />&nbsp;&nbsp;&nbsp;直接修改services文件中当前服务名对应的端口号<br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; word-wrap: break-word;" />如：db2c_DB2&nbsp;50000/tcp<br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; word-wrap: break-word;" />然后重启数据库即OK&nbsp; db2stop&nbsp; db2start<br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; word-wrap: break-word;" /></span></p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4f4f4f; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;"><span style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-family: 'Microsoft YaHei'; word-wrap: break-word;">5、另外附上一个关于<a href="https://www.baidu.com/s?wd=linux%E7%B3%BB%E7%BB%9F&amp;tn=24004469_oem_dg&amp;rsv_dl=gh_pl_sl_csd" target="_blank" style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; color: #6795b5; text-decoration: none; cursor: pointer; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; word-wrap: break-word;">linux系统</a>下的查找方法（摘抄帖子）：</span></p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4f4f4f; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;"><span style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-family: 'Microsoft YaHei'; word-wrap: break-word;">In JDBC configurations for WPA, you have to specify the port that DB2 is listening on. I usually look for /etc/services or try one of 50000/50001 and it usually works. In SUSE Linux, both the solutions did not work and there was another process (Multithreaded routing toolkit aka mrt) was listening on port 50000.</span></p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4f4f4f; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;"><span style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-family: 'Microsoft YaHei'; word-wrap: break-word;">So how do we find out the DB2 port in a reliable way? Read on...<br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; word-wrap: break-word;" />Step 1: Set the DB2 environment.<br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; word-wrap: break-word;" />$ . ~db2inst1/sqllib/db2profile</span></p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4f4f4f; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;"><span style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-family: 'Microsoft YaHei'; word-wrap: break-word;">Step 2: Find the service name for DB2 instance. It basically involves running "db2 get dbm cfg" command and finding a line containing SVCENAME.&nbsp;<br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; word-wrap: break-word;" />$ svc=`db2 get dbm cfg | grep SVCENAME | cut -d= -f2 | awk '{print $1}'`</span></p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4f4f4f; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;"><span style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-family: 'Microsoft YaHei'; word-wrap: break-word;">Step 3: Find the service name that you got from Step 2 in /etc/services or %SYSTEMROOT%\system32\drivers\etc\services. That is the port DB2 is listening on. $ grep $svc /etc/services</span></p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4f4f4f; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">&nbsp;</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4f4f4f; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;"><span style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-family: 'Microsoft YaHei'; word-wrap: break-word;">Hope you find this useful.<br /><br /><br /><br /><br /></span></p><p style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.7rem; padding: 0px; max-width: 100%; font-size: 16px; word-break: break-all; color: #3d464d; line-height: 1.8; word-wrap: break-word;"><span style="font-family: 微软雅黑, 'Microsoft YaHei'; -webkit-font-smoothing: antialiased; margin: 0px; padding: 0px; max-width: 100%; word-break: break-all;">用sqoop做测试，发现端口号50000被占用了，所以就更改了一下DB2的端口号。</span></p><p style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.7rem; padding: 0px; max-width: 100%; font-size: 16px; word-break: break-all; color: #3d464d; line-height: 1.8; word-wrap: break-word;"><br style="-webkit-font-smoothing: antialiased; margin: 0px; padding: 0px; max-width: 100%; word-break: break-all;" /></p><p style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.7rem; padding: 0px; max-width: 100%; font-size: 16px; word-break: break-all; color: #3d464d; line-height: 1.8; word-wrap: break-word;"><span style="font-family: 微软雅黑, 'Microsoft YaHei'; -webkit-font-smoothing: antialiased; margin: 0px; padding: 0px; max-width: 100%; word-break: break-all;">第一步，登录DB2数据库的实例用户，我这里是db2inst1</span></p><p style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.7rem; padding: 0px; max-width: 100%; font-size: 16px; word-break: break-all; color: #3d464d; line-height: 1.8; word-wrap: break-word;"><span style="font-family: 微软雅黑, 'Microsoft YaHei'; -webkit-font-smoothing: antialiased; margin: 0px; padding: 0px; max-width: 100%; word-break: break-all; font-weight: bold;">db2 get dbm cfg|grep SVCENAME</span></p><p style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.7rem; padding: 0px; max-width: 100%; font-size: 16px; word-break: break-all; color: #3d464d; line-height: 1.8; word-wrap: break-word;"><span style="font-family: 微软雅黑, 'Microsoft YaHei'; -webkit-font-smoothing: antialiased; margin: 0px; padding: 0px; max-width: 100%; word-break: break-all;">可以看到对应的SVCENAME的名称是什么。</span></p><p style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.7rem; padding: 0px; max-width: 100%; font-size: 16px; word-break: break-all; color: #3d464d; line-height: 1.8; word-wrap: break-word;"><img src="https://blog.51cto.com/static/js/ueditor1.4.3/themes/default/images/spacer.gif" style="-webkit-font-smoothing: antialiased; margin: 0px 0px 15px; padding: 0px; border: none; max-width: 100%; word-break: break-all; cursor: pointer;"  alt="" /><img src="https://s1.51cto.com/images/20171205/1512443775679086.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" title="1512443775679086.png" alt="clipboard.png" style="-webkit-font-smoothing: antialiased; margin: 0px 0px 15px; padding: 0px; border: none; max-width: 100%; word-break: break-all; cursor: pointer;" /></p><p style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.7rem; padding: 0px; max-width: 100%; font-size: 16px; word-break: break-all; color: #3d464d; line-height: 1.8; word-wrap: break-word;"><span style="font-family: 微软雅黑, 'Microsoft YaHei'; -webkit-font-smoothing: antialiased; margin: 0px; padding: 0px; max-width: 100%; word-break: break-all;"><br style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px; padding: 0px; max-width: 100%; word-break: break-all;" /></span></p><p style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.7rem; padding: 0px; max-width: 100%; font-size: 16px; word-break: break-all; color: #3d464d; line-height: 1.8; word-wrap: break-word;"><span style="font-family: 微软雅黑, 'Microsoft YaHei'; -webkit-font-smoothing: antialiased; margin: 0px; padding: 0px; max-width: 100%; word-break: break-all; color: #00b0f0;">这里容易出现一个问题。按照网上有人说的，会将SVCENAME改为端口号，那个是错误的。一定要将这个名称和services中的名称统一。</span></p><p style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.7rem; padding: 0px; max-width: 100%; font-size: 16px; word-break: break-all; color: #3d464d; line-height: 1.8; word-wrap: break-word;"><span style="font-family: 微软雅黑, 'Microsoft YaHei'; -webkit-font-smoothing: antialiased; margin: 0px; padding: 0px; max-width: 100%; word-break: break-all;"><br style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px; padding: 0px; max-width: 100%; word-break: break-all;" /></span></p><p style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.7rem; padding: 0px; max-width: 100%; font-size: 16px; word-break: break-all; color: #3d464d; line-height: 1.8; word-wrap: break-word;"><span style="font-family: 微软雅黑, 'Microsoft YaHei'; -webkit-font-smoothing: antialiased; margin: 0px; padding: 0px; max-width: 100%; word-break: break-all;">第二步，退回到root用户，</span></p><p style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.7rem; padding: 0px; max-width: 100%; font-size: 16px; word-break: break-all; color: #3d464d; line-height: 1.8; word-wrap: break-word;"><span style="font-family: 微软雅黑, 'Microsoft YaHei'; -webkit-font-smoothing: antialiased; margin: 0px; padding: 0px; max-width: 100%; word-break: break-all;"><span style="-webkit-font-smoothing: antialiased; margin: 0px; padding: 0px; max-width: 100%; word-break: break-all; font-weight: bold;">vim /etc/services</span>，找到对应的SVCENAME的名称所对应的端口号。</span></p><p style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.7rem; padding: 0px; max-width: 100%; font-size: 16px; word-break: break-all; color: #3d464d; line-height: 1.8; word-wrap: break-word;"><span style="font-family: 微软雅黑, 'Microsoft YaHei'; -webkit-font-smoothing: antialiased; margin: 0px; padding: 0px; max-width: 100%; word-break: break-all;">我这里直接编辑成50001</span></p><p style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.7rem; padding: 0px; max-width: 100%; font-size: 16px; word-break: break-all; color: #3d464d; line-height: 1.8; word-wrap: break-word;"><span style="font-family: 微软雅黑, 'Microsoft YaHei'; -webkit-font-smoothing: antialiased; margin: 0px; padding: 0px; max-width: 100%; word-break: break-all;"><img src="https://s1.51cto.com/images/20171205/1512443868871361.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=" title="1512443868871361.png" alt="clipboard.png" style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px 0px 15px; padding: 0px; border: none; max-width: 100%; word-break: break-all; cursor: pointer;" /></span></p><p style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.7rem; padding: 0px; max-width: 100%; font-size: 16px; word-break: break-all; color: #3d464d; line-height: 1.8; word-wrap: break-word;"><img src="https://blog.51cto.com/static/js/ueditor1.4.3/themes/default/images/spacer.gif" style="-webkit-font-smoothing: antialiased; margin: 0px 0px 15px; padding: 0px; border: none; max-width: 100%; word-break: break-all; cursor: pointer;"  alt="" /></p><p style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.7rem; padding: 0px; max-width: 100%; font-size: 16px; word-break: break-all; color: #3d464d; line-height: 1.8; word-wrap: break-word;"><span style="font-family: 微软雅黑, 'Microsoft YaHei'; -webkit-font-smoothing: antialiased; margin: 0px; padding: 0px; max-width: 100%; word-break: break-all;">第三步，先关数据库，再开就可以了。</span></p><p style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.7rem; padding: 0px; max-width: 100%; font-size: 16px; word-break: break-all; color: #3d464d; line-height: 1.8; word-wrap: break-word;"><strong style="-webkit-font-smoothing: antialiased; margin: 0px; padding: 0px; max-width: 100%; word-break: break-all;"><span style="font-family: 微软雅黑, 'Microsoft YaHei'; -webkit-font-smoothing: antialiased; margin: 0px; padding: 0px; max-width: 100%; word-break: break-all;">db2stop</span></strong></p><p style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.7rem; padding: 0px; max-width: 100%; font-size: 16px; word-break: break-all; color: #3d464d; line-height: 1.8; word-wrap: break-word;"><strong style="-webkit-font-smoothing: antialiased; margin: 0px; padding: 0px; max-width: 100%; word-break: break-all;"><span style="font-family: 微软雅黑, 'Microsoft YaHei'; -webkit-font-smoothing: antialiased; margin: 0px; padding: 0px; max-width: 100%; word-break: break-all;">db2start</span></strong></p><p style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.7rem; padding: 0px; max-width: 100%; font-size: 16px; word-break: break-all; color: #3d464d; line-height: 1.8; word-wrap: break-word;"><strong style="-webkit-font-smoothing: antialiased; margin: 0px; padding: 0px; max-width: 100%; word-break: break-all;"><span style="font-family: 微软雅黑, 'Microsoft YaHei'; -webkit-font-smoothing: antialiased; margin: 0px; padding: 0px; max-width: 100%; word-break: break-all;"><br style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px; padding: 0px; max-width: 100%; word-break: break-all;" /></span></strong></p><p style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.7rem; padding: 0px; max-width: 100%; font-size: 16px; word-break: break-all; color: #3d464d; line-height: 1.8; word-wrap: break-word;"><span style="font-family: 微软雅黑, 'Microsoft YaHei'; -webkit-font-smoothing: antialiased; margin: 0px; padding: 0px; max-width: 100%; word-break: break-all;">实际上没有复杂的步骤，只是好多人写的比较的乱，还不加解释说明，所以坑了些。</span></p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4f4f4f; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;"><span style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-family: 'Microsoft YaHei'; word-wrap: break-word;"><br /><br /></span></p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft Yahei', 微软雅黑, arial, 宋体, sans-serif; font-size: 16px; color: #333333; line-height: 28px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff; text-align: justify;">可以通过db2 get dbm cfg，查询数据库管理器配置参数，就可以查到端口号或端口名。</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft Yahei', 微软雅黑, arial, 宋体, sans-serif; font-size: 16px; color: #333333; line-height: 28px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">示例：</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft Yahei', 微软雅黑, arial, 宋体, sans-serif; font-size: 16px; color: #333333; line-height: 28px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">$ db2 get dbm cfg | grep -i svcTCP/IP Service name (SVCENAME) = 50000</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft Yahei', 微软雅黑, arial, 宋体, sans-serif; font-size: 16px; color: #333333; line-height: 28px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">50000就是端口号了。</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft Yahei', 微软雅黑, arial, 宋体, sans-serif; font-size: 16px; color: #333333; line-height: 28px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;"><br style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; word-wrap: break-word;" /></p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft Yahei', 微软雅黑, arial, 宋体, sans-serif; font-size: 16px; color: #333333; line-height: 28px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;"></p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft Yahei', 微软雅黑, arial, 宋体, sans-serif; font-size: 16px; color: #333333; line-height: 28px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">如果查到的是端口名，可以通过网络服务配置文件来找到对应关系。</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft Yahei', 微软雅黑, arial, 宋体, sans-serif; font-size: 16px; color: #333333; line-height: 28px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">示例：</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft Yahei', 微软雅黑, arial, 宋体, sans-serif; font-size: 16px; color: #333333; line-height: 28px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">$ db2 get dbm cfg | grep -i svc</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft Yahei', 微软雅黑, arial, 宋体, sans-serif; font-size: 16px; color: #333333; line-height: 28px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">TCP/IP Service name (SVCENAME) = db2c_DB2</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft Yahei', 微软雅黑, arial, 宋体, sans-serif; font-size: 16px; color: #333333; line-height: 28px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">这时，就需要查找db2c_DB2对应的端口号了。</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft Yahei', 微软雅黑, arial, 宋体, sans-serif; font-size: 16px; color: #333333; line-height: 28px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">$ cat&nbsp;/etc/services | grep&nbsp;db2c_DB2</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft Yahei', 微软雅黑, arial, 宋体, sans-serif; font-size: 16px; color: #333333; line-height: 28px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">db2c_DB2 60000/tcp</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft Yahei', 微软雅黑, arial, 宋体, sans-serif; font-size: 16px; color: #333333; line-height: 28px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">这个60000就是端口号了。</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft Yahei', 微软雅黑, arial, 宋体, sans-serif; font-size: 16px; color: #333333; line-height: 28px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;">如果DB2是装在windows的server上，那么就需要查找这个配置文件了，C:\WINDOWS\system32\drivers\etc\services格式：db2c_DB2 50000/tcp</p><p style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; font-size: 16px; color: #4f4f4f; line-height: 26px; overflow-x: auto; word-wrap: break-word; background-color: #ffffff;"><span style="box-sizing: border-box; outline: 0px; margin: 0px; padding: 0px; font-family: 'Microsoft YaHei'; word-wrap: break-word;"><br /><br /></span></p><img src ="http://www.cppblog.com/prayer/aggbug/216311.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2019-03-25 11:41 <a href="http://www.cppblog.com/prayer/archive/2019/03/25/216311.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>not in/not exists 的 null 陷阱</title><link>http://www.cppblog.com/prayer/archive/2019/01/11/216187.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Fri, 11 Jan 2019 01:45:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2019/01/11/216187.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/216187.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2019/01/11/216187.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/216187.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/216187.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: https://www.cnblogs.com/killkill/archive/2010/09/04/1817266.html以前遇到了 not in 子查询的一个 null 陷阱，有经验的朋友可能知道怎么回事了，用代码来说就是：1234567891011121314151617-- 创建两张测试表：create&nbsp;table&nbsp;tmp01 aswith&nbsp;tmp as&...&nbsp;&nbsp;<a href='http://www.cppblog.com/prayer/archive/2019/01/11/216187.html'>阅读全文</a><img src ="http://www.cppblog.com/prayer/aggbug/216187.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2019-01-11 09:45 <a href="http://www.cppblog.com/prayer/archive/2019/01/11/216187.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sql 在not in 子查询有null值情况下经常出现的陷阱</title><link>http://www.cppblog.com/prayer/archive/2019/01/11/216186.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Fri, 11 Jan 2019 01:40:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2019/01/11/216186.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/216186.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2019/01/11/216186.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/216186.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/216186.html</trackback:ping><description><![CDATA[<div>http://www.cnblogs.com/51net/p/4165781.html<br /><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">如果下：Table_A表和Table_B表，要求查询出在Table_A表中不在Table_B表中的记录。</p><div style="margin: 5px 0px; font-size: 12px !important;"><img id="code_img_opened_6d27530e-5e96-4b9f-b94c-41d81c347ece" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" style="margin: 0px; padding-top: 0px; padding-bottom: 0px; padding-left: 0px; border: 0px; max-width: 820px; height: auto;" /><div id="cnblogs_code_open_6d27530e-5e96-4b9f-b94c-41d81c347ece" style="margin: 0px;"><div style="margin: 5px 0px 0px;"><span style="margin: 0px; padding: 0px 5px 0px 0px; line-height: 1.5 !important;"><a title="复制代码" style="margin: 0px; padding: 0px; text-decoration: underline; border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="margin: 0px; padding: 0px; max-width: 820px; height: auto; border: none !important;" /></a></span></div><pre style="margin-top: 0px; margin-bottom: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: 'Courier New' !important;"><span style="margin: 0px; padding: 0px; line-height: 1.5 !important;">CREATE TABLE [dbo].[Table_A](  [ID] [nchar](</span><span style="margin: 0px; padding: 0px; color: #800080; line-height: 1.5 !important;">10</span><span style="margin: 0px; padding: 0px; line-height: 1.5 !important;">) NULL,  [Name] [nchar](</span><span style="margin: 0px; padding: 0px; color: #800080; line-height: 1.5 !important;">10</span><span style="margin: 0px; padding: 0px; line-height: 1.5 !important;">) NULL ) ON [PRIMARY]  GO  ID          Name </span><span style="margin: 0px; padding: 0px; color: #800080; line-height: 1.5 !important;">001</span><span style="margin: 0px; padding: 0px; line-height: 1.5 !important;">        张三         </span><span style="margin: 0px; padding: 0px; color: #800080; line-height: 1.5 !important;">002</span><span style="margin: 0px; padding: 0px; line-height: 1.5 !important;">        李四         </span><span style="margin: 0px; padding: 0px; color: #800080; line-height: 1.5 !important;">003</span><span style="margin: 0px; padding: 0px; line-height: 1.5 !important;">        王五                   CREATE TABLE [dbo].[Table_B](  [ID] [nchar](</span><span style="margin: 0px; padding: 0px; color: #800080; line-height: 1.5 !important;">10</span><span style="margin: 0px; padding: 0px; line-height: 1.5 !important;">) NULL,  [Name] [nchar](</span><span style="margin: 0px; padding: 0px; color: #800080; line-height: 1.5 !important;">10</span><span style="margin: 0px; padding: 0px; line-height: 1.5 !important;">) NULL ) ON [PRIMARY]  GO  ID        Name NULL     张三         </span><span style="margin: 0px; padding: 0px; color: #800080; line-height: 1.5 !important;">002</span><span style="margin: 0px; padding: 0px; line-height: 1.5 !important;">       李四         NULL     王五 </span></pre><div style="margin: 5px 0px 0px;"><span style="margin: 0px; padding: 0px 5px 0px 0px; line-height: 1.5 !important;"><a title="复制代码" style="margin: 0px; padding: 0px; text-decoration: underline; border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="margin: 0px; padding: 0px; max-width: 820px; height: auto; border: none !important;" /></a></span></div></div></div><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">&nbsp;</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">很容大家第一时间相当的写法是：</p><div style="margin: 5px 0px; font-size: 12px !important;"><pre style="margin-top: 0px; margin-bottom: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: 'Courier New' !important;"><span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">SELECT</span>  <span style="margin: 0px; padding: 0px; color: #808080; line-height: 1.5 !important;">*</span> <span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">FROM</span>    dbo.Table_A <span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">AS</span><span style="margin: 0px; padding: 0px; line-height: 1.5 !important;"> a </span><span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">WHERE</span>   a.ID <span style="margin: 0px; padding: 0px; color: #808080; line-height: 1.5 !important;">NOT</span> <span style="margin: 0px; padding: 0px; color: #808080; line-height: 1.5 !important;">IN</span> ( <span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">SELECT</span><span style="margin: 0px; padding: 0px; line-height: 1.5 !important;">    b.ID                       </span><span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">FROM</span>      dbo.Table_B <span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">AS</span> b)</pre></div><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">然而查询出来并没有达到预期的</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">ID&nbsp;&nbsp;&nbsp; Name<br style="margin: 0px; padding: 0px;" />001&nbsp;&nbsp;张三&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br style="margin: 0px; padding: 0px;" />003&nbsp;&nbsp;王五&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">原因很简单：由于NULL不能进行如何的&#8220;操作&#8221;</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">&#8211;如果null参与算术运算，则该算术表达式的值为null。（例如：+，-，*，/ 加减乘除）</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">&#8211;如果null参与比较运算，则结果可视为false。（例如：&gt;=,&lt;=,&lt;&gt;&nbsp; 大于，小于，不等于）</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">&#8211;如果null参与聚集运算，则聚集函数都置为null。除count(*)之外。</p><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">--如果在not in子查询中有null值的时候,则不会返回数据。&nbsp;&nbsp;（最简单的解释请参考下面的评论说明）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p><div style="margin: 5px 0px; font-size: 12px !important;"><img id="code_img_opened_760e3223-d8d4-4010-b307-5206ce6fb55c" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="" style="margin: 0px; padding-top: 0px; padding-bottom: 0px; padding-left: 0px; border: 0px; max-width: 820px; height: auto;" /><div id="cnblogs_code_open_760e3223-d8d4-4010-b307-5206ce6fb55c" style="margin: 0px;"><div style="margin: 5px 0px 0px;"><span style="margin: 0px; padding: 0px 5px 0px 0px; line-height: 1.5 !important;"><a title="复制代码" style="margin: 0px; padding: 0px; text-decoration: underline; border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="margin: 0px; padding: 0px; max-width: 820px; height: auto; border: none !important;" /></a></span></div><pre style="margin-top: 0px; margin-bottom: 0px; padding: 0px; white-space: pre-wrap; word-wrap: break-word; font-family: 'Courier New' !important;"><span style="margin: 0px; padding: 0px; color: #008080; line-height: 1.5 !important;">--</span><span style="margin: 0px; padding: 0px; color: #008080; line-height: 1.5 !important;">正确写法                      </span> <span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">SELECT</span>  <span style="margin: 0px; padding: 0px; color: #808080; line-height: 1.5 !important;">*</span> <span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">FROM</span>    dbo.Table_A <span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">AS</span><span style="margin: 0px; padding: 0px; line-height: 1.5 !important;"> a </span><span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">WHERE</span>   a.ID <span style="margin: 0px; padding: 0px; color: #808080; line-height: 1.5 !important;">NOT</span> <span style="margin: 0px; padding: 0px; color: #808080; line-height: 1.5 !important;">IN</span> ( <span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">SELECT</span><span style="margin: 0px; padding: 0px; line-height: 1.5 !important;">    b.ID                       </span><span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">FROM</span>      dbo.Table_B <span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">AS</span><span style="margin: 0px; padding: 0px; line-height: 1.5 !important;"> b                       </span><span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">WHERE</span>     b.ID <span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">IS</span> <span style="margin: 0px; padding: 0px; color: #808080; line-height: 1.5 !important;">NOT</span> <span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">NULL</span> ) <span style="margin: 0px; padding: 0px; color: #008080; line-height: 1.5 !important;">--</span><span style="margin: 0px; padding: 0px; color: #008080; line-height: 1.5 !important;">排除NULL值参与运算符比较</span>                        <span style="margin: 0px; padding: 0px; color: #008080; line-height: 1.5 !important;">--</span><span style="margin: 0px; padding: 0px; color: #008080; line-height: 1.5 !important;">建议修改为关联查询方法                                            </span><span style="margin: 0px; padding: 0px; color: #008080; line-height: 1.5 !important;"> --</span><span style="margin: 0px; padding: 0px; color: #008080; line-height: 1.5 !important;">正确写法1             </span> <span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">SELECT</span>  <span style="margin: 0px; padding: 0px; color: #808080; line-height: 1.5 !important;">*</span> <span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">FROM</span>    dbo.Table_A <span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">AS</span><span style="margin: 0px; padding: 0px; line-height: 1.5 !important;"> a </span><span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">WHERE</span>   <span style="margin: 0px; padding: 0px; color: #808080; line-height: 1.5 !important;">NOT</span> <span style="margin: 0px; padding: 0px; color: #808080; line-height: 1.5 !important;">EXISTS</span> ( <span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">SELECT</span> <span style="margin: 0px; padding: 0px; color: #808080; line-height: 1.5 !important;">*</span>                      <span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">FROM</span>   dbo.Table_B <span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">AS</span><span style="margin: 0px; padding: 0px; line-height: 1.5 !important;"> b                      </span><span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">WHERE</span>  a.ID <span style="margin: 0px; padding: 0px; color: #808080; line-height: 1.5 !important;">=</span><span style="margin: 0px; padding: 0px; line-height: 1.5 !important;"> b.ID ) </span><span style="margin: 0px; padding: 0px; color: #008080; line-height: 1.5 !important;">--</span><span style="margin: 0px; padding: 0px; color: #008080; line-height: 1.5 !important;">正确写法2                     </span> <span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">SELECT</span>  <span style="margin: 0px; padding: 0px; color: #808080; line-height: 1.5 !important;">*</span> <span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">FROM</span>    dbo.Table_A <span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">AS</span><span style="margin: 0px; padding: 0px; line-height: 1.5 !important;"> a         </span><span style="margin: 0px; padding: 0px; color: #808080; line-height: 1.5 !important;">LEFT</span> <span style="margin: 0px; padding: 0px; color: #808080; line-height: 1.5 !important;">OUTER</span> <span style="margin: 0px; padding: 0px; color: #808080; line-height: 1.5 !important;">JOIN</span> dbo.Table_B <span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">AS</span> b <span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">ON</span> a.ID <span style="margin: 0px; padding: 0px; color: #808080; line-height: 1.5 !important;">=</span><span style="margin: 0px; padding: 0px; line-height: 1.5 !important;"> b.ID </span><span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">WHERE</span>   b.ID <span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">IS</span> <span style="margin: 0px; padding: 0px; color: #0000ff; line-height: 1.5 !important;">NULL</span></pre><div style="margin: 5px 0px 0px;"><span style="margin: 0px; padding: 0px 5px 0px 0px; line-height: 1.5 !important;"><a title="复制代码" style="margin: 0px; padding: 0px; text-decoration: underline; border: none !important;"><img src="http://common.cnblogs.com/images/copycode.gif" alt="复制代码" style="margin: 0px; padding: 0px; max-width: 820px; height: auto; border: none !important;" /></a></span></div></div></div><p style="margin-top: 10px; margin-bottom: 10px; padding: 0px; font-family: Verdana, Arial, Helvetica, sans-serif; background-color: #ffffff;">&nbsp;</p></div><img src ="http://www.cppblog.com/prayer/aggbug/216186.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2019-01-11 09:40 <a href="http://www.cppblog.com/prayer/archive/2019/01/11/216186.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DB2 对于null和''的区别</title><link>http://www.cppblog.com/prayer/archive/2019/01/11/216185.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Fri, 11 Jan 2019 01:33:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2019/01/11/216185.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/216185.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2019/01/11/216185.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/216185.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/216185.html</trackback:ping><description><![CDATA[<span style="color: #333333; font-family: -apple-system, 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun; background-color: #ffffff;">null 当做一种情况 显示null,不占内存 &nbsp;'',显示为空白,占内存, 判断null 只能使用is null, &nbsp;如!='',不包含=null这种情况, &nbsp;对于一些数据库的插入时,应注意 为null时,可能取不出数据,导致吓一跳插入语句,参数错误,直接报错 &nbsp;----1580 工作流 感想<br /></span><p style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.7rem; padding: 0px; max-width: 100%; font-size: 16px; word-break: break-all; color: #3d464d; line-height: 1.8; word-wrap: break-word;">在DB2中，null和&#8216;&#8217;是完全不同的两个东西。</p><p style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.7rem; padding: 0px; max-width: 100%; font-size: 16px; word-break: break-all; color: #3d464d; line-height: 1.8; word-wrap: break-word;">NULL是一个不确定值它不能通过列值过滤，只能通过IS NULL 或者IS NOT NULL方式过滤</p><p style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.7rem; padding: 0px; max-width: 100%; font-size: 16px; word-break: break-all; color: #3d464d; line-height: 1.8; word-wrap: break-word;">而&#8216;&#8217;可以用in，=，&lt;&gt;,&gt;,&lt;来比较判断。<br style="-webkit-font-smoothing: antialiased; margin: 0px; padding: 0px; max-width: 100%; word-break: break-all;" /></p><p style="font-family: -apple-system, 'Helvetica Neue', Helvetica, Arial, 'PingFang SC', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', 'Microsoft Yahei', sans-serif; -webkit-font-smoothing: antialiased; margin: 0px 0px 0.7rem; padding: 0px; max-width: 100%; font-size: 16px; word-break: break-all; color: #3d464d; line-height: 1.8; word-wrap: break-word;">此外，若一个属性的值为null，则select显示时，会以-代替，而&#8216;&#8217;则直接什么都不显示</p><span style="color: #333333; font-family: -apple-system, 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun; background-color: #ffffff;"><br /><br /></span><img src ="http://www.cppblog.com/prayer/aggbug/216185.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2019-01-11 09:33 <a href="http://www.cppblog.com/prayer/archive/2019/01/11/216185.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用where in遇到null时的解决方法1</title><link>http://www.cppblog.com/prayer/archive/2019/01/11/216184.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Fri, 11 Jan 2019 01:33:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2019/01/11/216184.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/216184.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2019/01/11/216184.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/216184.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/216184.html</trackback:ping><description><![CDATA[<div>参考：https://www.2cto.com/database/201109/104960.html；http://ask.csdn.net/questions/680006</div><div></div><div>1 ： &nbsp;</div><div></div><div>SELECT</div><div></div><div>*&nbsp;</div><div>FROM</div><div>华东&nbsp;</div><div>WHERE</div><div>公司代码 IN ( SELECT 公司代 FROM 备选客户 WHERE 公司代 != '' AND 公司代 IS NOT NULL );</div><div></div><div>2：用exists替换</div><div></div><div>SELECT</div><div>*&nbsp;</div><div>FROM</div><div>华东&nbsp;</div><div>WHERE</div><div>EXISTS (</div><div>SELECT</div><div>公司代&nbsp;</div><div>FROM</div><div></div><div>备选客户 where 华东.公司代码=`备选客户`.公司代);</div><div></div><div>3： in和exists一点区别</div><div></div><div></div><div>exists做为where 条件时，是先对where 前的主查询询进行查询，然后用主查询的结果一个一个的代入exists的查询进行判断，如果为真则输出当前这一条主查询的结果，否则不输出。</div><div></div><div>in 是把外表和内表作hash 连接，而exists是对外表作loop循环，每次loop循环再对内表进行查询。一直以来认为exists比in效率高的说法是不准确的。</div><div>如果查询的两个表大小相当，那么用in和exists差别不大。</div><div>如果两个表中一个较小，一个是大表，则子查询表大的用exists，子查询表小的用in：</div><div>---------------------&nbsp;</div><div>作者：csdncooker&nbsp;</div><div>来源：CSDN&nbsp;</div><div>原文：https://blog.csdn.net/csdncooker/article/details/79299258&nbsp;</div><div>版权声明：本文为博主原创文章，转载请附上博文链接！</div><img src ="http://www.cppblog.com/prayer/aggbug/216184.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2019-01-11 09:33 <a href="http://www.cppblog.com/prayer/archive/2019/01/11/216184.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>db2之in和exist的性能区别</title><link>http://www.cppblog.com/prayer/archive/2019/01/10/216180.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Thu, 10 Jan 2019 03:38:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2019/01/10/216180.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/216180.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2019/01/10/216180.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/216180.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/216180.html</trackback:ping><description><![CDATA[<div>https://blog.csdn.net/zhan19861022/article/details/7697652</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word; color: #333333; font-family: -apple-system, 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun; background-color: #ffffff;"><span style="box-sizing: border-box; outline: 0px; font-weight: 700; word-wrap: break-word;">一、IN 和EXISTS的性能区别</span></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word; color: #333333; font-family: -apple-system, 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun; background-color: #ffffff;"><span style="box-sizing: border-box; outline: 0px; font-weight: 700; word-wrap: break-word;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span>in 是把外表和内表作hash 连接，而exists是对外表作loop循环，每次loop循环再对内表进行查询。&nbsp;</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word; color: #333333; font-family: -apple-system, 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun; background-color: #ffffff;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word; color: #333333; font-family: -apple-system, 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun; background-color: #ffffff;">其实区分in和exists主要是造成了驱动顺序的改变（这是性能变化的关键），如果是exists，那么以外层表为驱动表，先被访问，如果是IN，那么先执行子查询，所以我们会以驱动表的快速返回为目标，那么就会考虑到索引及结果集的关系了。</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word; color: #333333; font-family: -apple-system, 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun; background-color: #ffffff;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word; color: #333333; font-family: -apple-system, 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun; background-color: #ffffff;">EXISTS的执行流程&nbsp;</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word; color: #333333; font-family: -apple-system, 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun; background-color: #ffffff;"><pre style="box-sizing: border-box; outline: 0px; padding: 8px; margin-top: 0px; margin-bottom: 24px; position: relative; font-family: Consolas, Inconsolata, Courier, monospace; white-space: pre-wrap; word-wrap: break-word; overflow-x: auto; line-height: 22px; color: #000000;"><code hljs"="" style="box-sizing: border-box; outline: 0px; font-family: 'Source Code Pro', 'DejaVu Sans Mono', 'Ubuntu Mono', 'Anonymous Pro', 'Droid Sans Mono', Menlo, Monaco, Consolas, Inconsolata, Courier, monospace, 'PingFang SC', 'Microsoft YaHei', sans-serif; display: block; overflow-x: auto; padding: 8px; color: #abb2bf; background-color: #282c34; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; white-space: pre; word-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; color: #c678dd; word-wrap: break-word;">select</span> * <span style="box-sizing: border-box; outline: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; color: #c678dd; word-wrap: break-word;">from</span> t1 <span style="box-sizing: border-box; outline: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; color: #c678dd; word-wrap: break-word;">where</span> <span style="box-sizing: border-box; outline: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; color: #c678dd; word-wrap: break-word;">exists</span> ( <span style="box-sizing: border-box; outline: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; color: #c678dd; word-wrap: break-word;">select</span> <span style="box-sizing: border-box; outline: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; color: #56b6c2; word-wrap: break-word;">null</span> <span style="box-sizing: border-box; outline: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; color: #c678dd; word-wrap: break-word;">from</span> t2 <span style="box-sizing: border-box; outline: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; color: #c678dd; word-wrap: break-word;">where</span> y = x ) </code></pre></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word; color: #333333; font-family: -apple-system, 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun; background-color: #ffffff;">可以理解为:&nbsp;</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word; color: #333333; font-family: -apple-system, 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun; background-color: #ffffff;"><pre style="box-sizing: border-box; outline: 0px; padding: 8px; margin-top: 0px; margin-bottom: 24px; position: relative; font-family: Consolas, Inconsolata, Courier, monospace; white-space: pre-wrap; word-wrap: break-word; overflow-x: auto; line-height: 22px; color: #000000;"><code hljs"="" style="box-sizing: border-box; outline: 0px; font-family: 'Source Code Pro', 'DejaVu Sans Mono', 'Ubuntu Mono', 'Anonymous Pro', 'Droid Sans Mono', Menlo, Monaco, Consolas, Inconsolata, Courier, monospace, 'PingFang SC', 'Microsoft YaHei', sans-serif; display: block; overflow-x: auto; padding: 8px; color: #abb2bf; background-color: #282c34; border-top-left-radius: 4px; border-top-right-radius: 4px; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; white-space: pre; word-wrap: break-word;">  <span style="box-sizing: border-box; outline: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; word-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; word-wrap: break-word;"><span style="box-sizing: border-box; outline: 0px; color: #c678dd; word-wrap: break-word;">for</span> x <span style="box-sizing: border-box; outline: 0px; color: #61aeee; word-wrap: break-word;">in</span> <span style="box-sizing: border-box; outline: 0px; word-wrap: break-word;">( select * from t1 )</span> </span> <span style="box-sizing: border-box; outline: 0px; word-wrap: break-word;">  loop </span> <span style="box-sizing: border-box; outline: 0px; word-wrap: break-word;">      <span style="box-sizing: border-box; outline: 0px; color: #61aeee; word-wrap: break-word;">if</span> <span style="box-sizing: border-box; outline: 0px; word-wrap: break-word;">( exists ( select <span style="box-sizing: border-box; outline: 0px; color: #c678dd; word-wrap: break-word;">null</span> from t2 where y = x.x )</span> </span> <span style="box-sizing: border-box; outline: 0px; word-wrap: break-word;">      then </span> <span style="box-sizing: border-box; outline: 0px; word-wrap: break-word;">        OUTPUT THE RECORD </span> <span style="box-sizing: border-box; outline: 0px; word-wrap: break-word;">      end <span style="box-sizing: border-box; outline: 0px; color: #c678dd; word-wrap: break-word;">if</span> </span> <span style="box-sizing: border-box; outline: 0px; word-wrap: break-word;">  end</span> <span style="box-sizing: border-box; outline: 0px; word-wrap: break-word;"> loop</span> </span></code></pre><br style="box-sizing: border-box; outline: 0px; word-wrap: break-word;" /></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word; color: #333333; font-family: -apple-system, 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun; background-color: #ffffff;"><span style="box-sizing: border-box; outline: 0px; font-weight: 700; word-wrap: break-word;">二、not in 和 not exists的性能区别：&nbsp;</span></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word; color: #333333; font-family: -apple-system, 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun; background-color: #ffffff;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;not in 只有当子查询中，select 关键字后的字段有not null约束或者有这种暗示时用not in,另外如果主查询中表大，子查询中的表小但是记录多，则应当使用not in,并使用anti hash join.&nbsp;</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word; color: #333333; font-family: -apple-system, 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun; background-color: #ffffff;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word; color: #333333; font-family: -apple-system, 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun; background-color: #ffffff;">&nbsp; &nbsp; &nbsp; &nbsp; 如果主查询表中记录少，子查询表中记录多，并有索引，可以使用not exists。如果查询语句使用了not in 那么内外表都进行全表扫描，没有用到索引；而not extsts 的子查询依然能用到表上的索引。所以无论哪个表大，用not exists都比not in要快。</div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word; color: #333333; font-family: -apple-system, 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun; background-color: #ffffff;"></div><div style="box-sizing: border-box; outline: 0px; margin: 0px; word-wrap: break-word; color: #333333; font-family: -apple-system, 'SF UI Text', Arial, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'WenQuanYi Micro Hei', sans-serif, SimHei, SimSun; background-color: #ffffff;">&nbsp; &nbsp; &nbsp; &nbsp;总结not exists &gt;&gt; not in，in与exists的使用<span style="box-sizing: border-box; outline: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; word-wrap: break-word;">取决于子查询集合大小</span>，<span style="box-sizing: border-box; outline: 0px; font-family: 'Microsoft YaHei', 'SF Pro Display', Roboto, Noto, Arial, 'PingFang SC', sans-serif; word-wrap: break-word;">IN适合于外表大而内表小的情况；EXISTS适合于外表小而内表大的情况</span>，即如果子查询得出的结果集记录较少，主查询中的表较大且又有索引时应该用in,反之如果外层的主查询记录较少，子查询中的表大，又有索引时使用exists。</div><img src ="http://www.cppblog.com/prayer/aggbug/216180.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2019-01-10 11:38 <a href="http://www.cppblog.com/prayer/archive/2019/01/10/216180.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Unix环境下嵌入式C程序编译 </title><link>http://www.cppblog.com/prayer/archive/2012/03/21/168489.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Wed, 21 Mar 2012 05:45:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2012/03/21/168489.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/168489.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2012/03/21/168489.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/168489.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/168489.html</trackback:ping><description><![CDATA[<div class="blog_content" id="blog_content">A.预编译部分 <br />1.预编译DB2篇 <br />1.1 什么是DB2预编译 <br />&nbsp; 在我们用C语言编写访问DB2的程序过程中,需要用到嵌入式SQL,其作用是将DB2 SQL混入一般C程序中, DB2预编译器可以将SQL语法直接转换为DB2行时服务应用程序编程接口（API）调用。 <br />1.2 什么是bind <br />&nbsp; 这是DB2 prep要做的事情，即把SQC中的SQL语句变为DB2数据库可认的API。bind的作用主要是根据你SQC中的SQL语句使用的表和操作指定一个访问时DB要使用的策略，是一种优化作用，加快数据访问的速度；当然也可以不bind，那样，访问的过程策略是在访问时才有的，速度会受很大的影响，特别是并发访问。 <br /><br />2.预编译命令 <br />&nbsp; 2.1 db2 prep .sqc文件 bindfile 其中bindfile参数作用是生成和sqc文件同名的.bnd文件 <br />例: db2 prep /export/home/shwhome/sqc/CON_DB2.sqc bindfile 如果编译正常完成,则在.sqc文件同目录下会生成CON_DB2.c和CON_DB2.bnd文件 <br />2.2 bind .bnd文件 <br />&nbsp; 例: db2 bind /export/home/shwhome/sqc/CON_DB2.bnd <br />因为是DB2的预编译命令,使用的是DB2的预编译器,所以以上两条命令需要在连接DB2数据库的情况下才可以使用 <br /><br />B.嵌入式部分 <br />1.嵌入式C程序的编译 <br />我们采用GCC来编译C程序,GCC的一般编译命令请参考文档中的相关说明,这里具体说明在目前环境下编译C程序的注意点。 <br />1.1 编译C程序 <br />gcc -m64 -c -I/export/home/shwhome/inc -o /export/home/shwhome/obj/testdb.o /export/home/shwhome/src/testdb.c <br />参数说明 <br />-m64: 在64位服务器上编译时采用,这里为了将所有的编译后的目标文件统一,所以都加上-m64,如果再之后引用目标文件没有采用-m64编译则在最后编译时会出现ELF CLASS32(或ELF CLASS64)错误. -C: 只编译并生成目标文件,不做链接。 <br />1.2 编译SQC文件生成的.C文件 <br />gcc -m64 -c -I/export/home/shwhome/inc -I/export/home/aix/sqllib/include -L/usr/include/lib -o /export/home/shwhome/obj/CON_DB2.o /export/home/shwhome/sqc/CON_DB2.c <br />参数说明 <br />-I/export/home/aix/sqllib/include: 这个目录下主要使用到2个头文件:sqladef.h和sqlca.h,这个是DB2预编译包含的都文件,可以查看你用prep编译出来的与.sqc同名的.C文件,其中就包含这两个头文件。其中aix是DB2Instance用户,DB2安装后会将include路径复制到instance用户的环境变量中,再次创建instance后只要复制过来就可以,因为Instance用户还包含其他的环境设定,所以不要直接引用-I/opt/IBM/db2/V9.5/include/这个DB2的安装路径 <br />-L/usr/include/lib: 这个目录是系统包含函数的库文件,是编写应用程序的时候使用的相当于API,也就是应用编程接口。 <br />&#8251; -I/usr/include和-L/usr/include/lib是将usr/include下的函数作为头文件包括进来,并且将程序链接到库文件,这个例子中没有用到,但是如果保险的话,在编译时最好加上这两个选项。 <br />1.3 将两个目标文件(主体C程序和嵌入式SQL)编译成可执行程序 <br />gcc -m64 -ldb2 -lc -o /export/home/shwhome/bin/testdb /export/home/shwhome/obj/CON_DB2.o /export/home/shwhome/obj/testdb.o <br />参数说明 <br />-ldb2: 链接DB2库文件。在SQC程序编译时必须链接libdb2.so库,其路径是/usr/lib/krb5/libdb2.so,之所以写成-ldb2,是在使用-l时,将库名的lib和后缀都去除,即库名是db2。以上命令是引用/export/home/shwhome/obj/CON_DB2.o /export/home/shwhome/obj/testdb.o这两个目标文件,编译后生成testdb,放在路径/export/home/shwhome/bin下。 </div><img src ="http://www.cppblog.com/prayer/aggbug/168489.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2012-03-21 13:45 <a href="http://www.cppblog.com/prayer/archive/2012/03/21/168489.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DB2的sqC文件名前八位不能重复的解决办法 </title><link>http://www.cppblog.com/prayer/archive/2012/03/21/168486.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Wed, 21 Mar 2012 05:24:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2012/03/21/168486.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/168486.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2012/03/21/168486.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/168486.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/168486.html</trackback:ping><description><![CDATA[<div class="postText">
<p>我们的项目中使用到了IBM的DB2数据库，系统开发语言是C++，操作数据库是直接在C++中编写ESQL（嵌入式SQL）语句。在使用中发现，只要有文件名前8位相同，就造成部分文件中的代码失效。 </p>
<p><strong>原因：</strong> <br />------------------<br />db2默认情况下使用*.sqC的名字生成*.bnd，又以*.bnd的文件名部分在数据库中做绑定，建一个同名的package。而db2的package的名字是有<a href="http://ptgmedia.pearsoncmg.com/images/0672326132/downloads/appd.pdf"><font color="#0066aa">八字节长度限制</font></a>的，造成前八位文件名相同的C++代码，总会后面的覆盖前面的。 </p>
<p>知道原因就好办事了。 </p>
<p><strong>解决：</strong><br />------------------<br />取原始文件名的md5摘要前N位，拼成bnd文件的名字，再以此文件去目标数据库做绑定，这样package就不会前后覆盖了。 </p>
<p><strong>makefile中实际的做法：</strong><br />------------------------<br /><pre class="frmedcode">%.C : %.sqC
  db2 connect to $(dbName) user $(dbUser) using $(dbPassword);\
  db2 prep $*.sqC bindfile;\
  <strong style="color: red">cp $*.bnd ${shell echo $* |md5sum -|cut -c1-8}_$*.bnd;\</strong>
  <strong style="color: red">db2 bind ${shell echo $* |md5sum -|cut -c1-8}_$*.bnd;\</strong>
  db2 connect reset; \
  db2 terminate;
</pre></div><img src ="http://www.cppblog.com/prayer/aggbug/168486.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2012-03-21 13:24 <a href="http://www.cppblog.com/prayer/archive/2012/03/21/168486.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>分布式 DBA: 创建和使用分区表</title><link>http://www.cppblog.com/prayer/archive/2012/03/05/167218.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Mon, 05 Mar 2012 15:47:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2012/03/05/167218.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/167218.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2012/03/05/167218.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/167218.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/167218.html</trackback:ping><description><![CDATA[<a href="http://doc.chinaunix.net/db2/201009/893927.shtml">http://doc.chinaunix.net/db2/201009/893927.shtml</a><br /><br />表分区是一种数据组织方案，它根据一列或多列中的值把表数据划分为多个称为数据分区 的存储对象。分区的表能够包含的数据比普通的表多得多；另外，通过利用称为分区消除 的过程，针对分区表运行的查询通常比针对非分区表运行时执行速度更快，需要的磁盘 I/O 更少<strong>。（DB2 优化器能够感知分区，在执行查询时只扫描相关的数据分区。）</strong> 
<p>　　在这篇专栏文章中，我将讨论如何创建分区表，解释分区表的定义如何决定各个记录的存储位置。 </p>
<p>　　范围分区表</p>
<p>　　数据分区也称为范围（当前 DB2 只支持范围分区方案），一个数据分区包含一个行子集，这些行存储在与表中其他行集不同的地方。不同的数据分区可以驻留在不同的表空间中，也可以驻留在相同的表空间中。CREATE TABLE 语句的 PARTITION BY 子句中提供的信息决定表数据的分区方式。这个可选子句的语法取决于是希望让 DB2 在指定的表数据范围内均匀地生成每个分区范围，还是要手工控制每个范围的边界。对于给定的表数据范围自动生成分区的语法是：</p>
<p><code>PARTITION　BY　&lt;RANGE&gt;　<br />　([ColumnName]　&lt;NULLS　LAST　|　NULLS　FIRST&gt;　,...)　<br />　(　<br />　STARTING　&lt;FROM&gt;　[Start　|　MINVALUE　|　MAXVALUE]　|　<br />　　STARTING　&lt;FROM&gt;　([Start　|　MINVALUE　|　MAXVALUE]　,...)　<br />　&lt;INCLUSIVE　|　EXCLUSIVE&gt;　<br />　ENDING　&lt;AT&gt;　[End　|　MINVALUE　|　MAXVALUE]　|　<br />　　ENDING　&lt;AT&gt;　([End　|　MINVALUE　|　MAXVALUE]　,...)　<br />　&lt;INCLUSIVE　|　EXCLUSIVE&gt;　<br />　EVERY　&lt;(&gt;[Constant]　&lt;DurationLabel&gt;　&lt;)&gt;　<br />　,...)　</code></p>
<div class="content_250x250"></div>
<p>　　手工指定分区的语法是：</p>
<p><code>PARTITION　BY　&lt;RANGE&gt;　　<br />　　([ColumnName]　&lt;NULLS　LAST　|　NULLS　FIRST&gt;　,...)　<br />　　(　<br />　　&lt;PARTITION　[PartitionName]&gt;　<br />　STARTING　&lt;FROM&gt;　[Start　|　MINVALUE　|　MAXVALUE]　|　<br />　　STARTING　&lt;FROM&gt;　([Start　|　MINVALUE　|　MAXVALUE]　,...)　<br />　&lt;INCLUSIVE　|　EXCLUSIVE&gt;　<br />　ENDING　&lt;AT&gt;　[End　|　MINVALUE　|　MAXVALUE]　|　<br />　　ENDING　&lt;AT&gt;　([End　|　MINVALUE　|　MAXVALUE]　,...)　<br />　&lt;INCLUSIVE　|　EXCLUSIVE&gt;　<br />　　&lt;IN　[TSName]&gt;　<br />　　&lt;INDEX　IN　[IndexTSName]&gt;　<br />　　&lt;LONG　IN　[LongTSName]&gt;　</code></p>
<p>　　其中：</p>
<p>　　ColumnName：用名称指定一个或多个列（最多 16 列），这些列的值用来决定数据行应该存储在哪个数据分区中。（指定的列组成表的分区键 &#8212; 参见边栏 &#8220;选择表分区键&#8221;。）数据类型为 LONG VARCHAR、LONG VARGRAPHIC、BLOB、CLOB、DBCLOB、XML、基于这些数据类型的 distinct 类型和结构化数据类型的列都不能作为数据分区键的组成部分。</p>
<p>　　PartitionName：指定分配给要创建的数据分区的惟一名称。</p>
<p>　　Start：指定每个数据分区的范围下限。</p>
<p>　　End：指定每个数据分区的范围上限。</p>
<p>　　Constant：在使用语法的自动生成形式时，指定每个数据分区范围的宽度。从 STARTING FROM 值开始创建数据分区，数据分区的范围内包含指定数量的值。支持这种语法的条件是分区键由单一列组成，这一列的数据类型是数字、日期、时间或时间戳。</p>
<div class="content_250x250"></div>
<p>　　DurationLabel：如果分区键列的数据类型是日期、时间或时间戳，这个参数指定与 Constant 值相关的时间单位。这个参数的有效值是：YEAR、YEARS、MONTH、MONTHS、DAY、DAYS、HOUR、HOURS、MINUTE、MINUTES、SECOND、SECONDS、MICROSECOND 和 MICROSECONDS。</p>
<p>　　TSName：指定存储每个数据分区的表空间。</p>
<p>　　IndexTSName：指定存储每个数据分区的分区索引的表空间。</p>
<p>　　LongTSName：指定存储长列的值的表空间。</p>
<p>　　注意：尖括号 (&lt; &gt;) 中的参数是可选的；方括号 ([ ]) 中的参数或选项是必需的，必须提供它们；逗号后面跟着省略号 (...) 表示前面的参数可以重复出现多次。</p>
<p>　　因此，如果希望创建一个名为 SALES 的分区表，把每个季度的数据存储在单独的分区中，每个分区驻留在不同的表空间中，那么可以执行以下 CREATE TABLE 语句：</p>
<p><code>CREATE　TABLE　sales　<br />　(sales_date　　DATE,　<br />　sales_amt　　　NUMERIC(5,2))　<br />　IN　tbsp0,　tbsp1,　tbsp2,　tbsp3　<br />　PARTITION　BY　RANGE　(sales_date)　<br />　　(STARTING　'1/1/2010'　ENDING　'12/31/2010'　<br />　　EVERY　3　MONTHS)　</code></p>
<p>　　图 1 说明生成的表是什么样的。</p>
<p>图 1. 一个简单分区表中存储的数据<br /><img alt="分布式 DBA: 创建和使用分区表" src="http://doc.chinaunix.net/uploadfile/201009/20100916060513253.gif" width="460" height="402" /></p>
<p>　　另一方面，如果希望创建一个名为 INVENTORY 的分区表，把物品编号在 1 到 100 之间的行存储在一个表空间中的一个分区中，把编号在 101 到 200 之间的行存储在另一个表空间中的另一个分区中，以此类推，那么可以执行下面的 SQL 语句：</p>
<div class="content_250x250"></div>
<p><code>CREATE　TABLE　inventory　<br />　　(item_no　INT,　<br />　　desc　VARCHAR(20))　<br />PARTITION　BY　(item_no　NULLS　FIRST)　<br />(PARTITION　PRODUCE　STARTING　MINVALUE　ENDING　100　IN　tbsp0,　<br />PARTITION　DAIRY　　STARTING　　　　101　ENDING　200　IN　tbsp1,　<br />PARTITION　BAKERY　　STARTING　　　　201　ENDING　300　IN　tbsp2,　<br />PARTITION　MEAT　　　STARTING　　　　301　ENDING　400　IN　tbsp3)　</code></p>
<p>　　选择表分区键</p>
<p>　　选择有效的表分区键列对于发挥表分区的优势非常重要。最有效的表分区键列是有利于分区消除的列。例如，如果通常按日期查询表中的记录，那么应该用日期或时间列进行表分区。</p>
<p>　　同样，如果希望随着时间的推移把表数据的一部分删除或存档，应该根据期望的记录存档方式进行表分区。例如，如果希望把三年前的所有数据都存档，应该按周、月或季度进行表分区，这样就可以分别在每周、每月或每季度末删除一个老分区。</p>
<p>　　对于这个示例，ITEM_NO 值在 1 到 100 之间的行将存储在名为 PRODUCE 的分区中（这个分区的数据写到表空间 TBSP0 中），ITEM_NO 值在 101 到 200 之间的行将存储在名为 DAIRY 的分区中（这个分区的数据写到表空间 TBSP1 中），依次类推；ITEM_NO 值为 NULL 的行将存储在 PRODUCE 分区中。</p>
<p>　　一定要注意，当指定 NULLS FIRST 选项时，第一个分区必须从 MINVALUE 开始。（同样，如果使用 NULLS LAST 选项，最后一个分区必须结束于 MAXVALUE。）否则，在插入分区键列为 NULL 值的记录时，会产生 &#8220;data out of bounds&#8221; 错误。另外，每个分区的数据、索引和长列数据可以放在不同的表空间中。如果不为索引或长列指定表空间，分区索引和长列数据会存储在与数据相同的表空间中。</p>
<p>&nbsp;</p>
<p>　　在默认情况下，范围包含边界本身。要想防止在某一分区中存储特定的记录，可以用 EXCLUSIVE 选项创建范围。例如：</p>
<p><code>CREATE　TABLE　sales　<br />　(sales_date　DATE,　<br />　sales_amt　NUMERIC(5,2))　<br />IN　tbsp0,　tbsp1,　tbsp2,　tbsp3　<br />PARTITION　BY　RANGE　(sales_date)　<br />(STARTING　'1/1/2010'　ENDING　'3/31/2010'　EXCLUSIVE,　　<br />STARTING　'3/31/2010'　ENDING　'6/30/2010'　EXCLUSIVE,　　<br />STARTING　'6/30/2010'　ENDING　'9/30/2010'　EXCLUSIVE,　　<br />STARTING　'9/30/2010'　ENDING　'12/31/2010')　</code></p>
<p>　　在这个示例中，销售日期为 3/31/2010 的记录不会存储在表空间 TBSP0 中，而是存储在表空间 TBSP1 中。</p>
<p>　　当在分区表中插入行时，会根据键值及其所处的范围自动地把它放到适当的数据分区中。如果键值不处于表的任何范围内，插入操作就会失败并产生一个错误。</p>
<p>　　轻松地移入和移出数据</p>
<p>　　使用分区表的另一个优点是，可以轻松地在表中添加新数据（作为新的数据分区），同时可以轻松地删除并存档老数据。在下一篇专栏文章中，我将讲解添加（移入）和删除（移出）数据分区的过程。还要讨论 DB2 9.7 中的改进如何大大加快移入和移出数据分区的速度，减少这些操作产生的干扰。 </p><img src ="http://www.cppblog.com/prayer/aggbug/167218.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2012-03-05 23:47 <a href="http://www.cppblog.com/prayer/archive/2012/03/05/167218.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DB2 V9表分区</title><link>http://www.cppblog.com/prayer/archive/2012/03/05/167217.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Mon, 05 Mar 2012 15:21:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2012/03/05/167217.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/167217.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2012/03/05/167217.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/167217.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/167217.html</trackback:ping><description><![CDATA[<strong><a href="http://www.itokit.com/2011/0325/59467.html">http://www.itokit.com/2011/0325/59467.html</a><br /><br />【IT168 专稿】</strong>DB2 V9新增了表分区功能,因此对一些大表,我们在DB2 V9中不再需要分拆成小表,再用UNION ALL视图的方式进行<a class="keylink" href="http://www.itokit.com/tag.php?tag=%C9%E8%BC%C6" target="_blank">设计</a>,而是直接用分区表实现一些这些功能｡表分区功能是一种数据组织方案,即,表数据根据一个或多个表列中的值分布到多个存储对象(称为数据分区或范围)中｡每个数据分区都是单独存储的｡这些存储对象可以在不同的表空间中,也可以在相同表空间中｡由于表分区是DB2 V9新增的功能,所以很多用户对其特性不是很了解,本文将重点介绍DB2 V9表分区功能,并通过实际的例子来帮助大家理解和提高｡ <br /><br />简介 <br /><br />在DB2 V9之前,对一些大表,出于对性能和数据容量限制的考虑,我们通常会把大表分拆成一些小表,再用UNION ALL 视图的方式进行联合起来｡DB2 V9在数据容量方面有了重大突破,DMS 表空间的新缺省类型是&#8220;大型&#8221;,当使用&#8220;大型&#8221;DMS表空间时,单表的最大容量限制是16384G(Byte),而不再是以前的512 G(Byte)｡DB2 V9新增了表分区功能,使得我们对大表的性能和数据容量的顾虑都不再存在｡使用表分区,能够创建非常大的表,通过跨多个存储器对象划分表数据,可显著增大表,一个表最多可以有32K个数据分区｡使用表分区分隔数据能够避免扫描不相关的数据,从而提高查询处理性能｡DB2优化器从查询操作中去除不相关的分区｡ <br /><br />表分区功能是一种数据组织方案,根据一个或多个表列中的值将表数据划分到多个称为数据分区或范围的存储对象中｡每个数据分区都是单独存储的｡这些存储器对象可位于不同的表空间和/或相同的表空间中｡跨多个存储器对象对表数据进行分区的能力为<a class="keylink" href="http://www.itokit.com/tag.php?tag=%CA%FD%BE%DD%BF%E2" target="_blank">数据库</a>管理员提供了更高的可伸缩性和灵活性,同时提高了性能和控制能力｡表分区可大幅度减少管理庞大<a class="keylink" href="http://www.itokit.com/tag.php?tag=%CA%FD%BE%DD%BF%E2" target="_blank">数据库</a>所需的维护工作,并可有效增加单个表的潜在大小｡表和索引自动重组的新策略选项使您能够更有效地管理DB2<a class="keylink" href="http://www.itokit.com/tag.php?tag=%B7%FE%CE%F1%C6%F7" target="_blank">服务器</a>对表和索引的自动重组｡表分区使您能够定义表数据的范围,以便单独保存每个范围｡例如,您可基于表中的日期列,按月对表进行分区｡每个范围(称为数据分区)与单个存储器对象对应｡这些存储器对象可位于不同的表空间和/或相同的表空间中｡由于可以对单个数据分区执行管理任务,将很耗时的维护操作分成一系列较小的操作来执行,从而使管理工作更为灵活｡例如,可备份和复原单个数据分区而不是整个表｡DB2 V9新增的表分区功能增强了对索引位置的细化控制,可将索引置于不同表空间并单独管理它们｡使用 ALTER TABLE语句的 ATTACH PARTITION和DETACH PARTITION子句可进行快速及方便的数据转入或转出｡此功能在数据仓库环境中特别有用,在此环境中经常需要装入或删除数据以运行决策支持查询｡能够将表分区与其他数据组织方案组合在一起｡通过将表分区与数据分区功能(DPF)一起使用,可跨数据库分区均匀地分布数据范围,以利用 DPF 的查询内并行性和数据库分区负载均衡功能｡将表分区与多维集群(MDC)一起使用时,能够对同一表扩展数据块中在多个维上具有类似值的行进行分组｡ <br />由于表分区是DB2 V9新增的功能,所以很多用户对其特性不是很了解,本文将重点介绍DB2 V9表分区功能,并通过实际的例子来帮助大家理解和提高｡ <br /><br />我们将按照下列顺序介绍表分区: <br /><br />1. 创建示例数据库DB2TEST1,在示例数据库上创建一个使用32K页大小的缓冲池,创建3个DMS表空间,用来存放示例分区表的数据,创建3个大型表空间(DMS),用来存放示例分区表的大型数据,创建1个DMS表空间,用来存放示例分区表的索引 <br /><br />2. 使用自动方式创建示例分区表 <br /><br />3. 使用手工方式创建示例分区表 <br /><img src ="http://www.cppblog.com/prayer/aggbug/167217.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2012-03-05 23:21 <a href="http://www.cppblog.com/prayer/archive/2012/03/05/167217.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>fragment on db2 and informix</title><link>http://www.cppblog.com/prayer/archive/2012/03/05/167215.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Mon, 05 Mar 2012 14:57:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2012/03/05/167215.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/167215.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2012/03/05/167215.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/167215.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/167215.html</trackback:ping><description><![CDATA[<a href="http://hi.baidu.com/shenqb/blog/item/1c9ea8de8894644fccbf1aa1.html">http://hi.baidu.com/shenqb/blog/item/1c9ea8de8894644fccbf1aa1.html</a><br /><br />
<div class="shareUser">转载自 <a href="http://hi.baidu.com/koolkite" target="blank">koolkite</a></div>
<div class="shareLastEditor">最终编辑 <a href="http://hi.baidu.com/shenqb" target="blank">koolkite</a></div>
<table style="width: 100%; table-layout: fixed">
<tbody>
<tr>
<td>
<div id="blog_text" class="cnt">表分区功能是一种数据组织方案，即，表数据根据一个或多个表列中的值分布到多个存储对象（称为数据分区或范围）中。每个数据分区都是单独存储的。这 些存储对象可以在不同的表空间中，也可以在相同表空间中。按照 CREATE TABLE 语句的 PARTITION BY 子句中指定那样将表数据分区。此定义中使用的列被称为表分区键列。DB2 表分区功能与 Informix&#174; Dynamic Server 和 Informix Extended Parallel Server 提供的数据分段组织方法相对应。 
<div><span class="pblktitle">Informix 方法</span> 
<p>Informix 支持若干种数据组织方案，在 Informix 产品中，这些方案称为<em>分段</em>。其中一种较常使用的分段类型是 FRAGMENT BY EXPRESSION。这种类型的分段的工作方式与 CASE 语句非常相似，其中有一个与表的每个分段相关联的表达式。检查这些表达式以便确定行的放置位置。</p></div>
<div><span class="pblktitle">Informix 与 DB2 数据库系统的比较</span> 
<p>DB2 数据库提供了丰富的补充功能，这些功能与 Informix 数据组织方案直接对应，这使客户能够相对容易地从 Informix 语法转换为 DB2 语法。DB2 数据库管理器将生成列与 CREATE TABLE 语句的 PARTITION BY RANGE 子句配合使用，以处理复杂的 Informix 方案。<a href="http://publib.boulder.ibm.com/infocenter/db2luw/v9/topic/com.ibm.db2.udb.admin.doc/doc/c0021561.htm#syntaxmapping">表 78</a> 对 Informix 和 DB2 数据库产品中使用的数据组织方案作了比较。</p>
<p>&nbsp;</p><a name="syntaxmapping"></a>
<table border="1" rules="rows" width="100%" frame="hsides">
<caption>表 78. 所有 Informix 与 DB2 数据组织方案的映射</caption>
<thead valign="bottom">
<tr>
<th width="33%" align="left">数据组织方案</th>
<th width="33%" align="left">Informix 语法</th>
<th width="33%" align="left">DB2 版本 9.1 语法</th></tr></thead>
<tbody valign="top">
<tr>
<td headers="wq3993">
<ul><li>Informix：基于表达式</li><li>DB2：表分区 </li></ul></td>
<td headers="wq3994">FRAGMENT BY EXPRESSION</td>
<td headers="wq3995">PARTITION BY RANGE</td></tr>
<tr>
<td headers="wq3993">
<ul><li>Informix：循环法</li><li>DB2：缺省 </li></ul></td>
<td headers="wq3994">FRAGMENT BY ROUND ROBIN</td>
<td headers="wq3995">没有语法：DB2 数据库管理器自动在容器之间分布数据</td></tr>
<tr>
<td headers="wq3993">
<ul><li>Informix：范围分布</li><li>DB2：表分区 </li></ul></td>
<td headers="wq3994">FRAGMENT BY RANGE</td>
<td headers="wq3995">PARTITION BY RANGE</td></tr>
<tr>
<td headers="wq3993">
<ul><li>Informix：系统定义的散列</li><li>DB2：数据库分区 </li></ul></td>
<td headers="wq3994">FRAGMENT BY HASH</td>
<td headers="wq3995">DISTRIBUTE BY HASH</td></tr>
<tr>
<td headers="wq3993">
<ul><li>Informix：HYBRID</li><li>DB2：在进行表分区的情况下进行数据库分区 </li></ul></td>
<td headers="wq3994">FRAGMENT BY HYBRID</td>
<td headers="wq3995">DISTRIBUTE BY HASH 和 PARTITION BY RANGE</td></tr>
<tr>
<td headers="wq3993">
<ul><li>Informix：不适用</li><li>DB2：多维集群 </li></ul></td>
<td headers="wq3994">不适用</td>
<td headers="wq3995">ORGANIZE BY DIMENSION</td></tr></tbody></table>
<div><span class="pblktitle">示例</span> 
<p>下列示例详细说明了在 DB2 中如何实现与任何使用表达式的 Informix 分段方案等同的结果。</p></div>
<p><em>示例 1：</em>下面这个基本的 Create Table 语句显示了 Informix 分段以及等同的 DB2 数据库系统表分区语法：</p>
<p>Informix 语法：</p><pre class="xmp">CREATE TABLE demo(a INT) FRAGMENT BY EXPRESSION<br />   a = 1 IN db1,<br />   a = 2 IN db2,<br />   a = 3 IN db3;</pre>
<p>DB2 语法：</p><pre class="xmp">CREATE TABLE demo(a INT) PARTITION BY RANGE(a)<br />   (STARTING(1) IN db1,<br />   STARTING(2) IN db2,<br />   STARTING(3) ENDING(3) IN db3);</pre>
<p>Informix XPS 支持称为 hybrid 的两层分段方案，在此方案中，使用一个表达式来在协作服务器之间分布数据，并使用第二个表达式来在协作服务器内分布数据。这使所有协作服务器都能够参与查 询（即，在所有协作服务器上都有数据），并使查询能够利用数据分区消除功能的优势。</p>
<p>通过结合使用 CREATE TABLE 语句的 DISTRIBUTE BY 和 PARTITION BY 子句，DB2 数据库系统实现了与 Informix hybrid 等同的组织方案。</p>
<p><em>示例 2：</em>以下示例显示了组合子句的语法：</p>
<p>Informix 语法</p><pre class="xmp">CREATE TABLE demo(a INT, b INT) FRAGMENT BY HYBRID HASH(a)<br />   EXPRESSION b = 1 IN dbsl1,<br />     b = 2 IN dbsl2;</pre>
<p>DB2 语法</p><pre class="xmp">CREATE TABLE demo(a INT, b INT) IN dbsl1, dbsl2<br />   DISTRIBUTE BY HASH(a),<br />   PARTITION BY RANGE(b) (STARTING 1 ENDING 2 EVERY 1);</pre>
<p>此外，可以使用多维集群来进一步组织数据：</p><pre class="xmp">CREATE TABLE demo(a INT, b INT, c INT) IN dbsl1, dbsl2<br />   DISTRIBUTE BY HASH(a),<br />   PARTITION BY RANGE(b) (STARTING 1 ENDING 2 EVERY 1)<br />   ORGANIZE BY DIMENSIONS(c);</pre>
<p>这样，列 <strong>a</strong> 值相同的所有行都在同一个数据库分区中。所有列 <strong>b</strong> 值相同的行都在同一个表空间中。对于具有给定的 <strong>a</strong> 和 <strong>b</strong> 值的行，会将再具有相同 <strong>c</strong> 值的所有行集中到一个磁盘上。此方法非常适合于 OLAP 类型的下寻操作，这是因为，仅需扫描单个数据库分区上单个表空间中的一个或数个扩展数据块就可以满足此类查询。</p></div>
<div><span class="pblktitle">应用表分区以解决常见的应用程序问题</span> 
<p>下列各节讨论如何应用各种 DB2 表分区功能以解决常见的应用程序问题。每一节都特别侧重于采取最佳措施来将各种 Informix 分段方案映射到等同的 DB2 表分区方案。</p></div>
<div><span class="pblktitle">创建简单数据分区范围时的注意事项</span> 
<p>其中一种最常见的表分区应用是根据日期键对大型事实表进行分区。如果需要创建大小统一的日期范围，请考虑使用自动生成的 CREATE TABLE 语法格式。</p></div>
<div><span class="pblktitle">示例</span> 
<p><em>示例 1：</em>以下示例显示自动生成的语法格式：</p><pre class="xmp">CREATE TABLE orders<br />(<br /> l_orderkey  DECIMAL(10,0) NOT NULL,<br /> l_partkey  INTEGER,<br /> l_suppkey  INTEGER,<br /> l_linenumber  INTEGER,<br /> l_quantity  DECIMAL(12,2),<br /> l_extendedprice  DECIMAL(12,2),<br /> l_discount  DECIMAL(12,2),<br /> l_tax   DECIMAL(12,2),<br /> l_returnflag  CHAR(1),<br /> l_linestatus  CHAR(1),<br /> l_shipdate  DATE,<br /> l_commitdate  DATE,<br /> l_receiptdate  DATE,<br /> l_shipinstruct  CHAR(25),<br /> l_shipmode  CHAR(10),<br /> l_comment  VARCHAR(44)) <br />  PARTITION BY RANGE(l_shipdate)<br />  (STARTING '1/1/1992' ENDING '12/31/1993' EVERY 1 MONTH);</pre>
<p>这将创建 24 个范围，即对 1992-1993 的每个月创建一个范围。尝试插入 l_shipdate 超出该范围的行将导致错误。</p>
<p><em>示例 2：</em>将上一示例与以下 Informix 语法作比较：</p><pre class="xmp">create table orders<br />(<br /> l_orderkey  decimal(10,0) not null,<br /> l_partkey  integer,<br /> l_suppkey  integer,<br /> l_linenumber integer,<br /> l_quantity  decimal(12,2),<br /> l_extendedprice decimal(12,2),<br /> l_discount  decimal(12,2),<br /> l_tax   decimal(12,2),<br /> l_returnflag char(1),<br /> l_linestatus char(1),<br /> l_shipdate  date,<br /> l_commitdate date,<br /> l_receiptdate date,<br /> l_shipinstruct char(25),<br /> l_shipmode  char(10),<br /> l_comment  varchar(44)<br />) fragment by expression<br />l_shipdate &lt; '1992-02-01' in ldbs1,<br />l_shipdate &gt;= '1992-02-01' and l_shipdate &lt; '1992-03-01' in ldbs2,<br />l_shipdate &gt;= '1992-03-01' and l_shipdate &lt; '1992-04-01' in ldbs3,<br />l_shipdate &gt;= '1992-04-01' and l_shipdate &lt; '1992-05-01' in ldbs4,<br />l_shipdate &gt;= '1992-05-01' and l_shipdate &lt; '1992-06-01' in ldbs5,<br />l_shipdate &gt;= '1992-06-01' and l_shipdate &lt; '1992-07-01' in ldbs6,<br />l_shipdate &gt;= '1992-07-01' and l_shipdate &lt; '1992-08-01' in ldbs7,<br />l_shipdate &gt;= '1992-08-01' and l_shipdate &lt; '1992-09-01' in ldbs8,<br />l_shipdate &gt;= '1992-09-01' and l_shipdate &lt; '1992-10-01' in ldbs9,<br />l_shipdate &gt;= '1992-10-01' and l_shipdate &lt; '1992-11-01' in ldbs10,<br />l_shipdate &gt;= '1992-11-01' and l_shipdate &lt; '1992-12-01' in ldbs11,<br />l_shipdate &gt;= '1992-12-01' and l_shipdate &lt; '1993-01-01' in ldbs12,<br />l_shipdate &gt;= '1993-01-01' and l_shipdate &lt; '1993-02-01' in ldbs13,<br />l_shipdate &gt;= '1993-02-01' and l_shipdate &lt; '1993-03-01' in ldbs14,<br />l_shipdate &gt;= '1993-03-01' and l_shipdate &lt; '1993-04-01' in ldbs15,<br />l_shipdate &gt;= '1993-04-01' and l_shipdate &lt; '1993-05-01' in ldbs16,<br />l_shipdate &gt;= '1993-05-01' and l_shipdate &lt; '1993-06-01' in ldbs17,<br />l_shipdate &gt;= '1993-06-01' and l_shipdate &lt; '1993-07-01' in ldbs18,<br />l_shipdate &gt;= '1993-07-01' and l_shipdate &lt; '1993-08-01' in ldbs19,<br />l_shipdate &gt;= '1993-08-01' and l_shipdate &lt; '1993-09-01' in ldbs20,<br />l_shipdate &gt;= '1993-09-01' and l_shipdate &lt; '1993-10-01' in ldbs21,<br />l_shipdate &gt;= '1993-10-01' and l_shipdate &lt; '1993-11-01' in ldbs22,<br />l_shipdate &gt;= '1993-11-01' and l_shipdate &lt; '1993-12-01' in ldbs23,<br />l_shipdate &gt;= '1993-12-01' and l_shipdate &lt; '1994-01-01' in ldbs24,<br />l_shipdate &gt;= '1994-01-01' in ldbs25;</pre>
<p>注意，Informix 语法提供了上下不封顶的范围以捕获预期范围外的日期。通过添加使用 MINVALUE 和 MAXVALUE 的范围，可以将 DB2 语法修改为与 Informix 语法匹配。</p>
<p><em>示例 3：</em>以下示例将示例 1 修改为与 Informix 语法匹配：</p><pre class="xmp">CREATE TABLE orders<br />(<br /> l_orderkey  DECIMAL(10,0) NOT NULL,<br /> l_partkey  INTEGER,<br /> l_suppkey  INTEGER,<br /> l_linenumber INTEGER,<br /> l_quantity  DECIMAL(12,2),<br /> l_extendedprice DECIMAL(12,2),<br /> l_discount  DECIMAL(12,2),<br /> l_tax   DECIMAL(12,2),<br /> l_returnflag CHAR(1),<br /> l_linestatus CHAR(1),<br /> l_shipdate  DATE,<br /> l_commitdate DATE,<br /> l_receiptdate DATE,<br /> l_shipinstruct CHAR(25),<br /> l_shipmode  CHAR(10),<br /> l_comment  VARCHAR(44)<br />) PARTITION BY RANGE(l_shipdate)<br /> (STARTING MINVALUE,<br />  STARTING '1/1/1992' ENDING '12/31/1993' EVERY 1 MONTH,<br />  ENDING MAXVALUE);</pre>
<p>这种技术允许将任何日期插入到表中。</p></div>
<div><span class="pblktitle">使用生成列按表达式进行分区</span> 
<p>虽然 DB2 数据库并不直接支持按表达式进行分区，但支持按生成列进行分区，因此有可能获得相同的结果。</p>
<p>在决定是否使用此方法前，请考虑下列用法准则：</p>
<ul><li>生成列是真实的列，它占用物理磁盘空间。使用生成列的表会略微变大。</li><li>对于在分区表进行分区时所基于的列，不能改变其生成列表达式。尝试执行此操作将产生消息 SQL0190。如果按下一节描述的方式将新数据分区添加到使用生成列的表中，通常要求改变定义生成列的表达式。目前，不支持改变定义生成列的表达式。</li><li>当表使用生成列时，对于何时可以应用数据分区消除是有限制的。 </li></ul></div><span class="pblktitle">示例</span> 
<p><em>示例 1：</em>以下示例使用 Informix 语法，在这种情况下适合使用生成列。在本示例中，进行分区时所基于的列存放了加拿大的省和地域。由于省列表不大可能更改，因此生成列表达式也不大可能更改。</p><pre class="xmp">CREATE TABLE customer (<br />  cust_id  INT,<br />  cust_prov CHAR(2))<br />  FRAGMENT BY EXPRESSION<br />   cust_prov = "AB" IN dbspace_ab<br />   cust_prov = "BC" IN dbspace_bc<br />   cust_prov = "MB" IN dbspace_mb<br />   ...<br />   cust_prov = "YT" IN dbspace_yt<br />   REMAINDER IN dbspace_remainder;</pre>
<p><em>示例 2：</em>在此示例中，使用生成列对 DB2 表进行分区：</p><pre class="xmp">CREATE TABLE customer (<br />  cust_id     INT,<br />  cust_prov   CHAR(2),<br />  cust_prov_gen GENERATED ALWAYS AS (CASE<br />   WHEN cust_prov = 'AB' THEN 1<br />   WHEN cust_prov = 'BC' THEN 2<br />   WHEN cust_prov = 'MB' THEN 3<br />   ...<br />   WHEN cust_prov = 'YT' THEN 13<br />   ELSE 14 END))<br />  IN tbspace_ab, tbspace_bc, tbspace_mb, .... tbspace_remainder<br />  PARTITION BY RANGE (cust_prov_gen)<br />   (STARTING 1 ENDING 14 EVERY 1);</pre>
<p>这里，CASE 语句中的表达式与 FRAGMENT BY EXPRESSION 子句中的相应表达式匹配。CASE 语句将每个原始表达式映射到一个数字，该数字存储在生成列（在本示例中是 cust_prov_gen）中。此列是存储在磁盘上的真实列，因此，表占用的空间量会比 DB2&#174; 通过表达式直接支持的分区所必需的空间量略多。本示例使用短语法格式。因此，必须在 CREATE TABLE 语句的 IN 子句中列示用来放置数据分区的表空间。如果使用长语法格式，则每个数据分区都需要不同的 IN 子句。</p></div></td></tr></tbody></table><img src ="http://www.cppblog.com/prayer/aggbug/167215.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2012-03-05 22:57 <a href="http://www.cppblog.com/prayer/archive/2012/03/05/167215.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>911错不一定是死锁，怎么区分死锁和超时 </title><link>http://www.cppblog.com/prayer/archive/2012/03/01/166847.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Thu, 01 Mar 2012 02:53:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2012/03/01/166847.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/166847.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2012/03/01/166847.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/166847.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/166847.html</trackback:ping><description><![CDATA[大家在开发、测试过程中，常见到程序报911这样的错，查看一下帮助：<br />
<blockquote><br />d:/&gt;db2&nbsp;?&nbsp;sql0911n<br /><br /><br /><strong>SQL0911N因为死锁或超时，所以当前事务已回滚。原因码为<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"&lt;原因码&gt;"。<br /></strong><br />解释:<br /><br />当前工作单元涉及到未解决的对使用对象的争用，因此不得不回滚。<br /><br />原因码如下：<br /><br /><br /><strong>&nbsp;2&nbsp;由于死锁而导致事务已回滚。<br /><br />&nbsp;68&nbsp;由于锁定超时而导致事务已回滚。<br /><br /></strong>&nbsp;72&nbsp;因为存在与事务中所涉及的&nbsp;DB2&nbsp;Data&nbsp;Links&nbsp;Manager<br />有关的错误，所以事务已回滚。<br /><br />注释:&nbsp;必须再次输入与工作单元相关的更改。<br /><br />应用程序已回滚至上一次&nbsp;COMMIT。<br /><br />用户响应:<br /><br />为了帮助避免死锁或锁定超时，对长时间运行的应用程序或有可能遇到死锁<br />的应用程序频繁发出&nbsp;COMMIT&nbsp;操作（如果有可能的话）。<br /><br />联合系统用户：死锁可能发生在联合服务器或数据源上。没有检测跨越数据<br />源并潜在地跨越联合系统的死锁的机制。有可能标识使请求失败的数据源（<br />参阅&nbsp;Problem&nbsp;Determination&nbsp;Guide&nbsp;以确定哪一个数据源使&nbsp;SQL<br />语句的处理失败）。<br /><br />当处理&nbsp;SQL&nbsp;语句的某些组合时，通常会发生死锁或者预期会发生死锁。建议<br />您设计应用程序来尽可能避免死锁。<br /><br />&nbsp;sqlcode&nbsp;:&nbsp;&nbsp;-911<br /><br />&nbsp;sqlstate&nbsp;:&nbsp;&nbsp;40001<br /><br /><br />d:/&gt;<br /></blockquote><br /><br />很明显是两种原因可能造成这样的错误。<br />1、死锁<br />2、锁等待超时<br /><br />怎么区分呢？<br /><br />思路：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;根据原因码，如果是2就是死锁引起的；如果是68就是超时引起的。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果没有获得原因码，那么从系统自带的死锁监视器里确认是否发生过死锁，如果没有发生，则就是超时引起的。<br /><br />超时解决办法：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、优化相关sql<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、延长超时设置<br /><br />死锁分析方法：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用实例用户连接到db2实例，切换到死锁监视器路径下，运行db2evmon&nbsp;-path&nbsp;xxx&nbsp;&gt;lock_rpt.txt来生成报告。<br /><br /><br />--&nbsp;The&nbsp;End&nbsp;--<br /><br /><img src ="http://www.cppblog.com/prayer/aggbug/166847.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2012-03-01 10:53 <a href="http://www.cppblog.com/prayer/archive/2012/03/01/166847.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>不管怎么强调sortheap的重要性都不为过 </title><link>http://www.cppblog.com/prayer/archive/2012/02/28/166696.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Tue, 28 Feb 2012 06:58:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2012/02/28/166696.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/166696.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2012/02/28/166696.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/166696.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/166696.html</trackback:ping><description><![CDATA[<div class="blog_content" id="blog_content">
<p>今天看了一篇文章，觉得<font size="+0">不管怎么强调sortheap的重要性都不为过。理由我后面肯定会写详细的，这里写记录下，占个位置：</font></p>
<p>----2007.07.10.00。13（没想到是10号还以为9号呢 ，9号刚过<img alt="" src="http://acme1921209.iteye.com/javascripts/fckeditor/editor/images/smiley/msn/sad_smile.gif" />）</p>
<p>&nbsp;</p>
<p>========================</p>
<p>感觉学的不是很好，没有达到目标，但还是把这2天学的写上吧 。</p>
<p>&nbsp;1.sortheap在数据库配置说明上是这样的：<font size="+0">定义要用于专用排序的专用内存页的最大数目，或者要用于共享排序的共享内存页的最大数目。现在这个项目并没有启动分区并行性，所以此参数只是表示要用于专用排序的专用内存页的最大数目。不知道是我没理解好，还是db2没有说好，其实这个参数还有个很重要的作用：数据库在执行散列连接sql的时候也用到此内存区域。db2&nbsp; 对2个表进行连接的时候，只有3种类型：嵌套，合并，散列。其中散列连接用的最多（我在执行复杂sql的时候是这样的，简单的没有测试过大家可以测试下）。进行散列连接的时候，数据库会把其中一个表的内容复制到sortheap对应的内存中，如果sortheap对应的内存不够大，就会吧余下的数据库复制到临时表空间中。然后进行连接比较。可以想想操作内存和操作硬盘的差别吧，所以我们应尽量大的设置sortheap，使他不溢出到硬盘中，或者很少溢出。（关于上面3中嵌套，合并，散列连接类型，可以看下面的附件，附件中有很详细的说明）</font></p>
<p>2.&nbsp; 查看是否溢出的方法：</p>
<p>大家执行下面的命令： db2 gen snapshot for db on 数据库名 （这个命令不需要打开db2的快照开关，db2有些默认的快照信息）。在输出的信息中查找下面的信息：</p>
<p><font size="+0">已分配的专用排序堆总数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 0<br />已分配的共享排序堆总数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 0<br />共享排序堆高水位标记&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 0<br />总计排序&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 34600<br />总计排序时间（毫秒）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 35491<br />排序溢出&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 2384<br />活动排序数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 0</font></p>
<p>和</p>
<p><font size="+0">散列连接数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 38808<br />散列循环数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 0<br />散列连接溢出数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 534<br />小散列连接溢出数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 1</font></p>
<p>&nbsp;</p>
<p>&nbsp;排序溢出&nbsp;/总计排序&nbsp;&nbsp;&nbsp;可以得到溢出比例&nbsp; （<font size="+0">如果溢出比例大于 3 个百分点，那么在应用程序 SQL 中会出现严重的或意外的排序问题。因为正是溢出的存在表明发生了大的排序，所以理想的情况是发现没有排序溢出或至少其百分比小于一个百分点。<br />如果出现过多的排序溢出，那么&#8220;应急&#8221;解决方案是增加SORTHEAP的大小。然而，这样做只是掩盖了真实的性能问题。相反，您应该确定引起排序的 SQL 并更改该 SQL、索引或群集来避免或减少排序开销。如果溢出比例大于 5 （作为一种经验之谈），那么每个事务的排序数可能很大。虽然某些应用程序事务执行许多小的组合排序（它们不会溢出并且执行时间很短），但是它消耗了过多的 CPU。当SortsPerTX很大时，按我的经验，这些机器通常会受到 CPU 的限制。确定引起排序的 SQL 并改进存取方案（通过索引、群集或更改 SQL）对提高事务吞吐率是极为重要的。</font>）</p>
<p><font size="+0">散列连接数&nbsp;&nbsp;&nbsp;就是在执行sql的时候进行散列连接的数目。这里只说下散列循环数&nbsp;的意义，其他参数的意义在下面的附件中都有很详细的说明：&nbsp; 我在测试的时候，把sortheap设置为16个页，然后执行复杂的sql，散列循环数有值，而且很高。一般看到散列循环数有值就要注意，他说明你的sortheap或者<font size="+0">SHEAPTHRES（实例级参数）太低了。现在的测试情况就说明sortheap太低了。另外一种情况<font size="+0">SHEAPTHRES太低的原因： <font size="+0">SHEAPTHRES已经分配给前面的代理进程了，再有代理进程申请sortheap的时候，<font size="+0">SHEAPTHRES已经达到上限了，这个时候db2就会给申请sortheap的进程很小的值，此时代理进程进行散列连接的时候就需要把很多数据放到硬盘上，这个时候就会导致散列循环数值很高，这个时候大家可以增加 <font size="+0">SHEAPTHRES进行观察。</font></font></font></font></font></font></p>
<p>&nbsp;</p>
<p>3.查看排序溢出的sql方法： 首先打开快照监视器：&nbsp; db2 update monitor switches using sort on statements on ;</p>
<p>然后过段时间（1分钟就可以了）执行 get snapshot for all on 数据库名；</p>
<p>在输出的信息中查找：<font size="+0">语句排序溢出&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 1&nbsp;&nbsp; ，看对应的sql就知道了，对sql的执行计划分析下就明白了。</font></p>
<p>记得在测试完要关闭 快照开关： db2 update monitor switches using sort off statements off;</p></div><br /><br /><a href="http://acme1921209.iteye.com/blog/99526">http://acme1921209.iteye.com/blog/99526</a><img src ="http://www.cppblog.com/prayer/aggbug/166696.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2012-02-28 14:58 <a href="http://www.cppblog.com/prayer/archive/2012/02/28/166696.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何在 DB2 UDB 中监控死锁</title><link>http://www.cppblog.com/prayer/archive/2011/12/21/162543.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Wed, 21 Dec 2011 08:59:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2011/12/21/162543.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/162543.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2011/12/21/162543.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/162543.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/162543.html</trackback:ping><description><![CDATA[<a href="http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0602jiangt/">http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0602jiangt/</a><br /><br />
<p sizcache="23" sizset="76"><a name="N10039"><span class="atitle">序言</span></a></p>
<p>本文的目的就是通过详细的实例来阐述如何在DB2 UDB 中监控死锁的发生。在DB2 UDB中有两种类型的监控器：快照监控器和事件监控器。快照顾名思义就是数据库连续状态下的一个切面，通过快照监控器，你可以很方便地查看当前连接的应用程序，当前等待的锁，当前的死锁，以及正在执行的SQL语句，同时你可以查看缓冲区，表和表空间的用法。如果保存历史数据，并且能够做出比较，对于分析数据库的并发性能有很大的帮助。</p>
<p>但是我们并不能预测什么时候发生死锁，所以如果有一个后台程序能够一直监控数据库的活动，记录下所有的死锁事件，这对于数据库管理员来说是非常重要的。DB2 UDB提供了事件监控器。通过不遗漏地获得一段时间内所有的数据库事件（在本文中只关心其中的死锁事件），事件监控器提供了一种可以分析历史数据（本文的重点），预测将来趋势的可能。DB2 UDB同时提供了DB2 Performance Expert (DB2/PE) 或者类似的程序用来生成分析报表，不过这已经超出了本文的范畴。</p>
<div class="ibm-alternate-rule">
<hr />
</div>
<p class="ibm-ind-link ibm-back-to-top" sizcache="23" sizset="77"><a class="ibm-anchor-up-link" href="http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0602jiangt/#ibm-pcon">回页首</a></p>
<p sizcache="23" sizset="78"><a name="N10045"><span class="atitle">常用术语</span></a></p>
<p>锁是控制应用程序并发的数据库软件机制，锁用来防止以下情况的发生：</p>
<p>1． 丢失以前更新</p>
<p>2． 不可重复读取</p>
<p>3． 访问未提交数据</p>
<p>锁的模式包括共享锁和排他锁，共享锁允许其他程序读取已经被其他共享锁占用的资源，所以也叫读锁，排他锁意味着在释放资源以前其他的应用程序无法访问同一资源，所以也叫写锁。此外，DB2 UDB 还提供了不同的锁级别，不同的应用程序可能会要求访问不同范围的数据，锁级别有利于充分利用系统资源，提高系统性能。若一个应用程序请求一个锁，而该锁被另外一个应用程序所使用且不能共享，DB2 UDB 就会挂起前一个应用程序。锁升级就是当LOCKLIST (LOCKLIST代表锁能够占用的内存空间) 耗尽或者一个应用程序所拥有的锁大于MAXLOCKS*LOCKLIST的时候（MAXLOCKS 代表应用程序所拥有的锁占所空间的百分比），DB2 UDB 就试图把几个行级别的锁合并为一个表级别的锁，从而释放锁空间。虽然锁升级本身并不耗费多少时间，但是锁住整个表通常会大大地降低并发性能。</p>
<p>当应用程序处于挂起状态超过了一段规定的时间后，DB2 UDB就会自动中止这个应用程序，同时会向SQLCA发送描述性的错误信息。当两个或者更多的应用程序都持有另外一个应用程序所需资源上的锁，没有这些资源，那些应用程序都无法继续完成其工作的时候，就会发生死锁。</p>
<p>在DLCHKTIME超时之后，DB2 UDB会中止发生死锁的某个应用程序（通常为所做工作最少的那个应用程序），这会释放这个应用程序所持有的所有的锁，并允许别的应用程序继续工作，DB2 UDB 将向被终止的应用程序的SQLCA发送描述性的错误信息。LOCKTIMEOUT 指定一个应用程序被允许的锁等待的时间，这将避免全局的死锁从而导致整个应用崩溃。如果LOCKTIMEOUT 的值为-1，应用程序会等待直到该锁被释放或者发生一个死锁。</p>
<div class="ibm-alternate-rule">
<hr />
</div>
<p class="ibm-ind-link ibm-back-to-top" sizcache="23" sizset="79"><a class="ibm-anchor-up-link" href="http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0602jiangt/#ibm-pcon">回页首</a></p>
<p sizcache="23" sizset="80"><a name="N10060"><span class="atitle">事件监控器</span></a></p>
<p>事件监控器用来收集当一个数据库事件发生时所关联的应用程序的信息。这里的事件指，连接，死锁，声明和事务。你可以定义你想监控的事件类型的监控器。比如说，一个死锁监控器就是用来监控死锁的发生。</p>
<p>在DB2 UDB 中存在两种和死锁有关的事件类型：</p>
<ul><li>DEADLOCKS<br />记录简单的应用程序信息。</li><li>DEADLOCKS WITH DETAILS<br />记录所有复杂的信息，包括应用程序、执行语句声明以及死锁的详细信息。但是使用这种事件监控器会因为需要得到大量额外的信息而降低系统的性能。 </li></ul>
<div class="ibm-alternate-rule">
<hr />
</div>
<p class="ibm-ind-link ibm-back-to-top" sizcache="23" sizset="81"><a class="ibm-anchor-up-link" href="http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0602jiangt/#ibm-pcon">回页首</a></p>
<p sizcache="23" sizset="82"><a name="N10079"><span class="atitle">如何监控死锁</span></a></p>
<p>为了详细说明事件监控器在死锁监控中的用途，我引入了一个简单的死锁场景来触发一个死锁，在随后的章节，我会告诉读者如何分析监控结果以及根据结果来避免死锁的发生。</p>
<p>这里我们需要至少三个应用程序来调用DB2 CLI，一个用来监控死锁的发生，另外两个用来产生死锁。我们可以使用DB2 UDB 安装时附带的SAMPLE数据库。</p>
<p>1． 首先建立一个死锁事件监控器</p><br /><a name="N10088"><strong>Session Monitor</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">db2 connect to sample
db2 "create event monitor dlmon for tables, deadlocks with 
details write to file 'C:\dlmon'"
mkdir C:\dlmon
db2 "set event monitor dlmon state 1"
</pre></td></tr></tbody></table><br />
<p>2． 用另外两个应用程序来产生一个死锁</p><br /><a name="N10095"><strong>Session A</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">db2 connect to sample
db2 +c "insert into employee values('000350', 'Truman',
 'I', 'Jiang', 'B00', '5892',
'1999-02-21', 'Engineer', 19, 'M',
 '1978-06-17', 60000, 2000, 6000)"
</pre></td></tr></tbody></table><br />
<p>现在应用程序A就拥有了一个EMPLOYEE表的行级别的排他锁</p>
<p>（注: +c 代表不自动提交SQL语句，DB2 中 autocommit 是缺省设置，也可以通过 db2 update command options using c off 关闭该缺省选项。）</p><br /><a name="N100A5"><strong>Session B</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">db2 connect to sample
db2 +c "insert into project values('AD3300', 'Dead Lock Monitor', 'B00', '000350', 7.00, 
'1982-07-21', '1983-02-03', 'AD3111')"
</pre></td></tr></tbody></table><br />
<p>现在应用程序B就拥有了一个PROJECT表的行级别的排他锁</p><br /><a name="N100B2"><strong>Session A</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">db2 +c "select projname from project"
</pre></td></tr></tbody></table><br />
<p>应用程序A需要PROJECT表上所有行的共享锁，但是因为PROJECT表正在被应用程序B以排他锁的形式独占，这时候应用程序1就进入一个锁等待的状态。</p><br /><a name="N100BF"><strong>Session B</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">db2 +c "select firstnme from employee"
</pre></td></tr></tbody></table><br />
<p>应用程序B也进入一个锁等待的状态。此时就出现了一个死锁状态。</p>
<p>3． 两个本身处于锁等待并且占有资源的应用程序互相等待另外一方所持有的资源，这时候Session A和Session B就出现了死锁状态，这种状态一直会延续直到死锁检查器（超出DLCHKTIME时间以后）检查出一个死锁并且回滚其中的一个事务。</p><br /><a name="N100CF"><strong>Session B</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">SQLN0991N 因为死锁或者超时，当前事务已经被回滚。原因码为 "2". SQLSTATE=40001
这时候死锁事件监控器就会记录这个死锁，同时应用程序A可以完成他的工作。
</pre></td></tr></tbody></table><br /><br /><a name="N100D9"><strong>Session A</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">PROJNAME
----------------------------------------
&#8230;&#8230;
20 条记录已选择
</pre></td></tr></tbody></table><br /><br /><a name="N100E3"><strong>Session A</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">db2 connect reset
</pre></td></tr></tbody></table><br /><br /><a name="N100ED"><strong>Session B</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">db2 connect reset
</pre></td></tr></tbody></table><br />
<p>4． 通过 db2evmon 工具可以获得死锁信息的日志，并且把日志文件导入到本地机器的文件系统当中。在下面一节，我们将详细分析导出的日志文件。</p><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">Session Monitor
db2 connect reset
db2evmon -path c:\dlmon &gt; c:\dlmon\dllog1.txt
</pre></td></tr></tbody></table><br />
<div class="ibm-alternate-rule">
<hr />
</div>
<p class="ibm-ind-link ibm-back-to-top" sizcache="23" sizset="92"><a class="ibm-anchor-up-link" href="http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0602jiangt/#ibm-pcon">回页首</a></p>
<p sizcache="23" sizset="93"><a name="N10103"><span class="atitle">分析监控结果</span></a></p>
<p>本节我们开始详细分析上一节产生的监控结果，从监控导出的日志文件中，我们可以分析出死锁发生的时间，级别，模式以及产生死锁的SQL语句，从而据此来进一步地修正可能由程序并发设计或者数据库设计所导致的缺陷。</p><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0">
<tbody>
<tr>
<td class="code-outline"><pre class="displaycode">	
--------------------------------------------------------------------------
                            EVENT LOG HEADER
  Event Monitor name: DLMON
  Server Product ID: SQL08022
&#8230;&#8230;
  Server instance name: DB2
--------------------------------------------------------------------------
--------------------------------------------------------------------------
  Database Name: SAMPLE  
  Database Path: C:\DB2\NODE0000\SQL00001\
	&#8230;&#8230;
--------------------------------------------------------------------------
3) Deadlock Event ...
  Deadlock ID:   1
	&#8230;&#8230;
4) Connection Header Event ...
  Appl Handle: 949
	&#8230;&#8230;
5) Deadlocked Connection ...
  Deadlock ID:   1
  Participant no.: 2
  Participant no. holding the lock: 1
  Appl Id: G9B56A72.HE13.01B406083205
  Appl Seq number: 0001
  Appl Id of connection holding the lock: G9B56A72.HD13.02CE06083152
	&#8230;&#8230;
  Deadlock detection time: 2006-01-06 16:34:27.327582
  Table of lock waited on      : EMPLOYEE
	(A锁发生的表)
  Schema of lock waited on     : JT      
  Tablespace of lock waited on : USERSPACE1
  Type of lock: Row
	（A锁级别为行锁）
  Mode of lock: X   - Exclusive
	（A锁模式为排他锁）
  Mode application requested on lock: NS - Share (and Next Key Share)
	（在A排他锁上要求B共享锁，发生死锁）
	&#8230;&#8230;
Text     : select name from employee
（产生B共享锁的SQL语句）
  List of Locks:
	（当前所有锁的列表）
		&#8230;&#8230;
      Lock Name                   : 0x020005000D0000000000000052
      Lock Attributes             : 0x00000008
      Release Flags               : 0x40000000
      Lock Count                  : 1
      Hold Count                  : 0
      Lock Object Name            : 13
      Object Type                 : Row
      Tablespace Name             : USERSPACE1
      Table Schema                : JT      
      Table Name                  : PROJECT
      Mode                        : X   - Exclusive
		  （在PROJECT表上有一个排他锁）
&#8230;&#8230;
      Lock Name                   : 0x02000300000000000000000054
      Lock Attributes             : 0x00000000
      Release Flags               : 0x00000001
      Lock Count                  : 1
      Hold Count                  : 0
      Lock Object Name            : 3
      Object Type                 : Table
      Tablespace Name             : USERSPACE1
      Table Schema                : JT      
      Table Name                  : EMPLOYEE
      Mode                        : IS  - Intent Share
		（在EMPLOYEE表上有一个共享锁）
  Locks Held: 6
  Locks in List: 6
&#8230;&#8230;
9) Table Event ...
  Table schema: JT      
  Table name: EMPLOYEE
  Record is the result of a flush: FALSE
  Table type: User
  Data object pages: 1
&#8230;&#8230;
  Rows read: 35
  Rows written: 1
	&#8230;&#8230;
  Tablespace id: 2
  Table event timestamp: 2006-01-06 16:37:28.972501
	（记录EMPLOYEE表上发生的事件）
	</pre></td></tr></tbody></table><br />
<p>我们可以分析一下dllog1.txt 文件，来准确定位死锁发生的原因，看看5）Deadlocked Connection: 我们可以看出死锁发生的表是EMPLOYEE，同时我们也可以判断出这是一个对于已被排他锁占有的资源申请共享锁所导致的死锁。更加重要的是我们得到了产生死锁的SQL语句，从上面我们可以推断出一定存在别的应用程序在以独占锁的方式占用EMPLOYEE表，这很有可能就是对于EMPLOYEE表的插入或者更新动作造成的。</p>
<p>而这最有可能就是插入或者更新事务时间过长所导致的，导致事务时间过长的原因大体有两种，一是来自于并发程序的设计和编写，二是来自于数据库的设计和数据库参数的调整。</p>
<p>本节我们通过仔细地分析事件监控器的结果来推断出导致死锁发生的原因，从而采取有效的措施去避免死锁的发生。这些措施包括调整数据库参数，或者修改应用程序的代码，或者修改SQL语句甚至是数据库的设计来提高代码和SQL语句执行的效率。</p>
<div class="ibm-alternate-rule">
<hr />
</div>
<p class="ibm-ind-link ibm-back-to-top" sizcache="23" sizset="94"><a class="ibm-anchor-up-link" href="http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0602jiangt/#ibm-pcon">回页首</a></p>
<p sizcache="23" sizset="95"><a name="N1011E"><span class="atitle">避免死锁的方法</span></a></p>
<p>越早地考虑数据库设计中的并发性问题，就越可以提高代码执行的效率，降低程序开发和维护的成本，这里我们提出了一些避免死锁，提高应用程序并发性的方法。</p>
<ul><li>设置隔离级别，根据应用程序的业务逻辑和数据完整性需求来决定合适的隔离级别，包括：RR，RS，CS，UR。该决定需要对应用程序需求和相关的业务规则具有基本理解</li><li>尽量避免锁升级，正确调整参数LOCKLIST, MAXLOCKS</li><li>SQL0911N返回码68（LOCKTIMEOUT参数）的原因是锁等待超时，而SQL0911返回码2（DLCHKTIME参数）的原因则是因为死锁被强制回滚，避免这两种错误的方法就是合理设计数据库和建立合理的索引</li><li>尽快提交事务，不要在事务中加入不必要的执行时间过长的代码，比如大的代码循环和远程调用，或者一些没有用处的SELECT语句</li><li>应用程序的框架实现保证一旦发现SQL错误，立刻执行回滚事务，释放锁。</li><li>如果多个应用程序访问同一资源，最好以相同的次序访问。这样，即使前一个访问资源的应用程序会延迟其他应用程序的访问，也不会导致死锁的发生</li><li>设定外键索引，如果想删除父表中的行，就需要扫描多个子表中的多行数据，这样就需要占用多个子表的锁，我们可以通过在外键上建立索引来减少扫描子表的行数，否则若不建立索引，如果从父表中删除一行的时候，就需要扫描整个子表 </li></ul><img src ="http://www.cppblog.com/prayer/aggbug/162543.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2011-12-21 16:59 <a href="http://www.cppblog.com/prayer/archive/2011/12/21/162543.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>两阶段提交</title><link>http://www.cppblog.com/prayer/archive/2011/12/21/162529.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Wed, 21 Dec 2011 06:30:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2011/12/21/162529.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/162529.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2011/12/21/162529.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/162529.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/162529.html</trackback:ping><description><![CDATA[&nbsp;一阶段提交(1PC One Phase Commit) 
<div>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>一 阶段提交就是事务处理器向数据库服务器发出提交请求，然后等待数据库服务器的回应，收到回应后完成事务的提交，或者服务器返回提交失败的结果就回撤事务。 危险期从发出请求开始，到收到回应结束，这段时间中数据库完成数据的修改、日志记录等处理，处理越复杂，危险期就越长。</div>
<div>&nbsp;<wbr></wbr></div>
<h5>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>两阶段提交(2PC&nbsp;<wbr></wbr>Two Phase Commit)</h5>
<p>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr> 两阶段提交把事务提交分成两个阶段：</p>
<ul><li>第一阶段，事务处理器向数据库服务器发出"准备提交"请求，数据库收到请求后执行相同的数据修改和日志记录等处理，不同的是处理完成后只是把事务的状态改成"可以提交",然后把结果返回给事务处理器。</li><li>事务处理器收到回应后进入第二阶段，如果在第一阶段内的危险期中发生了故障，事务处理器收不到回应，则认为事务失败，回撤事务。数据库服务器收不到第二阶段的确认提交请求，把"可以提交"的事务回撤.</li><li>两阶段的第二阶段中事务处理器向数据库服务器发出"确认提交"请求，数据库服务器把事务的"可以提交"状态改为"提交完成"状态，然后返回应答。 </li></ul>
<p>&nbsp;<wbr></wbr>&nbsp;<wbr></wbr> 从严格意义上说，两阶段提交并没有完全解决网络通讯危险期的问题，<strong>但因为第二阶段的处理很简单，只是修改了事务的状态，与第一阶段相比其处理时间极短，所以危险期极短，发生事务提交故障的可能性几乎不存在。&nbsp;<wbr></wbr></strong></p>
<p>&nbsp;</p>
<div>所谓两阶段提交, 即Two Phase Commit (2PC), 是分布式事务采用的一种处理</div><img src ="http://www.cppblog.com/prayer/aggbug/162529.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2011-12-21 14:30 <a href="http://www.cppblog.com/prayer/archive/2011/12/21/162529.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>主键与唯一索引</title><link>http://www.cppblog.com/prayer/archive/2011/12/21/162519.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Wed, 21 Dec 2011 02:58:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2011/12/21/162519.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/162519.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2011/12/21/162519.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/162519.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/162519.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 1.主键一定是唯一性索引，唯一性索引并不一定就是主键；<br />&nbsp;&nbsp;&nbsp;&nbsp; 2.一个表中可以有多个唯一性索引，但只能有一个主键；<br />&nbsp;&nbsp;&nbsp;&nbsp; 3.主键列不允许空值，而唯一性索引列允许空值。<img src ="http://www.cppblog.com/prayer/aggbug/162519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2011-12-21 10:58 <a href="http://www.cppblog.com/prayer/archive/2011/12/21/162519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>詹姆斯·格雷 </title><link>http://www.cppblog.com/prayer/archive/2011/12/21/162517.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Wed, 21 Dec 2011 02:58:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2011/12/21/162517.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/162517.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2011/12/21/162517.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/162517.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/162517.html</trackback:ping><description><![CDATA[<font face="黑体" size="4">詹姆斯&#183;格雷</font> 
<p align="center"><span lang="EN-US">&nbsp;&nbsp;&nbsp; <font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8212;&#8212;数据库技术和&#8220;事务处理&#8221;专家</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; text-indent: 21pt; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">1998年度的图灵奖授予了声誉卓著的数据库专家詹姆斯&#183;格雷(James Gray)或称吉姆&#183;格雷(JimGray，Jim是James的昵称)。这是图灵奖诞生32年的历史上，继数据库技术的先驱查尔斯&#183;巴赫曼(Charles W．Bachman，1973)和关系数据库之父埃德加&#183;科德(Edgar F．Codd，1981)之后，第3位因在推动数据库技术的发展中做出重大贡献而获此殊荣的学者。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><img height="260" src="http://www.zhku.edu.cn/information/jxgz/kc/database/gray.files/gl.jpg" width="149" align="left" border="0"  alt="" /></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 格雷生于1944年，在著名的美国加州大学伯克利分校计算机科学系获得博士学位。其博士论文是有关优先文法语法分析理论的。学成以后，他先后在贝尔实验室、IBM、Tandem、DEC等公司工作，研究方向转向数据库领域。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 在IBM期间，他参与和主持过IMS、System R、SQL／DS、DB2等项目的开发，其中除System R仅作为研究原型，没有成为产品外，其他几个都成为IBM在数据库市场上有影响力的产品。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 在Tandem期间，格雷对该公司的主要数据库产品ENCOMPASS进行了改进与扩充，并参与了系统字典、并行排序、分布式SQL、Nonstop SQL等项目的研制工作。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 在DEC，他仍然主要负责数据库产品的技术。格雷进入数据库领域时，关系数据库的基本理论已经成熟，但各大公司在关系数据库管理系统(RDBMS)的实现和产品开发中，都遇到了一系列技术问题，主要是在数据库的规模愈来愈大，数据库的结构愈来愈复杂，又有愈来愈多的用户共享数据库的情况下，如何保障数据的完整性(Integrity)、安全性(Security)、并行性(Concurrency)，以及一旦出现故障后，数据库如何实现从故障中恢复(Recovery)。这些问题如果不能圆满解决，无论哪个公司的数据库产品都无法进入实用，最终不能被用户所接受。正是在解决这些重大的技术问题，使DBMS成熟并顺利进入市场的过程中，格雷以他的聪明才智发挥了十分关键的作用。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; text-indent: 21pt; line-height: 150%; text-align: justify"><font size="2">目前，各</font><span lang="EN-US"><font size="2">DBMS解决上述问题的主要技术手段和方法如下：</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; text-indent: 21pt; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">1．把对数据库的操作划分为称之为&#8220;事务&#8221;(或&#8220;事务元&#8221;，transaction)的一个个原子单位。事务是事务处理(transaction processing)的基本执行单位，即一个事务中的操作要么全部被执行，要么全部都不执行，即实行所谓all or none的原则。一个事务一般以一个&#8220;开始&#8221;语句(begin)开始，先从数据库中取出一些数据，然后进行所需的处理，最后以&#8220;提交&#8221;语句(commit)结束。如事务中发生异常，则用&#8220;异常终止&#8221;语句(abort)或&#8220;回退&#8221;语句(rollback)撤销本事务执行过程中对数据库已做的所有更新(即所谓undo)，将数据库恢复到事务开始时的正确状态，以保障数据的完整性、一致性。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 2．用户在对数据库发出操作请求时，系统对有关的不同粒度(granularity)的数据元素(字段、记录以至整个文件)&#8220;加锁&#8221;(10cking)，加锁的数据将被暂时禁止其他用户访问(我们这里仅是一种简化的解释，实际上，根据用户对数据请求的不同性质，加锁的数据如何对待另一用户的请求，呈现复杂的情况，例如，如果加锁的数据将被修改，那是绝对禁止其他用户访问的；而如果加锁的数据只用于读出，则其他用户的读出请求还将是允许的。这由所谓&#8220;锁相容性矩阵&#8221;&#8212;&#8212;lock compatibility matrix管理和控制)。操作完成后&#8220;解锁&#8221;(unlocking)。这一机制用以既保持事务之间的&#8220;并发性&#8221;，又保证数据的&#8220;完整性&#8221;。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 3．建立系统运行日志(10g)，记载各事务的始点、终点以及在事务中被更新过的页面的改前和改后状况(before image和afterimage)，以便在系统出现散障使数据库遭到破坏时，能根据定期或不定期为数据库所作的备份(backup)加上日志中的信息将数据库恢复到系统故障前的正确状态，同时又能保留最后一次备份以来对数据库所作的修改。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 4。对数据库的任何更新分两阶段提交(two-phase commit)。这是基于一个事务可能同时涉及两个不同的数据库系统而必需的，这在分布式系统中尤为重要。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 上述及其他各种方法可总称为&#8220;事务处理技术&#8221;(transaction processing technique)。格雷在事务处理技术上的创造性思维和开拓性工作，使他成为该技术领域公认的权威。他的研究成果反映在他发表的一系列论文和研究报告之中，最后结晶为一部厚厚的专著Transaction Processing：Concepts and Techniques(Morgan Kaufmann Publishers，1993，另一作者为德国斯图加特大学的A．Reuter教授)。事务处理技术虽然诞生于数据库研究，但对于分布式系统，client／server结构中的数据管理与通信，对于容错和高可靠性系统，同样具有重要的意义。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 格雷的另一部著作是The Benchmark Handbook：for Database and Transaction Processing Systems，第1版于1991年，第2版于1993年出版，也是Morgan Kaufmann出版社出版的。格雷还是该出版社&#8220;数据管理系统丛书&#8221;的主编。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 格雷在数据库学术界十分活跃。国际上定期或不定期举行的一些重要的数据库学术会议如VLDB、SIGMOD上，都能见到他的身影，听到他的声音。除了在公司从事研究开发外，他还兼职在母校伯克利、斯坦福大学、布达佩斯大学从事过教学和讲学活动。1992年，VLDB杂志(The VLDB Journal)创刊，他出任主编。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 格雷是ACM于1988年授予IBM的System R以软件系统奖的6位得奖人之一，其他5人是Donald Chamberlin、Raymond Lorie、Gianfranco Putzolu、Patricia Selinger和Irving Traiger。正是由于格雷在数据库技术方面的声誉，软件业中的&#8220;巨无霸&#8221;微软公司在1993年决定进入大型关系数据库市场时，才不惜用种种手段把格雷从DEC公司挖过来。因格雷不喜欢微软总部所在的多雨的西雅图，愿意留在阳光灿烂的旧金山，微软特地在旧金山开辟第二个微软研究院海湾区研究中心BARC(Bay Area Research Center)，安排格雷任该研究院主管。格雷果然不负所望，领导一个研制小组开发出了MS SQL Server 7．0，成为微软历史上一个里程碑式的版本，而且也成为当今关系数据库市场上的佼佼者。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 格雷是在1999年5月4日于亚特兰大举行的ACM全国会议上接受图灵奖的。格雷发表了&#8220;信息技术今后的目标&#8221;的演说(What Next?一A dozen remaining IT problems)，纵论了信息技术发展中有关的几个方向性问题。后来，该文经修改后在SIGMOD的会上以What Next?一A dozen IT Research Goals为题再次发表。格雷的演说在对计算技术的发展作总结性回顾时认为，英国数学家巴贝奇(Charles Babage，1791&#8212;1871)在19世纪所梦想和追求的计算机今天已经基本实现；美国数学家布什(Vannevar Bush，1890&#8212;1974，曾任罗斯福总统的科学顾问)20世纪40年代所设想的&#8220;梅米克斯&#8221;MEMEX即&#8220;记忆延伸器&#8221;(MEMory EXtender)当前已接近实现；而图灵所提出的智能机器离实现还有一段距离，目前的计算机还难以通过&#8220;图灵测试&#8221;。为了完全实现上述3位科学巨人的理想，格雷呼吁美国政府要重视支持对IT技术的长期研究，认为其重要意义不亚于200年前杰弗逊(Thomas Jefferson，1743&#8212;1826，&#8220;独立宣言&#8221;的起草者，美国第三任总统，1801&#8212;1809在位)决定用1 500万美元从法国政府手中买回路易斯安娜领地(Louisiana Territory，这是位于密西西比河和洛矶山脉之间，北至加拿大，南达墨西哥湾的大块土地，面积达2 070 000km<sup>2</sup>)这一被称为Louisiana Purchase的著名历史事件，然后又派出以刘易斯上尉(Captain Meriwether Lewis)和克拉克(William Clark)为首的&#8220;发现军团(Corps for Discovery)到西部探险直至太平洋海岸，为最终形成美国如今的版图奠定了基础。格雷认为，一个好的IT长期目标应具有以下5个关键性：</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 1．可理解性&nbsp; 目标应能简单表述并被人理解。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 2．有挑战性&nbsp; 如何达到目标不是很明显的。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 3．用途广泛&nbsp; 不只对计算机科学家有用，而是对大多数人有用。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; text-indent: 10.5pt; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp; 4．可测试性&nbsp; 以便检查项目进展并知道目标是否已经达到。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 5．渐进性&nbsp; 中间有若干里程碑，以检查项目进展并鼓舞研究人员干下去。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 在以上论点支持下，格雷提出的几个IT技术的长期研究目标如下：</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 1．规模可伸缩性(scalability)。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 2．通过图灵测试。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 3．语音到文本的转换(Speech to Text)。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 4．文本到语音的转换(Text to Speech)。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 5．机器视觉，能像人一样识别物体和运动。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 6.个人的&#8220;梅米克斯&#8221;，可记录人所看到和听到的一切，需要时快速检索出来。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 7．世界的&#8220;梅米克斯&#8221;，即建立文本、音乐、图像、艺术、电影的&#8220;全集&#8221;(corpus)，可回答有关的任何提问，像人类专家那样快而好地做索引，做文摘。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 8．虚拟现实(格雷用了TelePresenee这个词，参见对1969年图灵奖获得者明斯基的介绍)。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp; &nbsp; 9．无故障系统(Trouble-Free Systems)。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 10．安全系统(Secure Systems)。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp; &nbsp; 11．高可用系统(AlwaysUp)。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 12．自动程序设计(Automatic Programming)。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp; 格雷的图灵奖演说全文已由笔者译出，摘要刊于《中国计算机报》2000年6月，有兴趣的读者可以一阅。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 目前，格雷本人正在从事Scalability这一长期目标的研究，他是微软&#8220;规模可伸缩的服务器研究小组&#8221;(Scalable Servers Research Group)的高级研究员，该项目已有若干研究成果在网上公布。</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; 格雷的电子信箱为：</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">&nbsp;&nbsp;&nbsp; gray @ microsoft．com</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; text-indent: 21pt; line-height: 150%; text-align: justify"><font size="2">他的因特网个人主页为：</font></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; text-indent: 21pt; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2">http：//www．research．microsoft．com/research／barc／gray</font></span></p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; text-indent: 21pt; line-height: 150%; text-align: justify">(引用自:http://202.207.0.245:9001/jisuanjifazhanshi/tuling/33.htm)</p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2"></font></span>&nbsp;</p>
<p style="margin-top: 2px; text-justify: inter-ideograph; margin-bottom: 2px; text-indent: 21pt; line-height: 150%; text-align: justify"><span lang="EN-US"><font size="2"></font></span>&nbsp;</p><img src ="http://www.cppblog.com/prayer/aggbug/162517.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2011-12-21 10:58 <a href="http://www.cppblog.com/prayer/archive/2011/12/21/162517.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DB2 Merge语句</title><link>http://www.cppblog.com/prayer/archive/2011/10/18/158618.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Tue, 18 Oct 2011 07:42:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2011/10/18/158618.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/158618.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2011/10/18/158618.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/158618.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/158618.html</trackback:ping><description><![CDATA[DB2 Merge语句是经常可以用到的DB2语句，下面对DB2 Merge语句作了详细的介绍，如果您对此方面感兴趣的话，不妨一看。 
<p>　　DB2 Merge语句的作用非常强大，它可以将一个表中的数据合并到另一个表中，在合并的同时可以进行插入、删除、更新等操作。我们还是先来看个简单的例子吧，假设你定义了一个雇员表(employe)，一个经理表(manager)，如下所示：</p>
<p>　　---雇员表(EMPLOYE)</p>
<p>
<table style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
<tbody>
<tr>
<td style="word-wrap: break-word" bgcolor="#fdfddf"><font style="font-weight: bold; color: #990000">以下是代码片段：</font><br />&nbsp;&nbsp;&nbsp; CREATE TABLE EMPLOYE ( <br />　　EMPLOYEID INTEGER NOT NULL,---员工号 <br />　　NAME VARCHAR(20) NOT NULL,---姓名 <br />　　SALARY DOUBLE---薪水 <br />　　); <br />　　INSERT INTO EMPLOYE (EMPLOYEID,NAME,SALARY) VALUES <br />　　(1,'张三',1000), <br />　　(2,'李四',2000), <br />　　(3,'王五',3000), <br />　　(4,'赵六',4000), <br />　　(5,'高七',5000);</td></tr></tbody></table></p>
<p>　　--经理表(MANAGER)</p>
<p>
<table style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
<tbody>
<tr>
<td style="word-wrap: break-word" bgcolor="#fdfddf"><font style="font-weight: bold; color: #990000">以下是代码片段：</font><br />&nbsp;&nbsp;&nbsp; CREATE TABLE MANAGER ( <br />　　EMPLOYEID INTEGER NOT NULL,---经理号 <br />　　NAME VARCHAR(20) NOT NULL,---姓名 <br />　　SALARY DOUBLE---薪水 <br />　　); <br />　　INSERT INTO MANAGER (MANAGERID,NAME,SALARY) VALUES <br />　　(3,'王五',5000), <br />　　(4,'赵六',6000);</td></tr></tbody></table></p>
<p>　　---雇员表(EMPLOYE)</p>
<p>
<table style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
<tbody>
<tr>
<td style="word-wrap: break-word" bgcolor="#fdfddf"><font style="font-weight: bold; color: #990000">以下是代码片段：</font><br />&nbsp;&nbsp;&nbsp; CREATE TABLE EMPLOYE ( <br />　　EMPLOYEID INTEGER NOT NULL,---员工号 <br />　　NAME VARCHAR(20) NOT NULL,---姓名 <br />　　SALARY DOUBLE---薪水 <br />　　); <br />　　INSERT INTO EMPLOYE (EMPLOYEID,NAME,SALARY) VALUES <br />　　(1,'张三',1000), <br />　　(2,'李四',2000), <br />　　(3,'王五',3000), <br />　　(4,'赵六',4000), <br />　　(5,'高七',5000);</td></tr></tbody></table></p>
<p>　　--经理表(MANAGER)</p>
<p>
<table style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
<tbody>
<tr>
<td style="word-wrap: break-word" bgcolor="#fdfddf"><font style="font-weight: bold; color: #990000">以下是代码片段：</font><br />&nbsp;&nbsp;&nbsp; CREATE TABLE MANAGER ( <br />　　EMPLOYEID INTEGER NOT NULL,---经理号 <br />　　NAME VARCHAR(20) NOT NULL,---姓名 <br />　　SALARY DOUBLE---薪水 <br />　　); <br />　　INSERT INTO MANAGER (MANAGERID,NAME,SALARY) VALUES <br />　　(3,'王五',5000), <br />　　(4,'赵六',6000);</td></tr></tbody></table></p>　经过一段时间，你发现这样的数据模型，或者说表结构设计简直就是一大败笔，经理和雇员都是员工嘛，为什么要设计两个表呢？发现错误后就需要改正，所以你决定，删除经理表(MANAGER)表，将MANAGER 表中的数据合并到EMPLOYE 表中，仔细分析发现，王五在两个表中都存在(可能是干的好升官了)，而刘八在EMPLOYE 表中并不存在，现在，我们要求把EMPLOYE 表中不存在的MANAGER都插入到EMPLOYE 表中，存在的更新薪水。该怎么办呢？这个问题并不难，通常，我们可以分两步，如下所示： 
<p>　　--更新存在的</p>
<p>
<table style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
<tbody>
<tr>
<td style="word-wrap: break-word" bgcolor="#fdfddf"><font style="font-weight: bold; color: #990000">以下是代码片段：</font><br />&nbsp;&nbsp;&nbsp; UPDATE EMPLOYE AS EM SET SALARY=(SELECT SALARY FROM MANAGER WHERE MANAGERID=EM.EMPLOYEID) <br />　　WHERE EMPLOYEID IN ( <br />　　SELECT MANAGERID FROM MANAGER <br />　　);</td></tr></tbody></table></p>
<p>　　---插入不存在的</p>
<p>
<table style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
<tbody>
<tr>
<td style="word-wrap: break-word" bgcolor="#fdfddf"><font style="font-weight: bold; color: #990000">以下是代码片段：</font><br />&nbsp;&nbsp;&nbsp; INSERT INTO EMPLOYE (EMPLOYEID,NAME,SALARY) <br />　　SELECT MANAGERID,NAME,SALARY FROM MANAGER WHERE MANAGERID NOT IN ( <br />　　SELECT EMPLOYEID FROM EMPLOYE <br />　　);</td></tr></tbody></table></p>
<p>　　--更新存在的</p>
<p>
<table style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
<tbody>
<tr>
<td style="word-wrap: break-word" bgcolor="#fdfddf"><font style="font-weight: bold; color: #990000">以下是代码片段：</font><br />&nbsp;&nbsp;&nbsp; UPDATE EMPLOYE AS EM SET SALARY=(SELECT SALARY FROM MANAGER WHERE MANAGERID=EM.EMPLOYEID) <br />　　WHERE EMPLOYEID IN ( <br />　　SELECT MANAGERID FROM MANAGER <br />　　);</td></tr></tbody></table></p>
<p>　　---插入不存在的</p>
<p>
<table style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
<tbody>
<tr>
<td style="word-wrap: break-word" bgcolor="#fdfddf"><font style="font-weight: bold; color: #990000">以下是代码片段：</font><br />&nbsp;&nbsp;&nbsp; INSERT INTO EMPLOYE (EMPLOYEID,NAME,SALARY) <br />　　SELECT MANAGERID,NAME,SALARY FROM MANAGER WHERE MANAGERID NOT IN ( <br />　　SELECT EMPLOYEID FROM EMPLOYE <br />　　);</td></tr></tbody></table></p>
<p>　　上面的处理是可以的，但是我们还可以有更简单的方法，就是用Merge语句，如下所示：</p>
<p>
<table style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
<tbody>
<tr>
<td style="word-wrap: break-word" bgcolor="#fdfddf">
<p><font style="font-weight: bold; color: #990000">以下是代码片段：</font><br />&nbsp;&nbsp;&nbsp; MERGE INTO EMPLOYE AS EM <br />　　USING MANAGER AS MA <br />　　ON EM.EMPLOYEID=MA.MANAGERID <br />　　WHEN MATCHED THEN UPDATE SET EM.SALARY=MA.SALARY <br />　　WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY); <br />　　MERGE INTO EMPLOYE AS EM <br />　　USING MANAGER AS MA <br />　　ON EM.EMPLOYEID=MA.MANAGERID <br />　　WHEN MATCHED THEN UPDATE SET EM.SALARY=MA.SALARY <br />　　WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY);</p>
<p>&nbsp;</p></td></tr></tbody></table></p><br />　在上面的处理中，我们用经理表(MANAGER)的薪水更新了雇员表(EMPLOYE)的薪水，假设现在要求，如果经理表(MANAGER)的薪水&gt;雇员表(EMPLOYE)的薪水的时候更新，否则不更新，怎么办呢？如下： 
<p>
<table style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
<tbody>
<tr>
<td style="word-wrap: break-word" bgcolor="#fdfddf"><font style="font-weight: bold; color: #990000">以下是代码片段：</font><br />&nbsp;&nbsp;&nbsp; MERGE INTO EMPLOYE AS EM <br />　　USING MANAGER AS MA <br />　　ON EM.EMPLOYEID=MA.MANAGERID <br />　　WHEN MATCHED AND EM.SALARY <br />　　WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY); <br />　　MERGE INTO EMPLOYE AS EM <br />　　USING MANAGER AS MA <br />　　ON EM.EMPLOYEID=MA.MANAGERID <br />　　WHEN MATCHED AND EM.SALARY <br />　　WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY);</td></tr></tbody></table></p>
<p>　　不仔细的朋友可能没有看出上面两条语句的区别，哈哈，请仔细对比一下这两条语句。上面的语句中多了ELSE IGNORE语句，它的意思正如它英文的意思，其它情况忽略不处理。如果你认为理论上应该不存在EM.SALARY&gt;MA.SALARY的数据，如果有，说明有问题，你想抛个异常，怎么办？如下：</p>
<p>
<table style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
<tbody>
<tr>
<td style="word-wrap: break-word" bgcolor="#fdfddf"><font style="font-weight: bold; color: #990000">以下是代码片段：</font><br />&nbsp;&nbsp;&nbsp; MERGE INTO EMPLOYE AS EM <br />　　USING MANAGER AS MA <br />　　ON EM.EMPLOYEID=MA.MANAGERID <br />　　WHEN MATCHED AND EM.SALARY <br />　　WHEN MATCHED AND EM.SALARY&gt;MA.SALARY THEN SIGNAL SQLSTATE '70001' SET MESSAGE_TEXT = 'EM.SALARY&gt;MA.SALARY' <br />　　WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY) <br />　　ELSE IGNORE; <br />　　MERGE INTO EMPLOYE AS EM <br />　　USING MANAGER AS MA <br />　　ON EM.EMPLOYEID=MA.MANAGERID <br />　　WHEN MATCHED AND EM.SALARY <br />　　WHEN MATCHED AND EM.SALARY&gt;MA.SALARY THEN SIGNAL SQLSTATE '70001' SET MESSAGE_TEXT = 'EM.SALARY&gt;MA.SALARY' <br />　　WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY) <br />　　ELSE IGNORE;</td></tr></tbody></table></p>
<p>　　对于EM.SALARY&gt;MA.SALARY的情况，如果你不想抛异常，而是删除EMPLOYE中的数据，怎么办？如下：</p>
<p>
<table style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
<tbody>
<tr>
<td style="word-wrap: break-word" bgcolor="#fdfddf"><font style="font-weight: bold; color: #990000">以下是代码片段：</font><br />&nbsp;&nbsp;&nbsp; MERGE INTO EMPLOYE AS EM <br />　　USING MANAGER AS MA <br />　　ON EM.EMPLOYEID=MA.MANAGERID <br />　　WHEN MATCHED AND EM.SALARY <br />　　WHEN MATCHED AND EM.SALARY&gt;MA.SALARY THEN DELETE <br />　　WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY) <br />　　ELSE IGNORE; <br />　　MERGE INTO EMPLOYE AS EM <br />　　USING MANAGER AS MA <br />　　ON EM.EMPLOYEID=MA.MANAGERID <br />　　WHEN MATCHED AND EM.SALARY <br />　　WHEN MATCHED AND EM.SALARY&gt;MA.SALARY THEN DELETE <br />　　WHEN NOT MATCHED THEN INSERT VALUES (MA.MANAGERID,MA.NAME,MA.SALARY) <br />　　ELSE IGNORE;</td></tr></tbody></table></p>
<p>　　以上简单介绍了Merge语句的使用，它的应用不只是上面介绍的情况，其实它可以应用在很多其他语句不好处理情况，这需要你去发现，记住熟能生巧</p><br /><br /><img src ="http://www.cppblog.com/prayer/aggbug/158618.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2011-10-18 15:42 <a href="http://www.cppblog.com/prayer/archive/2011/10/18/158618.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DB2 锁升级失败将引起死锁</title><link>http://www.cppblog.com/prayer/archive/2010/12/14/136361.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Tue, 14 Dec 2010 02:39:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/12/14/136361.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/136361.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/12/14/136361.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/136361.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/136361.html</trackback:ping><description><![CDATA[<h3><a href="http://iamwave.javaeye.com/blog/649741"><u><font color=#e9650e>DB2 锁升级失败将引起死锁</font></u></a></h3>
<strong>文章分类:<a style="PADDING-RIGHT: 10px; TEXT-DECORATION: none" href="http://www.javaeye.com/blogs/category/database"><font color=#e9650e>数据库</font></a></strong>
<div class=blog_content>--start <br>
<div class=quote_title>引用</div>
<div class=quote_div><br>DB2 SQL error: SQLCODE: -911, SQLSTATE: 40001, SQLERRMC: 2 <br>Message: The current transaction has been rolled back because of a deadlock or timeout.&nbsp; Reason code "2". <br></div>
<br><br>&nbsp;&nbsp;&nbsp; 昨天，执行了一条很简单的SQL，却怎么也执行不成功，报的错误如上所示，是死锁。既然是死锁，那就过一会执行吧。等了一会后仍然死锁。到底是哪个事务和哪个事务相互锁了呢？查询了老半天才发现原来这条SQL语句更新的数据量非常大，导致锁升级，然后锁升级又失败了，导致了死锁。原来锁升级失败会导致死锁。所以，通常我们应该将LOCKLIST和MAXLOCK参数调整到足够大，尽量避免锁等待、锁升级，发挥数据库的最大并发性。 <br></div>
<img src ="http://www.cppblog.com/prayer/aggbug/136361.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-12-14 10:39 <a href="http://www.cppblog.com/prayer/archive/2010/12/14/136361.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何使用db2expln工具查看某个程序包中SQL语句的存取计划</title><link>http://www.cppblog.com/prayer/archive/2010/10/15/130037.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Fri, 15 Oct 2010 07:33:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/10/15/130037.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/130037.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/10/15/130037.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/130037.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/130037.html</trackback:ping><description><![CDATA[<p><font size=2>举个例子，对于数据库SAMPLE中程序包DB2INST1.P0203450，使用下面命令：<br>db2expln -d SAMPLE -g -c db2inst1 -p P0203450 -s 0 -t<br>其中<br>-g 是指给出存取计划的图形输出(用字符模拟的)<br>-s 0 是指分析所有的SQL命令</font></p>
<p><font size=2>下面是相应的输出：<br>DB2 Universal Database Version 7.2, 5622-044 (c) Copyright IBM Corp. 1991, 2001<br>Licensed Material - Program Property of IBM<br>IBM DATABASE 2 SQL Explain Tool</font></p>
<p><font size=2>Processing package DB2INST1.P0203450.<br>******************** PACKAGE *********************</font></p>
<p><font size=2>Package Name = DB2INST1.P0203450<br><font color=#f0f0f0>--------</font>Prep Date = 2002/12/17<br><font color=#f0f0f0>--------</font>Prep Time = 16:02:04</font></p>
<p><font size=2><font color=#f0f0f0>--------</font>Bind Timestamp = 2002-12-17-16.02.04.373971</font></p>
<p><font size=2><font color=#f0f0f0>--------</font>Isolation Level <font color=#f0f0f0>--------</font><font color=#f0f0f0>-</font>= Cursor Stability<br><font color=#f0f0f0>--------</font>Blocking<font color=#f0f0f0>--------</font><font color=#f0f0f0>--------</font> = Block Unambiguous Cursors<br><font color=#f0f0f0>--------</font>Query Optimization Class = 5</font></p>
<p><font size=2><font color=#f0f0f0>--------</font>Partition Parallel <font color=#f0f0f0>------</font>= No<br><font color=#f0f0f0>--------</font>Intra-Partition Parallel = No</font></p>
<p><font size=2><font color=#f0f0f0>--------</font>Function Path<font color=#f0f0f0>--------</font><font color=#f0f0f0>---</font> = "SYSIBM", "SYSFUN", "DB2INST1"</font></p>
<p><font size=2>Processing Section 1.<br>-------------------- SECTION ----------------------<br>......<br>-------------------- SECTION ----------------------<br>Section = 2</font></p>
<p><font size=2>SQL Statement:<br><br>update STAFF set NAME = 'test' <br>where ID = 350</font></p>
<p><font size=2>Estimated Cost = 75<br>Estimated Cardinality = 2</font></p>
<p><font size=2>Access Table Name = DB2INST1.STAFF ID = 2,3<br>| #Columns = 2<br>| Relation Scan<br>| | Prefetch: Eligible<br>| Lock Intents<br>| | Table: Intent Exclusive<br>| | Row : Update<br>| Sargable Predicate(s)<br>| | #Predicates = 1<br>Update: Table Name = DB2INST1.STAFF ID = 2,3</font></p>
<p><font size=2>End of section</font></p>
<p><font size=2>Optimizer Plan:</font></p>
<p><font size=2><font color=#f0f0f0>------</font>UPDATE <br><font color=#f0f0f0>------</font>( -2) <br><font color=#f0f0f0>------</font>/<font color=#f0f0f0>--</font> \<br><font color=#f0f0f0>-</font>TBSCAN <font color=#f0f0f0>--</font>Table: <br><font color=#f0f0f0>--</font>( 3) <font color=#f0f0f0>--</font>DB2INST1 <br><font color=#f0f0f0>---</font>|<font color=#f0f0f0> -----</font>STAFF <br>Table: <br>DB2INST1 <br>STAFF <br>......</font></p>
<p><font size=2><br>可以用下面命令找出数据库中存在的程序包：<br>db2 "select pkgschema, pkgname from syscat.packages"<br>上面例子中的程序包DB2INST1.P0203450是一个存储过程。</font></p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/prayer/aggbug/130037.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-10-15 15:33 <a href="http://www.cppblog.com/prayer/archive/2010/10/15/130037.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>db2设置参数数据及更新</title><link>http://www.cppblog.com/prayer/archive/2010/10/15/130031.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Fri, 15 Oct 2010 07:26:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/10/15/130031.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/130031.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/10/15/130031.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/130031.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/130031.html</trackback:ping><description><![CDATA[<pre>#!/bin/sh
# *******************************************************
# DB2 ENVIRONMENT VARIABLES
# *******************************************************
db2set DB2_MMAP_READ=NO
db2set DB2_MMAP_WRITE=NO
db2set DB2_FMP_COMM_HEAPSZ=
db2set DB2_EVALUNCOMMITTED=YES
db2set DB2_SKIPINSERTED=YES
db2set DB2_SKIPDELETED=YES
db2set DB2_HASH_JOIN=NO
# *******************************************************
# DB2 DATABASE MANAGER SETTINGS; NOTE: MONITORING
# IS OFF TO REDUCE CPU; YOUR APPLICATION MAY REQUIRE
# MONITORS TO BE ON, SO CHANGE ACCORDINGLY
# *******************************************************
db2 update dbm cfg using NUMDB 4
db2 update dbm cfg using DFT_MON_BUFPOOL OFF
db2 update dbm cfg using DFT_MON_LOCK OFF
db2 update dbm cfg using DFT_MON_SORT OFF
db2 update dbm cfg using DFT_MON_STMT OFF
db2 update dbm cfg using DFT_MON_TABLE OFF
db2 update dbm cfg using DFT_MON_UOW OFF
db2 update dbm cfg using DFT_MON_TIMESTAMP OFF
db2 update dbm cfg using MON_HEAP_SZ 10000
db2 update dbm cfg using UDF_MEM_SZ 256
db2 update dbm cfg using JAVA_HEAP_SZ 512
db2 update dbm cfg using SHEAPTHRES 10000
db2 update dbm cfg using DIR_CACHE YES
db2 update dbm cfg using ASLHEAPSZ 15
db2 update dbm cfg using RQRIOBLK 65535
db2 update dbm cfg using QUERY_HEAP_SZ 16384
db2 update dbm cfg using DRDA_HEAP_SZ 128
# *******************************************************
# DB2 DATABASE MANAGER SETTINGS FOR CONNECTIONS AND AGENTS
# SHOWN HERE SUPPORTS 1200 CONCURRENT CONNECTIONS!
# *******************************************************
db2 update dbm cfg using FENCED_POOL 200
db2 update dbm cfg using NUM_INITAGENTS 50
db2 update dbm cfg using MAXAGENTS 200
db2 update dbm cfg using MAX_COORDAGENTS 200
db2 update dbm cfg using NUM_INITFENCED 50
db2 update dbm cfg using NUM_POOLAGENTS 200
db2 update dbm cfg using MAX_CONNECTIONS 200
# *******************************************************
# UPDATE YOUR DATABASE SETTINGS
# *******************************************************
db2 update db cfg for yourdb using DFT_QUERYOPT 2
db2 update db cfg for yourdb using DBHEAP 1200
db2 update db cfg for yourdb using CATALOGCACHE_SZ 64
db2 update db cfg for yourdb using LOGBUFSZ 128
db2 update db cfg for yourdb using UTIL_HEAP_SZ 5000
db2 update db cfg for yourdb using LOCKLIST 1000
db2 update db cfg for yourdb using APP_CTL_HEAP_SZ 1000
db2 update db cfg for yourdb using APPGROUP_MEM_SZ 60000
db2 update db cfg for yourdb using SORTHEAP 256
db2 update db cfg for yourdb using STMTHEAP 4096
db2 update db cfg for yourdb using APPLHEAPSZ 4096
db2 update db cfg for yourdb using PCKCACHESZ 5000
db2 update db cfg for yourdb using STAT_HEAP_SZ 4384
db2 update db cfg for yourdb using MAXLOCKS 25
db2 update db cfg for yourdb using LOCKTIMEOUT 60
db2 update db cfg for yourdb using CHNGPGS_THRESH 60
db2 update db cfg for yourdb using NUM_IOCLEANERS 4
db2 update db cfg for yourdb using NUM_IOSERVERS 6
db2 update db cfg for yourdb using MAXAPPLS 1200
db2 update db cfg for yourdb using AVG_APPLS 1
db2 update db cfg for yourdb using MAXFILOP 64
db2 update db cfg for yourdb using LOGFILSIZ 1000
db2 update db cfg for yourdb using LOGPRIMARY 10
db2 update db cfg for yourdb using LOGSECOND 20</pre>
<pre>-------------------</pre>
<pre>设置当前模式：</pre>
<pre>set current path = oais(模式名)</pre>
<pre>查看当前的模式：</pre>
<pre>db2 values(current path)</pre>
<pre>设置为默认的、缺省的：</pre>
<pre>set current path = system path</pre>
<pre>----------------------------------------</pre>
<pre>详细的列表信息请查看：
<p>see IBM publib site for <a href="http://publib.boulder.ibm.com/infocenter/db2luw/v8/topic/com.ibm.db2.udb.doc/admin/c0005414.htm"><u><font color=#0000ff>Database tuning overview</font></u></a>.</p>
</pre>
<img src ="http://www.cppblog.com/prayer/aggbug/130031.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-10-15 15:26 <a href="http://www.cppblog.com/prayer/archive/2010/10/15/130031.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>db2表名大小写问题</title><link>http://www.cppblog.com/prayer/archive/2010/08/05/122320.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Thu, 05 Aug 2010 08:16:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/08/05/122320.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/122320.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/08/05/122320.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/122320.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/122320.html</trackback:ping><description><![CDATA[<p class=smalltitle>今天在查warehous数据库下的表Linux_CPU</p>
<p class=smalltitle><a onclick="javascript:tagshow(event, 'db2');" href="javascript:;" target=_self><u><strong><font color=#0000ff>db2</font></strong></u></a> "select * from Linux_CPU" 总是提示表未定义.后来发现表名大小写问题,应该在db2提示符下运行 select * from "Linux_CPU"或者db2 "select * from \"Linux_CPU\""才正确,.晚上在<a onclick="javascript:tagshow(event, 'IBM');" href="javascript:;" target=_self><u><strong><font color=#0000ff>IBM</font></strong></u></a>网站上查到详细说明.</p>
<h1 class=smalltitle>如何定义和使用含小写字符的 DB2 表名？</h1>
<img class=display-img title=点击图片可在新窗口打开 style="CURSOR: pointer" height=6 alt="" src="http://www.ibm.com/i/c.gif" width=1>
<table cellSpacing=0 cellPadding=0 width=443 border=0 sizcache="2" sizset="9">
    <tbody sizcache="1" sizset="9">
        <tr>
            <td class=docfnt>
            <p><strong><font face=Arial>Document #:</font></strong><font face=Arial>1807545I27000</font><br><br><strong><font face=Arial>Body:</font></strong><br><font face=宋体>[标题]</font>如何定义和使用含小写字符的 DB2 表名？<font face=宋体><br></font><br><font face=宋体><br>环境:</font><br><font face=宋体>产品：DB2 UDB</font><br><font face=宋体>平台：跨平台</font><br><font face=宋体>版本：v8<br></font><br><font face=宋体><br>问题描述:<br></font><br>在 DB2 UDB 中除非另外指定，否则，所有名称都可包括下列字符：<br><br>&#183;A 到 Z。当在大多数名称中使用时，字符 A 到 Z 将从小写形式转换为大写形式。<br>&#183;0 到 9<br>&#183;@、#、$ 和 _（下划线）<br>&#183;名称不能以数字或下划线字符开始。<br><br>作为<a onclick="javascript:tagshow(event, '%CA%FD%BE%DD%BF%E2');" href="javascript:;" target=_self><u><strong><font color=#0000ff>数据库</font></strong></u></a>对象的表，其命名同样遵循上述规则，因此即使用户创建表时使用的名称是小写的，DB2 仍会自动将其转化为大写的形式，如：<br><br>db2 create table testname (a1 int)<br>DB20000I <a onclick="javascript:tagshow(event, 'SQL');" href="javascript:;" target=_self><u><strong><font color=#0000ff>SQL</font></strong></u></a> 命令成功完成。<br><br>db2 list tables<br><br>表／视图 　　 模式 类型 创建时间<br>------------------------------- --------------- ----- --------------------------<br>:<br>TESTNAME TESTUSER T 2005-09-24-18.15.30.428001<br>:<br><br>如果用户希望创建的表名含有小写字符时应如何处理呢？这里简单介绍一下其创建和使用的方法。<br><br><font face=宋体><br>解答:</font><br><br>如果需要创建含小写英文字符的 DB2 表名，应使用双引号将表名括起来，为避免双引号被转义，需在双引号前加上转义字符<font face="Times New Roman">&#8220;</font>\<font face="Times New Roman">&#8221;</font>。以创建一个名为 TestName 的表为例，其创建语句应写为：<br><br>db2 "create table \"TestName\" (col1 int)" -- Windows &amp; Unix 环境下<br><br>如果创建的表名中包含有<font face="Times New Roman">&#8220;</font>$<font face="Times New Roman">&#8221;</font>的特殊字符时，在 Unix 环境下，还需要在这些字符的前面也加一个转义字符，以创建名为 Test$Name 的表为例，创建语句应为：<br><br>db2 create table \"Test\$Name\" (col1 int)<br><br>而在 Windows 环境下，可直接写为：<br><br>db2 create table \"Test$Name\" (col1 int)<br><br>表创建完成之后，在以后对这些表进行引用的时候，同样需要象在创建表的语句中那样对表名加转义符进行引用，如：<br><br>Windows 环境下：<br><br>db2 insert into \"Test$Name\" values (1),(2)<br>DB20000I SQL 命令成功完成。<br><br>db2 select * from \"Test$Name\"<br><br>COL1<br>-----------<br>1<br>2<br>2 条记录已选择。<br><br>Unix 环境下：<br><br>db2 "insert into \"Test\$Name\" values (1),(2)"<br>DB20000I SQL 命令成功完成。<br><br>db2 "select * from \"Test\$Name\""<br><br>COL1<br>-----------<br>1<br>2<br>2 条记录已选择。<br><br><font face=宋体>当然除举例中所使用的&#8220;$&#8221;特殊字符外，还有一些其它的特殊字符，在今后使用中，应根据情况尝试加上转义符，以创建用户需要的表名。</font><br></p>
            </td>
        </tr>
    </tbody>
</table>
  <img src ="http://www.cppblog.com/prayer/aggbug/122320.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-08-05 16:16 <a href="http://www.cppblog.com/prayer/archive/2010/08/05/122320.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>db2Load API - Load data into a table</title><link>http://www.cppblog.com/prayer/archive/2010/07/23/121108.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Fri, 23 Jul 2010 04:26:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/07/23/121108.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/121108.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/07/23/121108.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/121108.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/121108.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=/com.ibm.db2.udb.admin.doc/doc/r0008704.htm&nbsp; DB2 Version 9 for Linux, UNIX, and Windowsdb2Load API - Load data into a ta...&nbsp;&nbsp;<a href='http://www.cppblog.com/prayer/archive/2010/07/23/121108.html'>阅读全文</a><img src ="http://www.cppblog.com/prayer/aggbug/121108.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-07-23 12:26 <a href="http://www.cppblog.com/prayer/archive/2010/07/23/121108.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游标中rollback引起游标关闭 </title><link>http://www.cppblog.com/prayer/archive/2010/06/10/117540.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Thu, 10 Jun 2010 02:39:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/06/10/117540.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/117540.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/06/10/117540.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/117540.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/117540.html</trackback:ping><description><![CDATA[序段：<br>declare test_cur cursor with hold for<br>&nbsp; &nbsp;&nbsp;&nbsp;select .... from A where ... order by ... with ur;<br><br>open test_cur;<br>while( 1 ){<br>&nbsp; &nbsp; fecth test_cur into ......;<br>&nbsp; &nbsp; 判断SQLCODE<br><br>&nbsp; &nbsp; begin_work();&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;/* 其实就是设置了一个标志 */<br>&nbsp; &nbsp; SQL 操作，修改其他表或者游标所在表的<span class=t_tag onclick=tagshow(event) href="tag.php?name=%CA%FD%BE%DD">数据</span>。<br>&nbsp; &nbsp;根据结果判断 commit or rollback。&nbsp; &nbsp; /* 此处如果rollback 游标被关闭 */<br>}<br><br>异常状态：<br>如果游标中进行了SQL操作，根据结果判断并rollback时，<br>下一次fetch时，会提示 501 没有打开游标。从而报错退出。<br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br>疑问：<br>使用前参考的文章：<a href="http://searchdatabase.techtarget.com.cn/tips/365/2297365.shtml" target=_blank><u><font color=#0000ff>http://searchdatabase.techtarget.com.cn/tips/365/2297365.shtml</font></u></a><br>之中有说到：　<br>10.DB2的游标打开后遇到commit和rollback默认是会关闭的。保持游标打开的方法是在定义游标时加上with hold选项<br>但是，我declare 游标时使用了with hold选项，为什么还会出现这个问题？<br><br><br><br>
<div class="postmessage ">
<h2>额卖糕的</h2>
<div class=t_msgfontfix>
<table cellSpacing=0 cellPadding=0>
    <tbody>
        <tr>
            <td class=t_msgfont id=postmessage_5691801>从vlife以前的回复中找到的答案：<br>无论是否使用with hold与否，rollback将释放session中的游标。commit只释放不带with hold的游标。 <br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br>救命啊。这些程序是从informix移植过来的。<br>难道让我将满足条件的记录全部读到一个结构数组里面，然后再从结构数组里面逐条取出处理么？<br>量很大的哈。。。。我死了。。。</td>
        </tr>
    </tbody>
</table>
</div>
</div>
<br><br>摘自《SQL Reference Volume 2》<br>declare Cursor WITH HOLD<br>&nbsp; &nbsp;Maintains resources across multiple units of work.<br><br>（1）For units of work ending with COMMIT:<br>&nbsp; &nbsp;－ Open cursors defined WITH HOLD remain open.<br>&nbsp; &nbsp;－ All locks are released, except locks protecting the current cursor position of open WITH HOLD cursors.<br>&nbsp; &nbsp;。。。<br><br>（2）For units of work ending with ROLLBACK:<br>&nbsp; &nbsp;－All open cursors are closed.<br>&nbsp; &nbsp;－All locks acquired during the unit of work<br><br>
<h2>这种方案是否可行</h2>
<div class=t_msgfontfix>
<table cellSpacing=0 cellPadding=0>
    <tbody>
        <tr>
            <td class=t_msgfont id=postmessage_5694669>游标改用普通游标。<br>游标取出当前记录后，fork子进程。<br>主进程只管从游标取数。<br>子进程进行事务、处理、判断、修改状态、提交等等。<br>主进程等子进程的结束信号，然后取下一条记录。<br>程序段：<br>declare test_cur cursor with hold for<br>&nbsp; &nbsp;&nbsp;&nbsp;select .... from A where ... order by ... with ur;<br><br>open test_cur;<br>while( 1 ){<br>&nbsp; &nbsp; fecth test_cur into ......;<br>&nbsp; &nbsp; 判断SQLCODE<br><br>&nbsp; &nbsp; pid = fork();<br><br>&nbsp; &nbsp; if( pid == 0 ) {&nbsp; &nbsp; /* 子进程干活 */<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;sqledtin( &amp;sqlca );<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;setsid();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;signal( SIGHUP, SIG_IGN );<br><br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;db_disconn( G_mdb_name );<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;begin_work();&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;/* 其实就是设置了一个标志 */<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;SQL 操作，修改其他表或者游标所在表的数据。<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;根据结果判断 commit or rollback。&nbsp; &nbsp; <br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;db_disconn();<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;exit();<br>&nbsp; &nbsp; }<br><br>&nbsp; &nbsp; /* 主进程等待子进程结束 */<br>}<br>close test_cur;</td>
        </tr>
    </tbody>
</table>
</div>
<br><br>如果是两个不同的事务的话，你用CLI来写比较方便<br><br>
<div class="postmessage ">
<h2>用savepoint</h2>
<div class=t_msgfontfix>
<table cellSpacing=0 cellPadding=0>
    <tbody>
        <tr>
            <td class=t_msgfont id=postmessage_5719307>在cursor内部设立一个savepoint, rollback时用<br>rollback to savepoint a;</td>
        </tr>
    </tbody>
</table>
</div>
</div>
<img src ="http://www.cppblog.com/prayer/aggbug/117540.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-06-10 10:39 <a href="http://www.cppblog.com/prayer/archive/2010/06/10/117540.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>IBM DB2 内存分配与使用策略</title><link>http://www.cppblog.com/prayer/archive/2010/05/19/115854.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Wed, 19 May 2010 15:23:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/05/19/115854.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/115854.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/05/19/115854.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/115854.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/115854.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 【彭建军】IBM DB2 内存分配与使用策略 （上）出处：根据&nbsp;ChinaUnix&nbsp;的相关文章整理。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;【导读】本文将向您讲解&nbsp;DB2&nbsp;内存使用的基础，以及共享内存和私有内...&nbsp;&nbsp;<a href='http://www.cppblog.com/prayer/archive/2010/05/19/115854.html'>阅读全文</a><img src ="http://www.cppblog.com/prayer/aggbug/115854.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-05-19 23:23 <a href="http://www.cppblog.com/prayer/archive/2010/05/19/115854.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sheapthres － 排序堆阈值 配置参数 </title><link>http://www.cppblog.com/prayer/archive/2010/05/19/115852.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Wed, 19 May 2010 15:21:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/05/19/115852.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/115852.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/05/19/115852.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/115852.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/115852.html</trackback:ping><description><![CDATA[<h3 id=r0000260>sheapthres － 排序堆阈值 <span>配置参数 </span></h3>
<div><a id=idx626 name=idx626></a><a id=idx627 name=idx627></a><a id=idx628 name=idx628></a><a id=idx629 name=idx629></a></div>
<dl>
<dt class=bold>配置类型
<dd>数据库管理器
<dt class=bold>适用于
<dd>
<ul>
    <li>具有本地和远程客户机的数据库服务器
    <li>具有本地客户机的数据库服务器
    <li>具有本地和远程客户机的分区数据库服务器 </li>
</ul>
<dt class=bold>参数类型
<dd>可配置
<dt class=bold>缺省值 [范围]
<dd>
<dl>
<dt class=bold>UNIX 32 位平台
<dd>20&nbsp;000 [ 250 -- 2&nbsp;097&nbsp;152 ]
<dt class=bold>Windows 平台
<dd>10&nbsp;000 [ 250 -- 2&nbsp;097&nbsp;152 ]
<dt class=bold>64 位平台
<dd>20&nbsp;000 [ 250 -- 2&nbsp;147&nbsp;483&nbsp;647 ] </dd></dl>
<dt class=bold>计量单位
<dd>页（4 KB） </dd></dl>
<p>专用排序和共享排序使用两个不同内存资源中的内存。<strong>共享排序内存区的大小是根据 <span class=italic>sheapthres </span>的值</strong>，<strong>在第一次与数据库连接时静态地预先确定的。</strong>专用排序内存区的大小不受限制。 </p>
<p><var class=pv>sheapthres</var> 参数对于专用和共享的排序用法是不同的： </p>
<ul>
    <li>对于专用排序，此参数是在一个实例内对任何给定时间专用排序可占用的总内存量的 <span class=italic>软 </span>限制。当一个实例的总专用排序内存占用达到了此限制时，为附加入站的专用排序请求分配的内存将显著减少。
    <li>对于共享排序，此参数是在一个数据库内对任何给定时间共享排序占用的总内存量的硬限制。当达到此限制时，将不允许其它共享排序内存请求（直到总共享排序内存的占用降低至 <var class=pv>sheapthres</var> 指定的限制以下为止）。（在某些情况下，配置共享排序最大值的另一种方法是使用 <var class=pv>sheapthres_shr</var> 数据库配置参数。） </li>
</ul>
<p>使用排序堆的操作的示例包括：排序、散列连接、动态位图（用于索引 AND 运算和星型连接）和表位于内存中的操作。 </p>
<p>显式定义阈值可防止数据库管理器对大量排序使用过量内存。 </p>
<p>当从非分区数据库移至分区数据库环境时，不应增大此参数的值。一旦在单个数据库分区环境中调整了数据库和数据库管理器配置参数，在大多数情况下，相同的值在分区数据库环境将同样合适。 </p>
<p>作为数据库管理器配置参数的&#8220;排序堆阈值&#8221;参数应用于整个 DB2 实例。将该参数设置为不同节点或分区上的不同值的唯一方法是创建多个 DB2 实例。这将需要通过不同数据库分区组管理不同的 DB2 数据库。这样安排将无法发挥分区数据库环境的许多优点。 </p>
<p><span class=bold>建议： </span><strong>理想情况下，应将此参数设置为您在数据库管理器实例中拥有的最大 <span class=italic>sortheap </span>参数的一个合理倍数。此参数 <span class=bold>至少 </span>应是该实例中为任何数据库定义的最大 <span class=italic>sortheap </span>的两倍。</strong> </p>
<p>如果您正执行专用排序并且您的系统不受内存约束，则可使用下列步骤来计算此参数的理想值： </p>
<ol type=1>
    <li>计算每个数据库的典型排序堆的使用：
    <pre class=xmp>（对该数据库运行的并发代理程序的典型数目）
    * （sortheap，为该数据库定义的） </pre>
    <li>对以上结果求和，该值提供可在实例中所有数据库的典型环境中使用的总排序堆。 </li>
</ol>
<p>应使用基准程序技术来调整此参数以找到在排序性能和内存使用之间的相应平衡。 </p>
<p>可以使用数据库系统监视器并借助后阈值排序（ <span class=italic>post_threshold_sorts </span>）监视元素来跟踪排序活动。<br><br><br></p>
<h3 id=r0000259>sortheap － 排序堆大小 <span>配置参数 </span></h3>
<div><a id=idx622 name=idx622></a><a id=idx623 name=idx623></a><a id=idx624 name=idx624></a><a id=idx625 name=idx625></a></div>
<dl>
<dt class=bold>配置类型
<dd>数据库
<dt class=bold>参数类型
<dd>可联机配置
<dt class=bold>传播类
<dd>语句边界
<dt class=bold>缺省值 [范围]
<dd>
<dl>
<dt class=bold>32 位平台
<dd>256 [ 16 - 524&nbsp;288 ] <span id=changed>2 </span><span id=changed>2 </span>
<dt class=bold>64 位平台 <span id=changed>2 </span>
<dd>256 [ 16 - 4&nbsp;194&nbsp;303 ] <span id=changed>2 </span></dd></dl>
<dt class=bold>计量单位
<dd>页（4 KB）
<dt class=bold>分配时
<dd>需要执行排序时
<dt class=bold>释放时
<dd>当排序完成时 </dd></dl>
<p>此参数定义要用于专用排序的专用内存页的最大数目或要用于共享排序的共享内存页的最大数目。如果排序为专用排序，则此参数将影响代理程序专用内存。如果排序为共享排序，则此参数将影响数据库共享内存。每个排序都有一个独立的排序堆，该排序堆是由数据库管理器按照需要分配的。此排序堆是将数据排序的区域。如果由优化器定向，则将使用优化器提供的信息分配一个比此参数指定的排序堆小的排序堆。 </p>
<p><span class=bold>建议： </span>当使用排序堆时，应该考虑下列事项： </p>
<ul>
    <li>适当的索引可使排序堆的使用减至最小程度。
    <li>散列连接缓冲区和动态位图（用于索引 AND 计算和星型连接）使用排序堆内存。在使用这些技术时，增大此参数的大小。
    <li>当需要进行频繁的大型排序时，增大此参数的大小。
    <li>当增大此参数的值时，应该检查是否还需要调整数据库管理器配置文件中的 <span class=italic>sheapthres </span>参数。
    <li>排序堆大小由优化器在确定存取路径时使用。在更改此参数后，应考虑重新绑定应用程序（使用 REBIND 命令）。 </li>
</ul>
<p><br>&nbsp;Which of the following settings would allow 20 sorts with a maximum of 10MB each to run currently on a 64-bit instance? <br>A. Set the DB SHEAPTHERS to 50000 and DB SORTHEAP to 2500 <br>B. Set the DBM <a name=baidusnap0></a><strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SHEAPTHERES</strong> to 50000 and DB SORTHEAP to 2500<br>&nbsp;C. Set the DBM SHEAPTHERS to 50000 and DBM SORTHEAP to 2500 <br>D. Set the DBM SHEAPTHERS_SHR to 50000 and DBM SHEAPTHRES to 2500 </p>
<img src ="http://www.cppblog.com/prayer/aggbug/115852.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-05-19 23:21 <a href="http://www.cppblog.com/prayer/archive/2010/05/19/115852.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用DB2配置向导配置参数</title><link>http://www.cppblog.com/prayer/archive/2010/05/19/115851.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Wed, 19 May 2010 15:02:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/05/19/115851.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/115851.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/05/19/115851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/115851.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/115851.html</trackback:ping><description><![CDATA[<p>　　DB2版本8提供了一个自动配置参数的工具-配置向导。你可以在控制中心中启动图形界面的配置向导，或者使用autoconfigure命令来配置你的数据库。配置向导可以配置数据库管理器、数据库配置参数和缓冲池大小。注意，你必须连接到数据库才能使用数据库配置向导，而且在分区数据库的情况下，数据库配置向导只配置你连接的一个分区。在分区数据库环境下，你可以使用db2_all 命令来配置所有数据库分区的参数。</p>
<p>　　如果你使用图形界面的配置向导，你需要回答一系列问题，这些问题相当于AUTOCONFIGURE命令中的参数(如表1所示)。首先让我们看一AUTOCONFIGURE的命令格式:</p>
<p>　　&gt;&gt;-AUTOCONFIGURE--+---------------------------------------+-----&gt;<br>　　| .----------------------------. |<br>　　| V | |<br>　　'-USING----input-keyword--param-value-+-'<br>　　&gt;--APPLY--+-DB ONLY----+---------------------------------------&gt;&lt;<br>　　+-DB AND DBM-+<br>　　'-NONE-------'</p>
<p>　　表 1显示了选项关键字和取值范围。</p>
<p>　　表 1 关键字和取值范围</p>
<p>　　关键字</p>
<p>　　<br>&nbsp;取值范围&nbsp; 默认值 解释 <br>mem_percent&nbsp; 1-100&nbsp; 80&nbsp; 设定DB2使用内存的多少。如果还有其他应用程序使用，请选择小于100的数值</p>
<p>　　<br>&nbsp;<br>workload_type&nbsp; simple, mixed,</p>
<p>　　<br>&nbsp;complex mixed&nbsp; 指定工作负荷类型，simple（简单）类型主要指IO访问比较集中，对于大多数OLTP系统，选择simple类型。Complex类型主要是对CPU占用较多的复杂查询系统，如OLAP系统。如果你的系统介于两者之间，选择mixed类型。 <br>num_stmts</p>
<p>　　<br>&nbsp;1-1 000 000&nbsp; 10&nbsp; 系统中每一个事务包含的SQL语句数 <br>tpm&nbsp; 1-200 000&nbsp; 60&nbsp; 每分钟进行的交易数。</p>
<p>　　<br>&nbsp;<br>admin_priority</p>
<p>　　<br>&nbsp;performance, recovery, both both&nbsp; 选择你的管理策略，可以是更好的性能，或者是更快的数据库恢复时间。 <br>is_populated</p>
<p>　　<br>&nbsp;yes, no&nbsp; yes&nbsp; 数据库已经存在数据 <br>num_local_apps</p>
<p>　　<br>&nbsp;0-5 000&nbsp; 0&nbsp; 本地连接数 <br>num_remote_apps&nbsp; 0-5 000&nbsp; 10</p>
<p>　　<br>&nbsp;远程连接数 <br>isolation&nbsp; RR, RS, CS, UR&nbsp; RR</p>
<p>　　<br>&nbsp;应用程序的隔离级别 <br>bp_resizeable</p>
<p>　　<br>&nbsp;yes, no yes&nbsp; 缓冲池是否可调整大小 </p>
<p><br>　　APPLY DB ONLY</p>
<p>　　在当前数据库管理器的配置参数下，显示推荐的数据库和缓冲池的参数，并应用与数据库和缓冲池。</p>
<p>　　APPLY DB AND DBM</p>
<p>　　显示并应用推荐的数据库管理器参数、数据库参数和缓冲池参数。</p>
<p>　　APPLY NONE</p>
<p>　　仅仅显示推荐值，但不更改配置参数。</p>
<p>　　使用该命令配置数据库，关键要选择合适的参数(参见表1选择你的参数选项)。下面我们通过一个例子来说明如何使用AUTOCONFIGURE命令配置数据库。假设我们在一个分区的数据库环境中，只有一个数据库实例db2inst1和数据仓库TESTDW，并且已经装载了数据。 我们使用下面的命令对该数据库调整参数:</p>
<p>　　db2_all &#8220;db2 connect to testdw; db2 autoconfigure using mem_percent 80 workload_type complex num_stmts 10 tpm 20 admin_priority both num_local_apps 5 num_remote_apps 50 isolation cs apply db and dbm; db2 connect reset;&#8221;</p>
<p>　　你也可以创建一个脚本autoconfigure.db2，存放在DB2 实例的共享目录下，假设为/home/db2inst1, 内容如下:</p>
<p>　　connect to testdw;</p>
<p>　　autoconfigure using mem_percent 80 workload_type complex num_stmts 10 tpm 20 admin_priority both num_local_apps 5 num_remote_apps 50 isolation cs apply db and dbm;</p>
<p>　　connect reset;</p>
<p>　　然后使用db2_all命令在所有的数据库分区上执行这条命令，我们假设改脚本的存放目录为/home/db2inst1/autoconfigure.db2:</p>
<p>　　db2_all &#8220;&#8221;db2 -tvf /home/db2inst1/autoconfigure.db2 &gt;&gt;autoconfigure##.log&#8221;</p>
<p>　　执行完毕后，你可以通过autoconfigure*.log来察看该命令在每一个数据库分区上的执行情况。然后重新启动DB2实例，让这些参数生效。运行一些基准测试的查询语句，测试DB2 配置向导的配置结果。</p>
<p>　　你也可以使用配置向导图形界面来配置你的数据库。你可以通过在控制中心中选中你的数据库，然后点右键，选择&#8220;配置向导&#8221;来启动配置向导。如果你需要使用图形界面配置分区数据库，记得要将结果保存为任务，并将配置结果导出到一个脚本文件中，如/home/db2inst1/autoconfigure.db2。这样你就可以使用db2_all命令来执行该脚本配置所有的数据库分区了:</p>
<p>　　db2_all &#8220;&#8221;db2 -tvf /home/db2inst1/autoconfigure.db2 &gt;&gt;autoconfigure##.log&#8221;</p>
<p>　　如果你对DB2非常熟悉，你可以对DB2自动配置产生的配置文件做适当的修改。总之，DB2配置向导是一个非常简单易用的工具，能够大大减少DBA的工作量。</p>
<p><br>原文来自：雨枫技术教程网 <a href="http://www.fengfly.com/">http://www.fengfly.com</a><br>原文网址：<a href="http://www.fengfly.com/plus/view-30426-1.html">http://www.fengfly.com/plus/view-30426-1.html</a></p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/prayer/aggbug/115851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-05-19 23:02 <a href="http://www.cppblog.com/prayer/archive/2010/05/19/115851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>db2batch工具的使用</title><link>http://www.cppblog.com/prayer/archive/2010/05/19/115850.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Wed, 19 May 2010 14:56:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/05/19/115850.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/115850.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/05/19/115850.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/115850.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/115850.html</trackback:ping><description><![CDATA[<p>　　基准测试是从各种不同方面(例如数据库响应时间、cpu 和<a class=fllink href="http://product.yesky.com/memory/" target=_bank><u><font color=#0000ff>内存</font></u></a>使用情况)对应用程序进行评测的一个过程。基准测试基于一个可重复的环境，以便能够在相同的条件下运行相同的测试。之后，对测试收集到的结果可以进行评估和比较。</p>
<p>　　db2batch 是一种基准测试工具，它以一组 SQL 和/或 XQuery 语句作为输入，动态地准备语句和描述语句，并返回一个结果集。取决于 db2batch 命令中所使用的选项，结果集可以返回这些语句的执行时间、关于内存使用情况(例如缓冲池)的数据库管理器快照和缓存信息。</p>
<p>　　可以在一个 flat 文件或标准输入中指定要运行基准测试的语句。在输入文件中可以设置很多控制选项。指定这些选项的语法是：--#SET control_option value 。下面是包含控制选项的一个输入文件的例子。要获得控制选项的完整列表，请参考 Information Center。</p>
<p>
<table style="BORDER-TOP-STYLE: dotted; BORDER-RIGHT-STYLE: dotted; BORDER-LEFT-STYLE: dotted; BORDER-BOTTOM-STYLE: dotted" borderColor=#e6941a cellSpacing=0 cellPadding=0 width="90%" align=center bgColor=#ffffff border=1 heihgt="">
    <tbody>
        <tr>
            <td>
            <pre class=section>-- db2batch.sql
            -- ------------
            --#SET PERF_DETAIL 3
            --#SET ROWS_OUT 5
            -- This query lists employees, the name of their department
            -- and the number of activities to which they are assigned for
            -- employees who are assigned to more than one activity less than
            -- full-time.
            --#COMMENT Query 1
            select lastname, firstnme,
            deptname, count(*) as num_act
            from employee, department, emp_act
            where employee.workdept = department.deptno and
            employee.empno = emp_act.empno and
            emp_act.emptime &lt; 1
            group by lastname, firstnme, deptname
            having count(*) &gt; 2;
            --#SET PERF_DETAIL 1
            --#SET ROWS_OUT 5
            --#COMMENT Query 2
            select lastname, firstnme,
            deptname, count(*) as num_act
            from employee, department, emp_act
            where employee.workdept = department.deptno and
            employee.empno = emp_act.empno and
            emp_act.emptime &lt; 1
            group by lastname, firstnme, deptname
            having count(*) &lt;= 2;&nbsp;</pre>
            </td>
        </tr>
    </tbody>
</table>
</p>
<ul>
    <li>　　选项 PERF_DETAIL 3 意味着将返回关于花费的时间和数据库管理器、数据库及应用程序的快照这些性能方面的细节。
    <li>　　选项 ROWS_OUT 5 意味着无论查询返回的实际行数是多少，只从结果集中取 5 行。
    <li>　　COMMENT Query1 将语句命名为 Query1。</li>
</ul>
<p>　　下面的命令在 SAMPLE 数据库上调用基准测试工具，输入文件为 db2batch.sql。</p>
<p>　　db2batch -d sample -f db2batch.sql</p>
<p>　　这个命令将返回查询的结果集(限 5 行)和查询所花费的时间及 CPU 时间。另外还返回数据库管理器、数据库和应用程序快照。由于输出很大，因此这里只显示 db2batch 命令的概要。</p>
<p>
<table style="BORDER-TOP-STYLE: dotted; BORDER-RIGHT-STYLE: dotted; BORDER-LEFT-STYLE: dotted; BORDER-BOTTOM-STYLE: dotted" borderColor=#e6941a cellSpacing=0 cellPadding=0 width="90%" align=center bgColor=#ffffff border=1 heihgt="">
    <tbody>
        <tr>
            <td>* Summary Table:<br><br>Type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Number&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Repetitions Total Time (s) Min Time (s)&nbsp;&nbsp; ...<br>--------- ----------- ----------- -------------- -------------- <br>Statement&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.052655&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.052655 ...<br>Statement&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.004518&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.004518 ...<br><br><br>...Max Time (s)&nbsp;&nbsp; Arithmetic Mean Geometric Mean Row(s) Fetched Row(s) Output <br>&nbsp;&nbsp; -------------- --------------- -------------- -------------- ------------- <br>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.052655&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.052655&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.052655&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 <br>...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.004518&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.004518&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.004518&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5 <br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>* Total Entries:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>* Total Time:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.057173 seconds<br>* Minimum Time:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.004518 seconds<br>* Maximum Time:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.052655 seconds<br>* Arithmetic Mean Time:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.028587 seconds<br>* Geometric Mean Time:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.015424 seconds&nbsp;</td>
        </tr>
    </tbody>
</table>
</p>
<p>　　db2batch 命令支持很多选项。这里只列出其中一些选项，让您对这个工具的威力有所了解。</p>
<ul>
    <li>　　-m parameter_file 用参数值指定用于绑定到 SQL 语句参数占位符的一个输入文件。
    <li>　　-r result_file 指定存放命令结果的输出文件。
    <li>　　-i short|long|complete 指定从哪个方面测量所花费的时间。short 测量运行每条语句所花费的时间。long 测量运行每条语句所花费的时间，包括语句之间的开销。complete 测量运行每条语句所花费的时间，分别报告准备、执行和取数据的时间。
    <li>　　-iso 指定语句使用的隔离级别。默认情况下，db2batch 使用 Repeatable Read 隔离级别。</li>
</ul>
<img src ="http://www.cppblog.com/prayer/aggbug/115850.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-05-19 22:56 <a href="http://www.cppblog.com/prayer/archive/2010/05/19/115850.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>信息约束</title><link>http://www.cppblog.com/prayer/archive/2010/05/18/115739.html</link><dc:creator>Prayer</dc:creator><author>Prayer</author><pubDate>Tue, 18 May 2010 15:16:00 GMT</pubDate><guid>http://www.cppblog.com/prayer/archive/2010/05/18/115739.html</guid><wfw:comment>http://www.cppblog.com/prayer/comments/115739.html</wfw:comment><comments>http://www.cppblog.com/prayer/archive/2010/05/18/115739.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/prayer/comments/commentRss/115739.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/prayer/services/trackbacks/115739.html</trackback:ping><description><![CDATA[<p>如果一个应用程序在将记录插入到 DB2 中之前已验证了信息，那么使用信息约束 要比普通约束更有效。<strong>信息约束告诉 DB2 数据应采取的格式，而不是在插入或更新处理过程中强制实施。但这一信息可被 DB2 优化器利用，并提高 SQL 查询的性能。</strong>考虑以下 CREATE TABLE 语句：</p>
<p><code>CREATE TABLE EMPDATA <br>( <br>EMPNO INT NOT NULL, <br>SEX CHAR(1) NOT NULL <br>CONSTRAINT SEXOK <br>CHECK (SEX IN ('M','F')) <br>NOT ENFORCED <br>ENABLE QUERY OPTIMIZATION, <br>SALARY INT NOT NULL, <br>CONSTRAINT SALARYOK <br>CHECK (SALARY BETWEEN 0 AND 100000) <br>NOT ENFORCED <br>ENABLE QUERY OPTIMIZATION <br>) </code></p>
<p>本例包含两个更改列约束行为的语句。第一个选项是 NOT ENFORCED，它建议 DB2 在插入或更新数据时不强制检查本列。第二个选项是 ENABLE QUERY OPTIMIZATION，DB2 在对该表运行 SELECT 语句时使用它。指定该值时，DB2 将在优化 SQL 时使用约束中的信息。</p>
<p>NOT ENFORCED 选项</p>
<p>若表包含 NOT ENFORCED 选项，INSERT 语句的行为可能会变得很古怪。对 EMPDATA 表运行以下 SQL 语句时，不会产生任何错误：</p>
<p><code>INSERT INTO EMPDATA VALUES <br>(1, 'M', 54200), <br>(2, 'F', 28000), <br>(3, 'M', 21240), <br>(4, 'F', 89222), <br>(5, 'Q', 34444), <br>(6, 'K',132333) </code></p>
<p>编号是 5 的员工的性别显然有问题（Q），编号 6 的员工不但性别有问题，同时工资也超出了 SALARY 列的限制。在这两种情况下，DB2 依然允许插入，因为约束是 NOT ENFORCED。这指出了信息约束的一个薄弱之处。您必须确定所插入或载入的数据符合在 DB2 中放置的定义。</p>
<p>ENABLE QUERY OPTIMIZATION 选项</p>
<p>在上一屏运行的插入之后，如果再对 EMPDATA 表执行 SELECT 语句，其结果很可能会令您更加迷惑：</p>
<p><code>SELECT * FROM EMPDATA <br>WHERE SEX = 'Q'; <br><br>EMPNO SEX SALARY <br>----------- --- ----------- <br><br>0 record(s) selected. </code></p>
<p>DB2 向查询返回了错误的答案。表中发现了 &#8220;Q&#8221; 值，但该列上的约束告诉 DB2 有效值仅包括 &#8220;M&#8221; 和 &#8220;F&#8221;。ENABLE QUERY OPTIMIZATION 关键字还允许 DB2 在优化 SQL 语句时使用这一约束信息。若这并非您所希望的行为，那么您就需要使用 ALTER 命令来更改约束：</p>
<p><code>ALTER TABLE EMPDATA <br>ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION </code></p>
<p>现在，再重新执行之前的查询。结果如下所示：</p>
<p><code>SELECT * FROM EMPDATA <br>WHERE SEX = 'Q'; <br><br>EMPNO SEX SALARY <br>----------- --- ----------- <br>5 Q 34444 <br><br>1 record(s) selected. </code></p>
<img src ="http://www.cppblog.com/prayer/aggbug/115739.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/prayer/" target="_blank">Prayer</a> 2010-05-18 23:16 <a href="http://www.cppblog.com/prayer/archive/2010/05/18/115739.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>