﻿<?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>BlogJava-CONAN ZONE-文章分类-Database</title><link>http://www.blogjava.net/conans/category/32946.html</link><description>你越挣扎我就越兴奋</description><language>zh-cn</language><lastBuildDate>Tue, 23 Nov 2010 21:10:17 GMT</lastBuildDate><pubDate>Tue, 23 Nov 2010 21:10:17 GMT</pubDate><ttl>60</ttl><item><title>MySQL HandlerSocket in Action</title><link>http://www.blogjava.net/conans/articles/338499.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Fri, 19 Nov 2010 10:02:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/338499.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转自：http://whitesock.javaeye.com/blog/8113391 Overview&nbsp;&nbsp;&nbsp; 最近一篇关于MySQL HandlerSocket的blog吸引了不少人的注意，甚至MySQL PerformanceBlog上也有关于HandlerSocket的性能评测。该blog中声称对于一个CPU bound而非IO bound的M...&nbsp;&nbsp;<a href='http://www.blogjava.net/conans/articles/338499.html'>阅读全文</a><img src ="http://www.blogjava.net/conans/aggbug/338499.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2010-11-19 18:02 <a href="http://www.blogjava.net/conans/articles/338499.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解决Oracle EM 乱码问题</title><link>http://www.blogjava.net/conans/articles/287776.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Tue, 21 Jul 2009 13:36:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/287776.html</guid><description><![CDATA[<span style="font-size: small;"><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US">Oracle 10g</span><span style="color: black; line-height: 138%; font-family: 宋体;">提供了一个基于</span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US">Web</span><span style="color: black; line-height: 138%; font-family: 宋体;">的管理工具</span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US">EM</span><span style="color: black; line-height: 138%; font-family: 宋体;">（</span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US">Enterprise Manager</span><span style="color: black; line-height: 138%; font-family: 宋体;">），使用比较方便。不过，如果您使用的是中文</span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US">Linux</span><span style="color: black; line-height: 138%; font-family: 宋体;">环境，而在安装</span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US">Oracle</span><span style="color: black; line-height: 138%; font-family: 宋体;">的时候，没有加上简体中文语言的话，那登陆时，可能会发现中文按钮都是类似</span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US">"□□"</span><span style="color: black; line-height: 138%; font-family: 宋体;">字样的乱码。下面就是解决这问题的方法。</span></span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><br />
<span style="font-size: small;">&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-size: small;"><span style="color: black; line-height: 138%; font-family: 宋体;">该方法适合红旗</span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US">Asianux 2.0</span><span style="color: black; line-height: 138%; font-family: 宋体;">、</span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US">3.0</span><span style="color: black; line-height: 138%; font-family: 宋体;">等操作系统环境。</span></span><a style="width: 20px; height: 20px; text-indent: 20px; background-repeat: no-repeat; background-image: url(/CuteSoft_Client/CuteEditor/Load.ashx?type=image&amp;file=anchor.gif);" name="entrymore"></a><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><br />
<br />
</span><strong><span style="color: royalblue; font-family: 宋体;"><span style="font-size: small;">一、故障问题</span></span></strong><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><br />
</span><span style="font-size: small;"><span style="color: black; line-height: 138%; font-family: 宋体;">打开</span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><span><a linkindex="55" href="http://ip:1158/em" class="smarterwiki-linkify">http://ip:1158/em</a></span></span><span style="color: black; line-height: 138%; font-family: 宋体;">时，看到如下的显示，其中中文字符部分是乱码：</span></span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><br />
<img src="http://p.blog.csdn.net/images/p_blog_csdn_net/yangsong158/EntryImages/20090602/1.png" alt="" height="627" width="1024" /><br />
<br />
</span><strong><span style="color: royalblue; font-family: 宋体;"><span style="font-size: small;">二、解决问题</span></span></strong><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><br />
</span><span style="font-size: small;"><strong><span style="color: black; font-family: Tahoma;" lang="EN-US">1</span></strong><strong><span style="color: black; font-family: 宋体;">、改变</span></strong><strong><span style="color: black; font-family: Tahoma;" lang="EN-US">$ORACLE_HOME/jdk</span></strong><strong><span style="color: black; font-family: 宋体;">目录下的</span></strong><strong><span style="color: black; font-family: Tahoma;" lang="EN-US">jre</span></strong><strong><span style="color: black; font-family: 宋体;">的默认字体</span></strong></span>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; background: #fbfeff none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; line-height: 138%; text-align: left;" align="left"><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><span style="font-size: small;"># su - oracle<br />
$ cd $ORACLE_HOME/jdk/jre/lib/<br />
$ ls font*zh_CN*</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 12pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; line-height: 138%; text-align: left;" align="left"><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><br />
</span><span style="font-size: small;"><span style="color: black; line-height: 138%; font-family: 宋体;">其中，</span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US">font.properties</span><span style="color: black; line-height: 138%; font-family: 宋体;">是默认使用的字体。还可以看到</span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US">font.properties.zh_CN.Redhat</span><span style="color: black; line-height: 138%; font-family: 宋体;">和其它的字体。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; background: #fbfeff none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; line-height: 138%; text-align: left;" align="left"><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><span style="font-size: small;">$ cp font.properties font.properties.bak<br />
$ cp font.properties.zh_CN.Redhat font.properties</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 12pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; line-height: 138%; text-align: left;" align="left"><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><br />
</span><span style="font-size: small;"><strong><span style="color: black; font-family: Tahoma;" lang="EN-US">2</span></strong><strong><span style="color: black; font-family: 宋体;">、改变</span></strong><strong><span style="color: black; font-family: Tahoma;" lang="EN-US">$ORACLE_HOME/jre</span></strong><strong><span style="color: black; font-family: 宋体;">下的默认字体</span></strong></span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><br />
</span><span style="font-size: small;"><span style="color: black; line-height: 138%; font-family: 宋体;">使用上面同样的方法来操作。</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; background: #fbfeff none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; line-height: 138%; text-align: left;" align="left"><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><span style="font-size: small;">$ cd $ORACLE_HOME/jre/1.4.2/lib/<br />
$ ls font*zh_CN*<br />
$ cp font.properties font.properties.bak<br />
$ cp font.properties.zh_CN.Redhat font.properties</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 12pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; line-height: 138%; text-align: left;" align="left"><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><br />
</span><span style="font-size: small;"><strong><span style="color: black; font-family: Tahoma;" lang="EN-US">3</span></strong><strong><span style="color: black; font-family: 宋体;">、删除</span></strong><strong><span style="color: black; font-family: Tahoma;" lang="EN-US">Cache</span></strong><strong><span style="color: black; font-family: 宋体;">下的</span></strong><strong><span style="color: black; font-family: Tahoma;" lang="EN-US">gif</span></strong><strong><span style="color: black; font-family: 宋体;">文件</span></strong></span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><br />
<span style="font-size: small;">em</span></span><span style="font-size: small;"><span style="color: black; line-height: 138%; font-family: 宋体;">里面会用到这些图片：</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; background: #fbfeff none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; line-height: 138%; text-align: left;" align="left"><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><span style="font-size: small;">$ cd $ORACLE_HOME/oc4j/j2ee/oc4j_applications/\<br />
applications/em/em/cabo/images/cache/zhs/<br />
$ ls *.gif<br />
$ rm *.gif</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 12pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; line-height: 138%; text-align: left;" align="left"><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><br />
</span><span style="font-size: small;"><strong><span style="color: red; font-family: 宋体;">※</span></strong><strong><span style="color: red; font-family: Tahoma;"> </span></strong><strong><span style="color: red; font-family: 宋体;">注意不要搞错目录，修改的是中文环境的。</span></strong></span><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><br />
<br />
</span><span style="font-size: small;"><strong><span style="color: black; font-family: Tahoma;" lang="EN-US">4</span></strong><strong><span style="color: black; font-family: 宋体;">、重新启动</span></strong><strong><span style="color: black; font-family: Tahoma;" lang="EN-US">EM</span></strong><strong><span style="color: black; font-family: 宋体;">服务</span></strong></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt; background: #fbfeff none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; line-height: 138%; text-align: left;" align="left"><span style="color: black; line-height: 138%; font-family: Tahoma;" lang="EN-US"><span style="font-size: small;">$ emctl stop dbconsole<br />
$ emctl start dbconsole</span></span></p>
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="color: black; font-family: Tahoma;" lang="EN-US"><br />
</span><span style="font-size: small;"><span style="color: black; font-family: 宋体;">进入</span><span style="color: black; font-family: Tahoma;" lang="EN-US">EM</span><span style="color: black; font-family: 宋体;">看看中文问题是否已经解决。</span></span><span style="color: black; font-family: Tahoma;" lang="EN-US"><br />
<br />
</span><span style="color: black; font-family: 宋体;"><span style="font-size: small;">新打开的界面如下：</span></span><span style="color: black; font-family: Tahoma;" lang="EN-US"><br />
<img src="http://p.blog.csdn.net/images/p_blog_csdn_net/yangsong158/EntryImages/20090602/2.png" alt="" height="627" width="1024" /></span></p>
<img src ="http://www.blogjava.net/conans/aggbug/287776.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2009-07-21 21:36 <a href="http://www.blogjava.net/conans/articles/287776.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下Oracle 10G DBCA等汉字乱码解决方法</title><link>http://www.blogjava.net/conans/articles/287532.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Mon, 20 Jul 2009 13:55:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/287532.html</guid><description><![CDATA[<p><font id="zoom" class="zw_txt">Linux下Oracle 10G DBCA等汉字乱码的解决方法其实很简单：</font></p>
<p><font id="zoom" class="zw_txt">1、在Linux下安装新的JDK（JRE），我装的是1.6；</font></p>
<p><font id="zoom" class="zw_txt">2、修改DBCA所对应的JRE路径（默认下/u01/app/oralce/product/10.2.0/db_1/bin/dbca）</font></p>
<font id="zoom" class="zw_txt">3、完成（em修改同理）。</font>
<img src ="http://www.blogjava.net/conans/aggbug/287532.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2009-07-20 21:55 <a href="http://www.blogjava.net/conans/articles/287532.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>提高MySQL 数据库性能的思路 </title><link>http://www.blogjava.net/conans/articles/214464.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Sat, 12 Jul 2008 11:16:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/214464.html</guid><description><![CDATA[本文从八个方面列出了具体的解决方法，如有不当之处望予指正，如有更好的思路，欢迎补充！<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、选取最适用的字段属性 <br />
<br />
　　MySQL可以很好的支持大数据量的存取，但是一般说来，数据库中的表越小，在它上面执行的查询也就会越快。因此，在创建表的时候，为了获得更好的性能，我们可以将表中字段的宽度设得尽可能小。例如，在定义邮政编码这个字段时，如果将其设置为CHAR(255),显然给数据库增加了不必要的空间，甚至使用VARCHAR这种类型也是多余的，因为CHAR(6)就可以很好的完成任务了。同样的，如果可以的话，我们应该使用MEDIUMINT而不是BIGIN来定义整型字段。 <br />
<br />
　　另外一个提高效率的方法是在可能的情况下，应该尽量把字段设置为NOT NULL，这样在将来执行查询的时候，数据库不用去比较NULL值。 <br />
<br />
　　对于某些文本字段，例如&#8220;省份&#8221;或者&#8220;性别&#8221;，我们可以将它们定义为ENUM类型。因为在MySQL中，ENUM类型被当作数值型数据来处理，而数值型数据被处理起来的速度要比文本类型快得多。这样，我们又可以提高数据库的性能。 <br />
<br />
　　<strong>2、使用连接（JOIN）来代替子查询(Sub-Queries)</strong> <br />
<br />
　　MySQL从4.1开始支持SQL的子查询。这个技术可以使用SELECT语句来创建一个单列的查询结果，然后把这个结果作为过滤条件用在另一个查询中。例如，我们要将客户基本信息表中没有任何订单的客户删除掉，就可以利用子查询先从销售信息表中将所有发出订单的客户ID取出来，然后将结果传递给主查询，如下所示： <br />
<br />
DELETE FROM customerinfo <br />
WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo ) <br />
<br />
　　使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的SQL操作，同时也可以避免事务或者表锁死，并且写起来也很容易。但是，有些情况下，子查询可以被更有效率的连接（JOIN）.. 替代。例如，假设我们要将所有没有订单记录的用户取出来，可以用下面这个查询完成： <br />
<br />
SELECT * FROM customerinfo <br />
WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo ) <br />
<br />
　　如果使用连接（JOIN）.. 来完成这个查询工作，速度将会快很多。尤其是当salesinfo表中对CustomerID建有索引的话，性能将会更好，查询如下： <br />
<br />
SELECT * FROM customerinfo <br />
LEFT JOIN salesinfoON customerinfo.CustomerID=salesinfo. <br />
CustomerID <br />
WHERE salesinfo.CustomerID IS NULL <br />
<br />
　连接（JOIN）.. 之所以更有效率一些，是因为 MySQL不需要在内存中创建临时表来完成这个逻辑上的需要两个步骤的查询工作。 <br />
<br />
　　<strong>3、使用联合(UNION)来代替手动创建的临时表</strong> <br />
<br />
　　MySQL 从 4.0 的版本开始支持 UNION 查询，它可以把需要使用临时表的两条或更多的 SELECT 查询合并的一个查询中。在客户端的查询会话结束的时候，临时表会被自动删除，从而保证数据库整齐、高效。使用 UNION 来创建查询的时候，我们只需要用 UNION作为关键字把多个 SELECT 语句连接起来就可以了，要注意的是所有 SELECT 语句中的字段数目要想同。下面的例子就演示了一个使用 UNION的查询。 <br />
<br />
SELECT Name, Phone FROM client <br />
UNION <br />
SELECT Name, BirthDate FROM author <br />
UNION <br />
SELECT Name, Supplier FROM product <br />
<br />
　　<strong>4、事务</strong> <br />
<br />
　　尽管我们可以使用子查询（Sub-Queries）、连接（JOIN）和联合（UNION）来创建各种各样的查询，但不是所有的数据库操作都可以只用一条或少数几条SQL语句就可以完成的。更多的时候是需要用到一系列的语句来完成某种工作。但是在这种情况下，当这个语句块中的某一条语句运行出错的时候，整个语句块的操作就会变得不确定起来。设想一下，要把某个数据同时插入两个相关联的表中，可能会出现这样的情况：第一个表中成功更新后，数据库突然出现意外状况，造成第二个表中的操作没有完成，这样，就会造成数据的不完整，甚至会破坏数据库中的数据。要避免这种情况，就应该使用事务，它的作用是：要么语句块中每条语句都操作成功，要么都失败。换句话说，就是可以保持数据库中数据的一致性和完整性。事物以BEGIN 关键字开始，COMMIT关键字结束。在这之间的一条SQL操作失败，那么，ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态。 <br />
<br />
BEGIN; <br />
INSERT INTO salesinfo SET CustomerID=14; <br />
UPDATE inventory SET Quantity=11 <br />
WHERE item='book'; <br />
COMMIT; <br />
<br />
　　事务的另一个重要作用是当多个用户同时使用相同的数据源时，它可以利用锁定数据库的方法来为用户提供一种安全的访问方式，这样可以保证用户的操作不被其它的用户所干扰。 <br />
<br />
　　<strong>5、锁定表</strong> <br />
<br />
　　尽管事务是维护数据库完整性的一个非常好的方法，但却因为它的独占性，有时会影响数据库的性能，尤其是在很大的应用系统中。由于在事务执行的过程中，数据库将会被锁定，因此其它的用户请求只能暂时等待直到该事务结束。如果一个数据库系统只有少数几个用户 <br />
来使用，事务造成的影响不会成为一个太大的问题；但假设有成千上万的用户同时访问一个数据库系统，例如访问一个电子商务网站，就会产生比较严重的响应延迟。 <br />
<br />
　　其实，有些情况下我们可以通过锁定表的方法来获得更好的性能。下面的例子就用锁定表的方法来完成前面一个例子中事务的功能。 <br />
<br />
LOCK TABLE inventory WRITE <br />
SELECT Quantity FROM inventory <br />
WHEREItem='book'; <br />
... <br />
UPDATE inventory SET Quantity=11 <br />
WHEREItem='book'; <br />
UNLOCK TABLES <br />
<br />
　　这里，我们用一个 SELECT 语句取出初始数据，通过一些计算，用 UPDATE 语句将新值更新到表中。包含有 WRITE 关键字的 LOCK TABLE 语句可以保证在 UNLOCK TABLES 命令被执行之前，不会有其它的访问来对 inventory 进行插入、更新或者删除的操作。 <br />
<br />
　　<strong>6、使用外键</strong> <br />
<br />
　　锁定表的方法可以维护数据的完整性，但是它却不能保证数据的关联性。这个时候我们就可以使用外键。例如，外键可以保证每一条销售记录都指向某一个存在的客户。在这里，外键可以把customerinfo 表中的CustomerID映射到salesinfo表中CustomerID，任何一条没有合法CustomerID的记录都不会被更新或插入到salesinfo中。 <br />
<br />
CREATE TABLE customerinfo <br />
( <br />
CustomerID INT NOT NULL , <br />
PRIMARY KEY ( CustomerID ) <br />
) TYPE = INNODB; <br />
<br />
CREATE TABLE salesinfo <br />
( <br />
SalesID INT NOT NULL, <br />
CustomerID INT NOT NULL, <br />
PRIMARY KEY(CustomerID, SalesID), <br />
FOREIGN KEY (CustomerID) REFERENCES customerinfo <br />
(CustomerID) ON DELETECASCADE <br />
) TYPE = INNODB; <br />
<br />
　　注意例子中的参数&#8220;ON DELETE CASCADE&#8221;。该参数保证当 customerinfo 表中的一条客户记录被删除的时候，salesinfo 表中所有与该客户相关的记录也会被自动删除。如果要在 MySQL 中使用外键，一定要记住在创建表的时候将表的类型定义为事务安全表 InnoDB类型。该类型不是 MySQL 表的默认类型。定义的方法是在 CREATE TABLE 语句中加上 TYPE=INNODB。如例中所示。 <br />
<br />
　　<strong>7、使用索引</strong> <br />
<br />
　　索引是提高数据库性能的常用方法，它可以令数据库服务器以比没有索引快得多的速度检索特定的行，尤其是在查询语句当中包含有MAX(), MIN()和ORDERBY这些命令的时候，性能提高更为明显。那该对哪些字段建立索引呢？一般说来，索引应建立在那些将用于JOIN, WHERE判断和ORDER BY排序的字段上。尽量不要对数据库中某个含有大量重复的值的字段建立索引。对于一个ENUM类型的字段来说，出现大量重复值是很有可能的情况，例如customerinfo中的&#8220;province&#8221;.. 字段，在这样的字段上建立索引将不会有什么帮助；相反，还有可能降低数据库的性能。我们在创建表的时候可以同时创建合适的索引，也可以使用ALTER TABLE或CREATE INDEX在以后创建索引。此外，MySQL <br />
从版本3.23.23开始支持全文索引和搜索。全文索引在MySQL 中是一个FULLTEXT类型索引，但仅能用于MyISAM 类型的表。对于一个大的数据库，将数据装载到一个没有FULLTEXT索引的表中，然后再使用ALTER TABLE或CREATE INDEX创建索引，将是非常快的。但如果将数据装载到一个已经有FULLTEXT索引的表中，执行过程将会非常慢。 <br />
<br />
　　<strong>8、优化的查询语句</strong> <br />
<br />
　　绝大多数情况下，使用索引可以提高查询的速度，但如果SQL语句使用不恰当的话，索引将无法发挥它应有的作用。下面是应该注意的几个方面。首先，最好是在相同类型的字段间进行比较的操作。在MySQL 3.23版之前，这甚至是一个必须的条件。例如不能将一个建有索引的INT字段和BIGINT字段进行比较；但是作为特殊的情况，在CHAR类型的字段和VARCHAR类型字段的字段大小相同的时候，可以将它们进行比较。其次，在建有索引的字段上尽量不要使用函数进行操作。 <br />
<br />
　　例如，在一个DATE类型的字段上使用YEAE()函数时，将会使索引不能发挥应有的作用。所以，下面的两个查询虽然返回的结果一样，但后者要比前者快得多。 <br />
<br />
SELECT * FROM order WHERE YEAR(OrderDate)&lt;2001; <br />
<br />
SELECT * FROM order WHERE OrderDate&lt;"2001-01-01"; <br />
<br />
同样的情形也会发生在对数值型字段进行计算的时候： <br />
<br />
SELECT * FROM inventory WHERE Amount/7&lt;24; <br />
<br />
SELECT * FROM inventory WHERE Amount&lt;24*7; <br />
<br />
　　上面的两个查询也是返回相同的结果，但后面的查询将比前面的一个快很多。第三，在搜索字符型字段时，我们有时会使用 LIKE 关键字和通配符，这种做法虽然简单，但却也是以牺牲系统性能为代价的。例如下面的查询将会比较表中的每一条记录。 <br />
<br />
SELECT * FROM books <br />
WHERE name like "MySQL%" <br />
<br />
　　但是如果换用下面的查询，返回的结果一样，但速度就要快上很多： <br />
<br />
SELECT * FROM books <br />
WHERE name&gt;="MySQL"and name&lt;"MySQM" <br />
<br />
　　最后，应该注意避免在查询中让MySQL进行自动类型转换，因为转换过程也会使索引变得不起作用。 
<img src ="http://www.blogjava.net/conans/aggbug/214464.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-07-12 19:16 <a href="http://www.blogjava.net/conans/articles/214464.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle10g SCN机制</title><link>http://www.blogjava.net/conans/articles/214086.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Thu, 10 Jul 2008 11:26:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/214086.html</guid><description><![CDATA[<table cellspacing="0" cellpadding="0" width="100%" border="0">
    <tbody>
        <tr>
            <td class="blogcontents2">
            <table width="100%">
                <tbody>
                    <tr>
                        <td align="center">
                        <div class="authorIntro2 padlr5">
                        <table cellspacing="0" cellpadding="0" width="100%" border="0">
                            <tbody>
                                <tr>
                                    <td valign="top" align="left">中科院信息工程硕士学位，分别在深圳华为、北京兆维2年和4年的工作经验，主要负责IT开发和企业解决方案，包括项目管理、设计、实施在IT基础架构及SOA解决方案领域；在仓储物流、零售业RFID应用、旅游及电子商务领域有实际工作经验。 </td>
                                </tr>
                            </tbody>
                        </table>
                        </div>
                        <br />
                        <br />
                        <!--bloger基本信息--></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
        <tr>
            <td class="blogcontents">
            <div id="div_content">
            <p><span lang="EN-US" style="color: blue">SCN<span>（System Chang Number）作为oracle中的一个重要机制，在数据恢复、Data Guard、Streams复制、RAC节点间的同步等各个功能中起着重要作用。理解SCN的运作机制，可以帮助你更加深入地了解上述功能。</span></span></p>
            <div>在理解SCN<span>之前，我们先看下oracle事务中的数据变化是如何写入数据文件的：</span></div>
            <div>&nbsp;</div>
            <div>1、事务开始；</div>
            <div>2、在buffer cache<span>中找到需要的数据块，如果没有找到，则从数据文件中载入buffer cache中；</span></div>
            <div>3、事务修改buffer cache<span>的数据块，该数据被标识为&#8220;脏数据&#8221;，并被写入log buffer中；</span></div>
            <div>4、事务提交，LGWR<span>进程将log buffer中的&#8220;脏数据&#8221;写入redo log file中；</span></div>
            <div>5、当发生checkpoint<span>，CKPT进程更新所有数据文件的文件头中的信息，DBWn进程则负责将Buffer Cache中的脏数据写入到数据文件中。</span></div>
            <div>&nbsp;</div>
            <div>经过上述5<span>个步骤，事务中的数据变化最终被写入到数据文件中。但是，一旦在上述中间环节时，数据库意外宕机了，在重新启动时如何知道哪些数据已经写入数据文件、哪些没有写呢（同样，在DG、streams中也存在类似疑问：redo log中哪些是上一次同步已经复制过的数据、哪些没有）？SCN机制就能比较完善的解决上述问题。</span></div>
            <div>&nbsp;</div>
            <div>SCN<span>是一个数字，确切的说是一个只会增加、不会减少的数字。正是它这种只会增加的特性确保了Oracle知道哪些应该被恢复、哪些应该被复制。</span></div>
            <div>&nbsp;</div>
            <div>总共有4<span>中SCN：系统检查点（System Checkpoint）SCN、数据文件检查点（Datafile Checkpoint）SCN、结束SCN（Stop SCN）、开始SCN（Start SCN）。其中其面3中SCN存在于控制文件中，最后一种则存在于数据文件的文件头中。</span></div>
            <div>在控制文件中，System Checkpoint SCN<span>是针对整个数据库全局的，因而之存在一个，而Datafile Checkpoint SCN和Stop SCN是针对每个数据文件的，因而一个数据文件就对应在控制文件中存在一份Datafile Checkpoint SCN和Stop SCN。在数据库正常运行期间，Stop SCN(通过视图v$datafile的字段last_change#可以查询)是一个无穷大的数字或者说是NULL。</span></div>
            <div>&nbsp;</div>
            <div>在一个事务提交后（上述第四个步骤），会在redo log<span>中存在一条redo记录，同时，系统为其提供一个最新的SCN（通过函数dbms_flashback.get_system_change_number可以知道当前的最新SCN），记录在该条记录中。如果该条记录是在redo log被清空（日志满做切换时或发生checkpoint时，所有变化日志已经被写入数据文件中），则其SCN被记录为redo log的low SCN。以后在日志再次被清空前写入的redo记录中SCN则成为Next SCN。</span></div>
            <div>&nbsp;</div>
            <div>当日志切换或发生checkpoint<span>（上述第五个步骤）时，从Low SCN到Next SCN之间的所有redo记录的数据就被DBWn进程写入数据文件中，而CKPT进程则将所有数据文件（无论redo log中的数据是否影响到该数据文件）的文件头上记录的Start SCN(通过视图v$datafile_header的字段checkpoint_change#可以查询)更新为Next SCN，同时将控制文件中的System Checkpoint SCN（通过视图v$database的字段checkpoint_change#可以查询）、每个数据文件对应的Datafile Checkpoint（通过视图v$datafile的字段checkpoint_change#可以查询）也更新为Next SCN。但是，如果该数据文件所在的表空间被设置为read-only时，数据文件的Start SCN和控制文件中Datafile Checkpoint SCN都不会被更新。</span></div>
            <div>&nbsp;</div>
            <div>那系统是如何产生一个最新的SCN<span>的？实际上，这个数字是由当时的timestamp转换过来的。每当需要产生一个最新的SCN到redo记录时，系统获取当时的timestamp，将其转换为数字作为SCN。我们可以通过函数SCN_TO_TIMESTAMP（10g以后）将其转换回timestamp：</span></div>
            <div>&nbsp;</div>
            <pre><code>SQL&gt; select dbms_flashback.get_system_change_number, SCN_TO_TIMESTAMP(dbms_flashback.get_system_change_number) from dual;</code></pre>
            <pre><code>&nbsp;</code></pre>
            <pre><code>GET_SYSTEM_CHANGE_NUMBER</code></pre>
            <pre><code>------------------------</code></pre>
            <pre><code>SCN_TO_TIMESTAMP(DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER)</code></pre>
            <pre><code>---------------------------------------------------------------------------</code></pre>
            <pre><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2877076756</code></pre>
            <pre><code>17-AUG-07 02.15.26.000000000 PM</code></pre>
            <div>&nbsp;</div>
            <div>也可以用函数<em>timestamp_to_scn</em>将一个timestamp转换为SCN：</div>
            <div>&nbsp;</div>
            <pre><code>SQL&gt; select timestamp_to_scn(SYSTIMESTAMP) as scn from dual;</code></pre>
            <pre><code>&nbsp;</code></pre>
            <pre><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SCN</code></pre>
            <pre><code>----------</code></pre>
            <pre><code>2877078439</code></pre>
            <div>&nbsp;</div>
            <div>最后，SCN<span>除了作为反映事务数据变化并保持同步外，它还起到系统的&#8220;心跳&#8221;作用——每隔3秒左右系统会刷新一次系统SCN。</span></div>
            <div>&nbsp;</div>
            <div>下面，在简单介绍一下SCN<span>如何在数据库恢复中起作用。</span></div>
            <div>&nbsp;</div>
            <div>数据库在正常关闭（shutdown immediate/normal<span>）时，会先做一次checkpoint，将log file中的数据写入数据文件中，将控制文件、数据文件中的SCN（包括控制文件中的Stop SCN）都更新为最新的SCN。</span></div>
            <div>&nbsp;</div>
            <div>数据库异常/<span>意外关闭不会或者只更新部分Stop SCN。</span></div>
            <div>&nbsp;</div>
            <div>当数据库启动时，Oracle<span>先检查控制文件中的每个Datafile Checkpoint SCN和数据文件中的Start SCN是否相同，再检查每个Datafile Checkpoint SCN和Stop SCN是否相同。如果发现有不同，就从Redo Log中找到丢失的SCN，重新写入数据文件中进行恢复。具体的数据恢复过程这里就不再赘述。</span></div>
            <div>&nbsp;</div>
            <div>SCN<span>作为Oracle中的一个重要机制，在多个重要功能中起着&#8220;控制器&#8221;的作用。了解SCN的产生和实现方式，帮助DBA理解和处理恢复、DG、Streams复制的问题。</span></div>
            <div>&nbsp;</div>
            <div>最后提一句，利用SCN<span>机制，在Oracle10g、11g中又增加了一些很实用的功能——数据库闪回、数据库负载重现等。</span></div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/conans/aggbug/214086.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-07-10 19:26 <a href="http://www.blogjava.net/conans/articles/214086.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 数据库连接池概述</title><link>http://www.blogjava.net/conans/articles/214083.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Thu, 10 Jul 2008 11:19:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/214083.html</guid><description><![CDATA[<div>
<p>数据库连接池概述：</p>
</div>
<div>
<p>数据库连接是一种关键的有限的昂贵的资源，这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性，影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。</p>
</div>
<div>
<p>数据库连接池负责分配、管理和释放数据库连接，它允许应用程序重复使用一个现有的数据库连接，而再不是重新建立一个；释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。</p>
</div>
<div>
<p>数 据库连接池在初始化时将创建一定数量的数据库连接放到连接池中，这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用，连接 池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数，当应用程序向连接池请求的连接数超过最大连接 数量时，这些请求将被加入到等待队列中。数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素：</p>
</div>
<div>
<p>1) 最小连接数是连接池一直保持的数据库连接，所以如果应用程序对数据库连接的使用量不大，将会有大量的数据库连接资源被浪费；</p>
</div>
<div>
<p>2) 最大连接数是连接池能申请的最大连接数，如果数据库连接请求超过此数，后面的数据库连接请求将被加入到等待队列中，这会影响之后的数据库操作。</p>
</div>
<div>
<p>3) 如果最小连接数与最大连接数相差太大，那么最先的连接请求将会获利，之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过，这些大于最小连接数的数据库连接在使用完不会马上被释放，它将被放到连接池中等待重复使用或是空闲超时后被释放。</p>
</div>
<img src ="http://www.blogjava.net/conans/aggbug/214083.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-07-10 19:19 <a href="http://www.blogjava.net/conans/articles/214083.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 数据库中乐观锁与悲观锁的概念</title><link>http://www.blogjava.net/conans/articles/214081.html</link><dc:creator>CONAN</dc:creator><author>CONAN</author><pubDate>Thu, 10 Jul 2008 11:18:00 GMT</pubDate><guid>http://www.blogjava.net/conans/articles/214081.html</guid><description><![CDATA[<div>
<p>锁（ locking ）</p>
</div>
<div>
<p>业务逻辑的实现过程中，往往需要保证数据访问的排他性。如在金融系统的日终结算</p>
</div>
<div>
<p>处理中，我们希望针对某个 cut-off 时间点的数据进行处理，而不希望在结算进行过程中</p>
</div>
<div>
<p>（可能是几秒种，也可能是几个小时），数据再发生变化。此时，我们就需要通过一些机</p>
</div>
<div>
<p>制来保证这些数据在某个操作过程中不会被外界修改，这样的机制，在这里，也就是所谓</p>
</div>
<div>
<p>的 &#8220; 锁 &#8221; ，即给我们选定的目标数据上锁，使其无法被其他程序修改。</p>
</div>
<div>
<p>Hibernate 支持两种锁机制：即通常所说的 &#8220; 悲观锁（ Pessimistic Locking ） &#8221;</p>
</div>
<div>
<p>和 &#8220; 乐观锁（ Optimistic Locking ） &#8221; 。</p>
</div>
<div>
<p>悲观锁（ Pessimistic Locking ）</p>
</div>
<div>
<p>悲观锁，正如其名，它指的是对数据被外界（包括本系统当前的其他事务，以及来自</p>
</div>
<div>
<p>外部系统的事务处理）修改持保守态度，因此，在整个数据处理过程中，将数据处于锁定</p>
</div>
<div>
<p>状态。悲观锁的实现，往往依靠数据库提供的锁机制（也只有数据库层提供的锁机制才能</p>
</div>
<div>
<p>真正保证数据访问的排他性，否则，即使在本系统中实现了加锁机制，也无法保证外部系</p>
</div>
<div>
<p>统不会修改数据）。</p>
</div>
<div>
<p>一个典型的倚赖数据库的悲观锁调用：</p>
</div>
<div>
<p>select * from account where name=&#8221;Erica&#8221; for update</p>
</div>
<div>
<p>这条 sql 语句锁定了 account 表中所有符合检索条件（ name=&#8221;Erica&#8221; ）的记录。</p>
</div>
<div>
<p>本次事务提交之前（事务提交时会释放事务过程中的锁），外界无法修改这些记录。</p>
</div>
<div>
<p>Hibernate 的悲观锁，也是基于数据库的锁机制实现。</p>
</div>
<div>
<p>注意，只有在查询开始之前（也就是 Hiberate 生成 SQL 之前）设定加锁，才会</p>
</div>
<div>
<p>真正通过数据库的锁机制进行加锁处理，否则，数据已经通过不包含 for update</p>
</div>
<div>
<p>子句的 Select SQL 加载进来，所谓数据库加锁也就无从谈起。</p>
</div>
<div>
<p>乐观锁（ Optimistic Locking ）</p>
</div>
<div>
<p>相对悲观锁而言，乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依</p>
</div>
<div>
<p>靠数据库的锁机制实现，以保证操作最大程度的独占性。但随之而来的就是数据库</p>
</div>
<div>
<p>性能的大量开销，特别是对长事务而言，这样的开销往往无法承受。</p>
</div>
<div>
<p>如一个金融系统，当某个操作员读取用户的数据，并在读出的用户数据的基础上进</p>
</div>
<div>
<p>行修改时（如更改用户帐户余额），如果采用悲观锁机制，也就意味着整个操作过</p>
</div>
<div>
<p>程中（从操作员读出数据、开始修改直至提交修改结果的全过程，甚至还包括操作</p>
</div>
<div>
<p>员中途去煮咖啡的时间），数据库记录始终处于加锁状态，可以想见，如果面对几</p>
</div>
<div>
<p>百上千个并发，这样的情况将导致怎样的后果。</p>
</div>
<div>
<p>乐观锁机制在一定程度上解决了这个问题。乐观锁，大多是基于数据版本</p>
</div>
<div>
<p>（ Version ）记录机制实现。何谓数据版本？即为数据增加一个版本标识，在基于</p>
</div>
<div>
<p>数据库表的版本解决方案中，一般是通过为数据库表增加一个 &#8220;version&#8221; 字段来</p>
</div>
<div>
<p>实现。</p>
</div>
<div>
<p>读取出数据时，将此版本号一同读出，之后更新时，对此版本号加一。此时，将提</p>
</div>
<div>
<p>交数据的版本数据与数据库表对应记录的当前版本信息进行比对，如果提交的数据</p>
</div>
<div>
<p>版本号大于数据库表当前版本号，则予以更新，否则认为是过期数据。</p>
</div>
<div>
<p>对于上面修改用户帐户信息的例子而言，假设数据库中帐户信息表中有一个</p>
</div>
<div>
<p>version 字段，当前值为 1 ；而当前帐户余额字段（ balance ）为 $100 。</p>
</div>
<div>
<p>1 操作员 A 此时将其读出（ version=1 ），并从其帐户余额中扣除 $50</p>
</div>
<div>
<p>（ $100-$50 ）。</p>
</div>
<div>
<p>2 在操作员 A 操作的过程中，操作员 B 也读入此用户信息（ version=1 ），并</p>
</div>
<div>
<p>从其帐户余额中扣除 $20 （ $100-$20 ）。</p>
</div>
<div>
<p>3 操作员 A 完成了修改工作，将数据版本号加一（ version=2 ），连同帐户扣</p>
</div>
<div>
<p>除后余额（ balance=$50 ），提交至数据库更新，此时由于提交数据版本大</p>
</div>
<div>
<p>于数据库记录当前版本，数据被更新，数据库记录 version 更新为 2 。</p>
</div>
<div>
<p>4 操作员 B 完成了操作，也将版本号加一（ version=2 ）试图向数据库提交数</p>
</div>
<div>
<p>据（ balance=$80 ），但此时比对数据库记录版本时发现，操作员 B 提交的</p>
</div>
<div>
<p>数据版本号为 2 ，数据库记录当前版本也为 2 ，不满足 &#8220; 提交版本必须大于记</p>
</div>
<div>
<p>录当前版本才能执行更新 &#8220; 的乐观锁策略，因此，操作员 B 的提交被驳回。</p>
</div>
<div>
<p>这样，就避免了操作员 B 用基于 version=1 的旧数据修改的结果覆盖操作</p>
</div>
<div>
<p>员 A 的操作结果的可能。</p>
</div>
<div>
<p>从上面的例子可以看出，乐观锁机制避免了长事务中的数据库加锁开销（操作员 A</p>
</div>
<div>
<p>和操作员 B 操作过程中，都没有对数据库数据加锁），大大提升了大并发量下的系</p>
</div>
<div>
<p>统整体性能表现。</p>
</div>
<div>
<p>需要注意的是，乐观锁机制往往基于系统中的数据存储逻辑，因此也具备一定的局</p>
</div>
<div>
<p>限性，如在上例中，由于乐观锁机制是在我们的系统中实现，来自外部系统的用户</p>
</div>
<div>
<p>余额更新操作不受我们系统的控制，因此可能会造成脏数据被更新到数据库中。在</p>
</div>
<div>
<p>系统设计阶段，我们应该充分考虑到这些情况出现的可能性，并进行相应调整（如</p>
</div>
<div>
<p>将乐观锁策略在数据库存储过程中实现，对外只开放基于此存储过程的数据更新途</p>
</div>
<div>
<p>径，而不是将数据库表直接对外公开）。</p>
</div>
<img src ="http://www.blogjava.net/conans/aggbug/214081.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/conans/" target="_blank">CONAN</a> 2008-07-10 19:18 <a href="http://www.blogjava.net/conans/articles/214081.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>