﻿<?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-tbwshc-随笔分类-oracle</title><link>http://www.blogjava.net/tbwshc/category/51843.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 06 Jun 2013 03:44:12 GMT</lastBuildDate><pubDate>Thu, 06 Jun 2013 03:44:12 GMT</pubDate><ttl>60</ttl><item><title>Oracle绝对值函数 </title><link>http://www.blogjava.net/tbwshc/archive/2013/06/06/400274.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Thu, 06 Jun 2013 02:16:00 GMT</pubDate><guid>http://www.blogjava.net/tbwshc/archive/2013/06/06/400274.html</guid><description><![CDATA[<p><span style="font-size: small"><strong><font size="2">1.绝对值：abs()</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">&nbsp;&nbsp; select abs(-2) value&nbsp;from dual;</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">2.取整函数（大）：ceil（）</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">&nbsp;&nbsp; select&nbsp;ceil(-2.001) value from dual;(-2)</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">3.取整函数（小）：floor（）</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">&nbsp;&nbsp; select floor(-2.001) value from dual;(-3)</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">4.取整函数（截取）：trunc（）</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">&nbsp;&nbsp; select&nbsp;trunc(-2.001) value from dual;&nbsp;(-2) </font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">5.四舍五入：round（）</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">&nbsp;&nbsp; select round(1.234564) value from dual;(1.2346)</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">6.取平方：Power（m,n）</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">&nbsp;&nbsp; select power(4,2) value from dual;(16)</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">7.取平方根:SQRT()</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">&nbsp;&nbsp; select sqrt(16) value from dual;(4)</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">8.取随机数:dbms_random(minvalue,maxvalue)</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">&nbsp;&nbsp; select sys.dbms.random.value(0,1) value from dual;</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">9.取符号：Sign()</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">&nbsp;&nbsp; select sign(-3) value from dual;(-)</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">10,取集合的最大值:greatest(value)</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">&nbsp;&nbsp; select greatest(-1,3,5,7,9) value from dual;(9)</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">11.取集合的最小值:least(value)</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">&nbsp;&nbsp; select least(-1,3,5,7,9) value from dual;(-1)</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">12.处理Null值：nvl(空值，代替值)</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">&nbsp;&nbsp; select&nbsp; nvl(null,10) value from dual;(10)</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">13.求字符序号:ascii()</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">&nbsp;&nbsp;&nbsp; select ascii(a) value from dual;</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">14.求序号字符:chr()</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">&nbsp;&nbsp;&nbsp; select chr(97) value from dual;</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">15.链接：concat()</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">&nbsp;&nbsp;&nbsp; select concat("11","22") value from dual;(1122)</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">16.获取系统时间:sysdate()</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">&nbsp;&nbsp;&nbsp; select sysdate value from dual;</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">17.求日期</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">&nbsp;&nbsp;&nbsp; select trunc(sysdate) from dual;</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">18.求时间</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">&nbsp;&nbsp;&nbsp; select&nbsp; to_char(sysdate,"hh24:mm:ss") from dual;</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">19.首字母大写：InitCAP()</font></strong></span></p>
<p><span style="font-size: small"><strong><font size="2">&nbsp;&nbsp;&nbsp; select INITCAP(abc def ghi) value from dual;<a style="color: #000000" href="http://www.tbwshc.com">tbw</a>(Abc Def Ghi)</font></strong></span></p><img src ="http://www.blogjava.net/tbwshc/aggbug/400274.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbwshc/" target="_blank">chen11-1</a> 2013-06-06 10:16 <a href="http://www.blogjava.net/tbwshc/archive/2013/06/06/400274.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 的Blob使用小结</title><link>http://www.blogjava.net/tbwshc/archive/2012/07/17/383314.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Tue, 17 Jul 2012 07:34:00 GMT</pubDate><guid>http://www.blogjava.net/tbwshc/archive/2012/07/17/383314.html</guid><wfw:comment>http://www.blogjava.net/tbwshc/comments/383314.html</wfw:comment><comments>http://www.blogjava.net/tbwshc/archive/2012/07/17/383314.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tbwshc/comments/commentRss/383314.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbwshc/services/trackbacks/383314.html</trackback:ping><description><![CDATA[Oracle 的Blob<br /><br />Oracle的Lobs的流处理方式与Long等对象的Stream方式不一样，没有Long的诸多限制；只要保持连接，就能通过blob对象正确读取对象。<br />有两种方式可以读取Blob：<br />1.直接使用ps.getBinaryStream()的方法得到流对象<br />2.使用getBlob得到blob，然后通过blob的方法提供的getBinaryStream(),getBytes() 访问blob的数据。<br />这两种方法都可以在rs.close之后正确获取数据。(在spring 的JdbcTemplet环境下，该rs理论上被JdbcTemplet自动关闭；从数据库连接来看，连接也正确关闭了)。<br /><br />使用Blob的好处是，按需获取Blob对象。而且可以多次通过blob.getBinaryStream得到对象。且Blob返回的对象可以使用mark/reset方法反复访问。且连接状态正常。<br />使用blob得到InputStream，可以调用close()接口，也可以不调用该接口，<a href="http://www.tbwshc.com"><span style="color: #000000">tb</span></a>在连接关闭时将自动关闭该连接。最好调用close()释放资源。<br /><br />c3p0的setBlob(pos,InputStream)接口不能正常工作。<br /><br />写入或更新Blob时，可以使用ps.setBinaryStream();调用此接口后，in对象到文件尾（在把stream写入blob后，不能要再调用in.close()关闭文件，否则报错）。<br />也可以使用setBlob(pos,Blob)方法来写入或更新Blob字段；但是注意的是，无论是以blob还是blob.getBinaryStream的方式，都不能自己更新自己，否则死锁。<br /><br />使用spring读取blob的示例程序：<br /><span>&nbsp;&nbsp; &nbsp;</span><span>&nbsp;&nbsp; &nbsp;</span><span>&nbsp;&nbsp; &nbsp;</span>String sql = "select photo from my_photoes where id='test2' and photo is not null and rownum&lt;2 ";<br />BLOB blob= (BLOB) simpleDao.queryForObject(sql,Blob.class);<span>&nbsp;&nbsp; &nbsp;</span><span>&nbsp;&nbsp;&nbsp; </span><br />InputStream in = blob.getBinaryStream();<br />String filename = "./test/dao/pic" + 1+ ".gif";<br />BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(filename));<br /><br /><span>&nbsp;&nbsp; &nbsp;</span><span>&nbsp;&nbsp; &nbsp;</span><span>&nbsp;&nbsp;&nbsp; </span>/* 需oracle的BLOB支持。效率可能会高些，但是空间上会有些浪费<br />byte[] b = new byte[blob.getBufferSize()];<span>&nbsp;&nbsp; &nbsp;</span><span>&nbsp;&nbsp; &nbsp;</span><span>&nbsp;&nbsp; &nbsp;</span><span>&nbsp;&nbsp;&nbsp; </span>//blob必须为oracle.sql.BLOB时才可调getBufferSize方法； 与java.sql.Blob区别。<br />System.out.println("bufferSize="+b.length);<span>&nbsp;&nbsp; &nbsp;</span><span>&nbsp;&nbsp; &nbsp;</span><span>&nbsp;&nbsp;&nbsp; </span>//32k左右，用这种方式读取文件会有一点空间的浪费。<br />int len=-1;<br />while ((len = in.read(b)) != -1) {<br />out.write(b);<br />}<br /><span>&nbsp;&nbsp; &nbsp;</span><span>&nbsp;&nbsp; &nbsp;</span><span>&nbsp;&nbsp;&nbsp; </span>*/<br /><br /><span>&nbsp;&nbsp; &nbsp;</span><span>&nbsp;&nbsp; &nbsp;</span><span>&nbsp;&nbsp;&nbsp; </span>/*&nbsp;&nbsp; 纯jdbc方法：<br /><span>&nbsp;&nbsp; &nbsp;</span><span>&nbsp;&nbsp; &nbsp;</span><span>&nbsp;&nbsp; &nbsp;</span><span>&nbsp;&nbsp; &nbsp;</span>nt b;<br /><span>&nbsp;&nbsp; &nbsp;</span> while ((b = in.read()) != -1) {<br /><span>&nbsp;&nbsp; &nbsp;</span>out.write(b);<br /><span>&nbsp;&nbsp; &nbsp;</span> }<br /><span>&nbsp;&nbsp; &nbsp;</span><span>&nbsp;&nbsp; &nbsp;</span><span>&nbsp;&nbsp;&nbsp; </span>*/<br /><br />in.close();<br />out.close();<br /><br /><br /><br />
<div><a href="http://hi.baidu.com/hexiong/blog/item/34d7b2b7f9b3e8f431add103.html">http://hi.baidu.com/hexiong/blog/item/34d7b2b7f9b3e8f431add103.html &nbsp;其他参考</a></div>
<div>BLOB处理遇到的问题：</div>
<div>1.用spring的模板类来处理blob时，遇到大文件时，流会异常关闭。解决办法，使用oracle的本地连接来获取blob流，如下：</div>
<div>
<div>&nbsp;&nbsp; &nbsp;public boolean queryForBlobStream(String sql,OutputStream fout)</div>
<div>&nbsp;&nbsp; &nbsp;{</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;boolean flag=true;</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;try {</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Connection conn = DataSourceUtils.getConnection(getJdbcTemplate().getDataSource());</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;conn.setAutoCommit(false);<span>&nbsp;&nbsp; &nbsp;<span>&nbsp;&nbsp; &nbsp;<span>&nbsp;&nbsp; &nbsp;<span>&nbsp;&nbsp; &nbsp;<span>&nbsp;&nbsp; &nbsp;<span>&nbsp;&nbsp; &nbsp;//此部分ms能提高性能</span></span></span></span></span></span></div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Statement st = conn.createStatement();</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ResultSet rs = st.executeQuery(sql);</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (rs.next()) {</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;java.sql.Blob blob = rs.getBlob(1);</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;InputStream ins = blob.getBinaryStream();</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//输出到文件</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//下面将BLOB数据写入文件</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;byte[] b = new byte[1024];</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int len = 0;</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while ((len = ins.read(b)) != -1) {</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fout.write(b, 0, len);</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//依次关闭</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;fout.close();</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ins.close();</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;conn.commit();</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;rs.close(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //maybe not nessesary</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;st.close(); &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //maybe not nessesary</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;conn.close();</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;} catch (IOException ex) {</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;flag=false;</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;} catch (SQLException ex) {</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;flag=false;</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;}</div>
<div>&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;return flag;</div>
<div>&nbsp;&nbsp; &nbsp;}</div>
<div></div>2.如果把blob对象放到记录的字段中，在web开发中，通过blob.getBinaryStream()只能获得一次blob流，第二次调用同一对象的blob流会得到null流。</div>
<div>且在这种方式下，不能使用in.close()关闭流。</div><img src ="http://www.blogjava.net/tbwshc/aggbug/383314.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbwshc/" target="_blank">chen11-1</a> 2012-07-17 15:34 <a href="http://www.blogjava.net/tbwshc/archive/2012/07/17/383314.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>　　oracle 字段类型</title><link>http://www.blogjava.net/tbwshc/archive/2012/07/17/383311.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Tue, 17 Jul 2012 07:20:00 GMT</pubDate><guid>http://www.blogjava.net/tbwshc/archive/2012/07/17/383311.html</guid><wfw:comment>http://www.blogjava.net/tbwshc/comments/383311.html</wfw:comment><comments>http://www.blogjava.net/tbwshc/archive/2012/07/17/383311.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tbwshc/comments/commentRss/383311.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbwshc/services/trackbacks/383311.html</trackback:ping><description><![CDATA[　<span class="tcnt">oracle 字段类型</span>　　　CHAR&nbsp;&nbsp;&nbsp; 固定长度字符串&nbsp;&nbsp;&nbsp; 最大长度2000&nbsp;&nbsp;&nbsp; bytes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<p style="text-indent: 2em">&nbsp;&nbsp; VARCHAR2&nbsp;&nbsp;&nbsp; 可变长度的字符串&nbsp;&nbsp;&nbsp; 最大长度4000&nbsp;&nbsp;&nbsp; bytes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可做索引的最大长度749&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; NCHAR&nbsp;&nbsp;&nbsp; 根据字符集而定的固定长度字符串&nbsp;&nbsp;&nbsp; 最大长度2000&nbsp;&nbsp;&nbsp; bytes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; NVARCHAR2&nbsp;&nbsp;&nbsp; 根据字符集而定的可变长度字符串&nbsp;&nbsp;&nbsp; 最大长度4000&nbsp;&nbsp;&nbsp; bytes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; DATE&nbsp;&nbsp;&nbsp; 日期（日-月-年）&nbsp;&nbsp;&nbsp; DD-MM-YY（HH-MI-SS）&nbsp;&nbsp;&nbsp; 经过严格测试，无千虫问题&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; LONG&nbsp;&nbsp;&nbsp; 超长字符串&nbsp;&nbsp;&nbsp; 最大长度2G（231-1）&nbsp;&nbsp;&nbsp; 足够存储大部头著作&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; RAW&nbsp;&nbsp;&nbsp; 固定长度的二进制数据&nbsp;&nbsp;&nbsp; 最大长度2000&nbsp;&nbsp;&nbsp; bytes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可存放多媒体图象声音等&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; LONG&nbsp;&nbsp;&nbsp; RAW&nbsp;&nbsp;&nbsp; 可变长度的二进制数据&nbsp;&nbsp;&nbsp; 最大长度2G&nbsp;&nbsp;&nbsp; 同上&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; BLOB&nbsp;&nbsp;&nbsp; 二进制数据&nbsp;&nbsp;&nbsp; 最大长度4G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; CLOB&nbsp;&nbsp;&nbsp; 字符数据&nbsp;&nbsp;&nbsp; 最大长度4G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; NCLOB&nbsp;&nbsp;&nbsp; 根据字符集而定的字符数据&nbsp;&nbsp;&nbsp; 最大长度4G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; BFILE&nbsp;&nbsp;&nbsp; 存放在数据库外的二进制数据&nbsp;&nbsp;&nbsp; 最大长度4G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; ROWID&nbsp;&nbsp;&nbsp; 数据表中记录的唯一行号&nbsp;&nbsp;&nbsp; 10&nbsp;&nbsp;&nbsp; bytes&nbsp;&nbsp;&nbsp; ********.****.****格式，*为0或1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; NROWID&nbsp;&nbsp;&nbsp; 二进制数据表中记录的唯一行号&nbsp;&nbsp;&nbsp; 最大长度4000&nbsp;&nbsp;&nbsp; bytes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; NUMBER(P,S)&nbsp;&nbsp;&nbsp; 数字类型&nbsp;&nbsp;&nbsp; P为整数位，S为小数位&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; DECIMAL(P,S)&nbsp;&nbsp;&nbsp; 数字类型&nbsp;&nbsp;&nbsp; P为整数位，S为小数位&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; INTEGER&nbsp;&nbsp;&nbsp; 整数类型&nbsp;&nbsp;&nbsp; 小的整数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; FLOAT&nbsp;&nbsp;&nbsp; 浮点数类型&nbsp;&nbsp;&nbsp; NUMBER(38)，双精度&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="text-indent: 2em">&nbsp;&nbsp; REAL&nbsp;&nbsp;&nbsp; 实数类型&nbsp;&nbsp;&nbsp; NUMBER(63)，精度更高&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p style="text-indent: 2em">数据类型 参数 描述 </p>
<p style="text-indent: 2em">char(n) n=1 to 2000字节 定长字符串，n字节长，如果不指定长度，缺省为1个字节长（一个汉字为2字节） </p>
<p style="text-indent: 2em">varchar2(n) n=1 to 4000字节 可变长的字符串，具体定义时指明最大长度n，</p>
<p style="text-indent: 2em">这种数据类型可以放数字、字母以及ASCII码字符集(或者EBCDIC等数据库系统接受的字符集标准)中的所有符号。</p>
<p style="text-indent: 2em">如果数据长度没有达到最大值n，Oracle 8i会根据数据大小自动调节字段长度，</p>
<p style="text-indent: 2em">如果你的数据前后有空格，Oracle 8i会自动将其删去。VARCHAR2是最常用的数据类型。</p>
<p style="text-indent: 2em">可做索引的最大长度3209。 </p>
<p style="text-indent: 2em">number(m,n) m=1 to 38</p>
<p style="text-indent: 2em">n=-84 to 127 可变长的数值列，允许0、正值及负值，m是所有有效数字的位数，n是小数点以后的位数。</p>
<p style="text-indent: 2em">如：number(5,2)，则这个字段的最大值是99,999，如果数值超出了位数限制就会被截取多余的位数。</p>
<p style="text-indent: 2em">如：number(5,2)，但在一行数据中的这个字段输入575.316，则真正保存到字段中的数值是575.32。</p>
<p style="text-indent: 2em">如：number(3,0)，输入575.316，真正保存的数据是575。&nbsp;&nbsp;</p>
<p style="text-indent: 2em">date 无 从公元前4712年1月1日到公元4712年12月31日的所有合法日期，</p>
<p style="text-indent: 2em">Oracle 8i其实在内部是按7个字节来保存日期数据，在定义中还包括小时、分、秒。</p>
<p style="text-indent: 2em">缺省格式为DD-MON-YY，如07-11月-00 表示2000年11月7日。&nbsp;&nbsp;</p>
<p style="text-indent: 2em">long 无 可变长字符列，最大长度限制是2GB，用于不需要作字符串搜索的长串数据，如果要进行字符搜索就要用varchar2类型。</p>
<p style="text-indent: 2em">long是一种较老的数据类型，将来会逐渐被BLOB、CLOB、NCLOB等大的对象数据类型所取代。&nbsp;&nbsp;</p>
<p style="text-indent: 2em">raw(n) n=1 to 2000 可变长二进制数据，在具体定义字段的时候必须指明最大长度n，Oracle 8i用这种格式来保存较小的图形文件或带格式的文本文件，如Miceosoft Word文档。</p>
<p style="text-indent: 2em">raw是一种较老的数据类型，将来会逐渐被BLOB、CLOB、NCLOB等大的对象数据类型所取代。&nbsp;&nbsp;</p>
<p style="text-indent: 2em">long raw 无 可变长二进制数据，最大长度是2GB。Oracle 8i用这种格式来保存较大的图形文件或带格式的文本文件，如Miceosoft Word文档，以及音频、视频等非文本文件。</p>
<p style="text-indent: 2em">在同一张表中不能同时有long类型和long raw类型，long raw也是一种较老的数据类型，将来会逐渐被BLOB、CLOB、NCLOB等大的对象数据类型所取代。&nbsp;&nbsp;</p>
<p style="text-indent: 2em">blob</p>
<p style="text-indent: 2em">clob</p>
<p style="text-indent: 2em">nclob 无 三种大型对象(LOB)，用来保存较大的图形文件或带格式的文本文件，如Miceosoft Word文档，以及音频、视频等非文本文件，最大长度是4GB。</p>
<p style="text-indent: 2em">LOB有几种类型，取决于你使用的字节的类型，Oracle 8i实实在在地将这些数据存储在数据库内部保存。</p>
<p style="text-indent: 2em">可以执行读取、存储、写入等特殊操作。&nbsp;&nbsp;</p>
<p style="text-indent: 2em">bfile 无 在数据库外部保存的大型二进制对象文件，最大长度是4GB。</p>
<p style="text-indent: 2em">这种外部的LOB类型，通过数据库记录变化情况，但是数据的具体保存是在数据库外部进行的。</p>
<p style="text-indent: 2em">Oracle 8i可以读取、查询BFILE，但是不能写入。</p>
<p style="text-indent: 2em">大小由操作系统决定。&nbsp;&nbsp;</p>
<p style="text-indent: 2em">数据类型是列或存储过程中的一个属性。 </p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; Oracle支持的数据类型可以分为三个基本种类：字符数据类型、数字数据类型以及表示其它数据的数据类型。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; 字符数据类型</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CHAR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char数据类型存储固定长度的字符值。一个CHAR数据类型可以包括1到2000个字符。如果对CHAR没有明确地说明长度，它的默认长度则设置为1。如果对某个CHAR类型变量赋值，其长度小于规定的长度，那么Oracle自动用空格填充。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARCHAR2 存储可变长度的字符串。虽然也必须指定一个VARCHAR2数据变量的长度，但是这个长度是指对该变量赋值的最大长度而非实际赋值长度。不需用空格填充。最多可设置为4000个字符。因为VARCHAR2数据类型只存储为该列所赋的字符（不加空格），所以VARCHAR2需要的存储空间比CHAR数据类型要小。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; Oracle推荐使用VARCHAR2</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NCHAR和NVARCHAR2 NCHAR和NVARCHAR2数据类型分别存储固定长度与可变长度的字符串，但是它们使用的是和数据库其他类型不同的字符集。在创建数据库时，需要指定所使用的字符集，以便对数据中数据进行编码。还可以指定一个辅助的字符集[即本地语言集]。NCHAR和NVARCHAR2类型的列使用辅助字符集。NCHAR和NVARCHAR2类型的列使用辅助字符集。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在Oracle 9i中，可以以字符而不是字节为单位表示NCHAR和NVARCHAR2列的长度。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LONG long数据类型可以存放2GB的字符数据，它是从早期版本中继承下来的。现在如果存储大容量的数据，Oracle推荐使用CLOB和NCLOB数据类型。在表和SQL语句中使用LONG类型有许多限制。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CLOB和NCLOB&nbsp;&nbsp;&nbsp; CLOB和NCLOB数据类型可以存储多达4GB的字符数据。NCLOB数据类型可存储NLS数据。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数字数据类型</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Oracle使用标准、可变长度的内部格式来存储数字。这个内部格式精度可以高达38位。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER数据类型可以有两个限定符，如：column NUMBER(precision,scale)。precision表示数字中的有效位。如果没有指定precision的话，Oracle将使用38作为精度。scale表示小数点右边的位数，scale默认设置为0。如果把scale设成负数，Oracle将把该数字取舍到小数点左边的指定位数。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 日期数据类型</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Oracle标准日期格式为：DD-MON-YY HH:MI:SS</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过修改实例的参数NLS_DATE_FORMAT，可以改变实例中插入日期的格式。在一个会话期间，可以通过Alter session SQL命令来修改日期，或者通过使用SQL语句的TO_DATE表达式中的参数来更新一个特定值。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其它的数据类型</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RAW和LONG RAW&nbsp;&nbsp;&nbsp; RAW和LONG RAW数据类型主要用于对数据库进行解释。<a href="http://www.tbwshc.com"><span style="color: #000000">tb</span></a>指定这两种类型时，Oracle以位的形式来存储数据。RAW数据类型一般用于存储有特定格式的对象，如位图。RAW数据类型可占用2KB的空间，而LONG RAW数据类型则可以占用2GB大小。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ROWID ROWID是一种特殊的列类型，称之为伪列（pseudocolumn）。ROWID伪列在SQL SELECT语句中可以像普通列那样被访问。Oracle数据库中每行都有一个伪列。ROWID表示行的地址，ROWID伪列用ROWID数据类型定义。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ROWID与磁盘驱动的特定位置有关，因此，ROWID是获得行的最快方法。但是，行的ROWID会随着卸载和重载数据库而发生变化，因此建议不要在事务中使用ROWID伪列的值。例如，一旦当前应用已经使用完记录，就没有理由保存行的ROWID。不能通过任何SQL语句来设置标准的ROWID伪列的值。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 列或变量可以定义成ROWID数据类型，但是Oracle不能保证该列或变量的值是一个有效的ROWID。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; LOB（大型对象）数据类型，可以保存4GB的信息。LOB有以下3中类型：</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;CLOB&gt;，只能存储字符数据</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &lt;NCLOB&gt;，保存本地语言字符集数据</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &lt;BLOB&gt;&nbsp;&nbsp;&nbsp; ，以二进制信息保存数据</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以指定将一个LOB数据保存在Oracle数据库内，还是指向一个包含次数据的外部文件。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LOB可以参与事务。管理LOB中的数据必须通过DBMS_LOB PL/SQL内置软件包或者OGI接口。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为了便于将LONG数据类型转换成LOB，Oracle 9i包含许多同时支持LOB和LONG的函数，喊包括一个ALTER TABLE语句的新选择，它允许将LONG数据类型自动转换成LOB。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; BFILE</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BFILE数据类型用做指向存储在Oracle数据库以外的文件的指针。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; XML Type</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作为对XML支持的一部分，Oracle 9i包含了一个新的数据类型XML Type。定义为XMLType的列将存储一个字符LOB列中的XML文档。有许多内置的功能可以使你从文档中抽取单个节点，还可以在XML Type文档中对任何节点创建索引。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用户自定义数据</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从Oracle 8以后，用户可以定义自己的复杂数据类型，它们由Oracle基本数据类型组合而成。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AnyType、AnyData和AnyDataSet</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Oracle包括3个新的数据类型，用于定义在现有数据类型之外的数据结构。其中每种数据类型必须用程序单元来定义，以便让Oracle9i知道如何处理这些类型的特定实现。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; 类型转换</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; Oracle会自动将某些数据类型转换成其他的数据类型，转换取决于包括该值的SQL语句。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; 数据转换还可以通过Oracle的类型转换函数显示地进行。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; 连接与比较</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; 在大多数平台上Oracle SQL中的连接操作符用两条竖线（||）表示。连接是将两个字符值连接。Oracle的自动类型转换功能使得两个数字值也可以进行连接。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; NULL</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; NULL值是关系数据库的重要特征之一。实际上，NULL不代表任何值，它表示没有值。如果要创建表的一个列，而这个列必须有值，那么应将它指定为NOT NULL，这表示该列不能包含NULL值。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; 任何数据类型都可以赋予NULL值。NULL值引入了SQL运算的三态逻辑。如果比较的一方是NULL值，那么会出现3种状态：TURE、FALSE以及两者都不是。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; 因为NULL值不等于0或其他任何值，所以测试某个数据是否为NULL值只能通过关系运算符IS NULL来进行。</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; NULL值特别适合以下情况：当一个列还未赋值时。如果选择不使用NULL值，那么必须对行的所有列都要赋值。这实际上也取消了某列不需要值的可能性，同时对它赋的值也很容易产生误解。这种情况则可能误导终端用户，并且导致累计操作的错误结果。</p>
<p style="text-indent: 2em">number(p,s) </p>
<p style="text-indent: 2em">p:1~38 </p>
<p style="text-indent: 2em">s:-84~127 </p>
<p style="text-indent: 2em">p&gt;0，对s分2种情况：1. s&gt;0 </p>
<p style="text-indent: 2em">精确到小数点右边s位，并四舍五入。然后检验有效数位是否&lt;=p；如果s&gt;p，小数点右边至少有s-p个0填充。 </p>
<p style="text-indent: 2em">2. s&lt;0 </p>
<p style="text-indent: 2em">精确到小数点左边s位，并四舍五入。然后检验有效数位是否&lt;=p+|s| </p>
<p style="text-indent: 2em">123.2564 NUMBER 123.2564 </p>
<p style="text-indent: 2em">1234.9876 NUMBER(6,2) 1234.99 </p>
<p style="text-indent: 2em">12345.12345 NUMBER(6,2) Error </p>
<p style="text-indent: 2em">1234.9876 NUMBER(6) 1235 </p>
<p style="text-indent: 2em">12345.345 NUMBER(5,-2) 12300 </p>
<p style="text-indent: 2em">1234567 NUMBER(5,-2) 1234600 </p>
<p style="text-indent: 2em">12345678 NUMBER(5,-2) Error </p>
<p style="text-indent: 2em">123456789 NUMBER(5,-4) 123460000 </p>
<p style="text-indent: 2em">1234567890 NUMBER(5,-4) Error </p>
<p style="text-indent: 2em">12345.58 NUMBER(*, 1) 12345.6 </p>
<p style="text-indent: 2em">0.1 NUMBER(4,5) Error </p>
<p style="text-indent: 2em">0.01234567 NUMBER(4,5) 0.01235 </p>
<p style="text-indent: 2em">0.09999 NUMBER(4,5) 0.09999</p><img src ="http://www.blogjava.net/tbwshc/aggbug/383311.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbwshc/" target="_blank">chen11-1</a> 2012-07-17 15:20 <a href="http://www.blogjava.net/tbwshc/archive/2012/07/17/383311.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>详解Oracle数据库优化方案与实践</title><link>http://www.blogjava.net/tbwshc/archive/2012/07/10/382694.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Tue, 10 Jul 2012 03:10:00 GMT</pubDate><guid>http://www.blogjava.net/tbwshc/archive/2012/07/10/382694.html</guid><wfw:comment>http://www.blogjava.net/tbwshc/comments/382694.html</wfw:comment><comments>http://www.blogjava.net/tbwshc/archive/2012/07/10/382694.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tbwshc/comments/commentRss/382694.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbwshc/services/trackbacks/382694.html</trackback:ping><description><![CDATA[<p>在这里我们将介绍Oracle数据库优化方案与实践，不同的环境会有不同的调试，但是也会有差别，希望大家能合理的吸收。</p>
<p>一、前言 </p>
<p>二、ORACLE数据库优化概述 </p>
<p>1、内存等参数配置的优化 </p>
<p>2、减少物理读写的优化 </p>
<p>3、批量重复操作的SQL语句及大表操作的优化</p>
<p>二、ORACLE数据库优化方案 </p>
<p>1、内存等Oracle系统参数配置</p>
<p>2、使用索引 </p>
<p>3、表分区 </p>
<p>4、Procedure优化 </p>
<p>5、其他改造</p>
<p>6、维护作业计划 </p>
<p>三、ORACLE数据库优化前后比较 </p>
<p>1、批量重复的SQL语句执行性能</p>
<p>2、一些单次、不常用的操作的语句执行性能 </p>
<p>四、参考 </p>
<p>1、常用的优化工具 </p>
<p>2、参考文献</p>
<p>一、前言</p>
<p>随着实际项目的启动，实际项目中使用的 Oracle数据库经过一段时间的运行，在线保存的数据量和业务处理的数据量在逐渐增大，最初的Oracle设置，与现在实际需要的运行性能有一定差距，需要进行一些优化调整。</p>
<p>本文将结合本人实际维护经验，相应地提出实际项目数据处理的一些优化方法，以供参考。</p>
<p>适用于Oracle 9i。</p>
<p>二、Oracle数据库优化概述 </p>
<p>Oracle数据库的优化，针对不同的应用，会有侧重点不同的优化方法，根据我们实际项目的应用特点，我们主要关心的是每次事务执行完成的时间长短。</p>
<p>从Oracle数据库本身的特点，我们可以把优化工作划分为初始优化设置，微优化。</p>
<p>在初始优化设置时，我们只能根据硬件情况，估计业务运行的情况，综合经验，给出一种经验设置，大体上来说，这种经验设置离满足优化需求的目标不是很远。在完成了初始优化设置后，经过一段时间的业务运行，已可开始收集实际运行环境的性能数据，此时，就可以对各种Oracle性能指标、各种关心的事务操作进行性能评估，然后进行微优化了。</p>
<p>Oracle优化，不是一个一蹴而就的工作，也不是一个一劳永逸的工作，需要定期维护，<a href="http://www.tbwshc.com"><span style="color: #000000">tb</span></a>定期观察，在发现性能瓶颈时及时进行调整。Oracle总是存在性能瓶颈的，不使用、不操作的数据库总是最快的，在解决当前瓶颈后，总是会有另一个瓶颈出现，所以在优化前，我们需要确定一个优化目标，我们的目标是满足我们的应用性能要求就可以了。</p>
<p>Oracle优化，涉及的范围太广泛，包含的有主机性能，内存使用性能，网络传输性能，SQL语句执行性能等等，从我们面向网管来说，满足事务执行速度性能主要表现在：</p>
<p>1）批量重复的SQL语句执行性能（主要是通过Procedure计算完成数据合并和数据汇总的性能和批量数据采集入库的性能）；</p>
<p>2）一些单次、不常用的操作的语句执行性能（主要是GUI的非规律操作）。</p>
<p>根据这两个特点，我们可把优化方法归纳到3个重要方向：</p>
<p>1）内存等参数配置的优化。内存优化，是性能受益最快的地方。</p>
<p>2）减少物理读写的优化。内存逻辑I/O操作的时间，远远小于物理I/O的操作时间。</p>
<p>3）批量重复操作的SQL语句及大表操作的优化。减少SQL执行次数，减少大表操作次数。</p>
<p>下面主要针对得益最大的这三个方向的优化进行阐述。 </p>
<p>1、内存等参数配置的优化</p>
<p>对于大多数应用来说，最直接、最快速得到优化收益的，肯定属于内存的优化。给每个Oracle内存块分配合理的大小，可以有效的使用数据库。通过观察各种数据库活动在内存里的命中率，执行情况，我们能很快的掌握数据库的主要瓶颈。我们从下面的一条SQL语句的执行步骤就可知道。</p>
<p>一个SQL语句，从发布到执行，会按顺序经历如下几个步骤：</p>
<p>1）Oracle把该SQL的字符转换成它们的ASCII等效数字码。</p>
<p>2）该ASCII数字码被传送给一个散列算法，生成一个散列值。</p>
<p>3）用户server process查看该散列值是否在shared pool内存块中存在。</p>
<p>若存在：</p>
<p>4）使用shared pool中缓存的版本来执行。</p>
<p>若不存在：</p>
<p>4）检查该语句的语义正确性。</p>
<p>5）执行对象解析（这期间对照数据字典，检查被引用的对象的名称和结构的正确性）。</p>
<p>6）检查数据字典，收集该操作所引用的所有对象的相关统计数据。</p>
<p>7）准备执行计划，从可用的执行计划中选择一个执行计划。（包括对stored outline和materialized view的相关使用的决定）</p>
<p>8）检查数据字典，确定所引用对象的安全性。</p>
<p>9）生成一个编译代码（P-CODE）。</p>
<p>10）执行。</p>
<p>这里，通过内存的合理分配，参数的合理设置，我们主要解决：</p>
<p>1）减少执行到第五步的可能，节约SQL语句解析的时间。第五步以后的执行过程，是一个很消耗资源的操作过程。</p>
<p>2）通过内存配置，尽可能让SQL语句所做的操作和操作的数据都在内存里完成。大家都知道，从内存读取数据的速度，要远远快于从物理硬盘上读数据，一次内存排序要比硬盘排序快很多倍。</p>
<p>3）根据数据库内存活动，减少每个内存块活动的响应时间，充分利用每个内存块，减少内存latch争用发生的次数。</p>
<p>2、减少物理读写的优化</p>
<p>无论如何配置Oracle数据库，我们的网管系统，每小时周期性的都会有新数据被处理，就会发生物理读写，这是避免不了的。</p>
<p>减少物理读写的优化，一般所用的方法有：</p>
<p>1） 增加内存data buffer的大小，尽可能让数据库操作的数据都能在内存里找到，不需要进行物理读写操作。</p>
<p>2） 通过使用索引，避免不必要的全表扫描。</p>
<p>3） 大表物理分区，Oracle具有很好的分区识别功能，减少数据扫描范围。</p>
<p>上述3个方法，是从整体上改善数据库物理I/O性能最明显的3个方法。能非常快速的减少数据库在物理I/O，最直接的反应是数据库事务执行时间能能以数量级为单位减少。其他的一些减少物理读写的优化方法，比如使用materialized view，Cluster等方法；还有一些分散I/O的方法，比如 Oracle日志文件不与数据文件放在一个物理硬盘，数据热点文件物理I/O分开等等方法，就目前我们的网管系统而言，能得到的效果不是很明显，在网管系统中，为了不增加数据库维护的复杂性，不推荐使用。</p>
<p>3、批量重复操作的SQL语句及大表操作的优化</p>
<p>批量重复执行的SQL语句，一般出现在每个周期时间内的数据批量入库的insert语句，和数据合并、汇总的周期性select、delete、insert操作。</p>
<p>我们需要注意以下几点：</p>
<p>1） 减少不必要的SQL语句执行和SQL语句的执行次数。</p>
<p>每条SQL语句执行，都会消费系统资源，都有执行时间。减少不必要的SQL语句执行和减少SQL语句的执行次数，自然能减少业务执行时间。需要根据业务流程，重新设计数据处理的代码。此方法主要适用于procedure执行的数据合并、汇总。</p>
<p>2） 这些SQL语句，由于每个SQL语句都要执行很多次，应该尽量让该SQL的散列值在shared pool内存块中存在。也就是使用动态SQL，避免SQL硬解析。</p>
<p>可通过Oracle参数的设置，和动态SQL语句的应用，通过绑定变量的方式，减少SQL语句的解析次数。</p>
<p>3）减少大表的操作，确保在一次事务中，同类操作只对大表执行一次。主要在数据合并和数据汇总的pprocedure和数据采集时出现</p>
<p>三、Oracle数据库优化方案</p>
<p>1、内存等Oracle系统参数配置</p>
<p>Oracle 的parameter参数，分动态参数和静态参数，静态参数需要重新启动数据库才能生效，动态参数不需要重新启动数据库即可生效。</p>
<p>Oracle 9i可以使用spfile的特性，使用alter system set 参数名=参数值 scope=both[spfile];的方法进行修改。也可以直接修改pfile。</p>
<p>以下给出了网管Oracle 数据库重点关注的parameter的初始优化设置。</p>
<p>最大可使用的内存SGA总和</p>
<p>静态参数sga_max_size=物理内存的大小减1.5G</p>
<p>Shared pool</p>
<p>动态参数shared_pool_size= 600 ~ 800 M</p>
<p>静态参数shared_pool_reserved_size= 300 M</p>
<p>动态参数open_cursors= 400 ~ 600</p>
<p>静态参数cursor_space_for_time= TRUE</p>
<p>静态参数session_cached_cursors= 60 ~ 100</p>
<p>动态参数cursor_sharing= SIMILAR</p>
<p>Data buffer</p>
<p>动态参数db_cache_advice= READY</p>
<p>动态参数db_cache_size</p>
<p>动态参数Db_keep_cache_size</p>
<p>动态参数db_recycle_cache_size</p>
<p>（sga_max_size大小，除了分配给所有非data buffer的size，都分配给data buffer）</p>
<p>Sga other memory</p>
<p>动态参数large_pool_size= 50 M</p>
<p>静态参数java_pool_size= 100 M</p>
<p>动态参数log_buffer= 3 M</p>
<p>Other memory</p>
<p>动态参数sort_area_size= 3 M</p>
<p>静态参数sort_area_retained_size= 0.5 M</p>
<p>静态参数pga_aggregate_target= 800 M</p>
<p>动态参数workarea_size_policy= AUTO</p>
<p>磁盘I/O配置</p>
<p>静态参数sql_trace= FALSE</p>
<p>动态参数timed_statistics= true</p>
<p>动态参数db_file_multiblock_read_count= 16</p>
<p>静态参数dbwr_io_slaves= 0</p>
<p>静态参数db_writer_processes= 3</p>
<p>静态参数undo_management= AUTO</p>
<p>动态参数undo_retention= 7200</p>
<p>2、使用索引</p>
<p>我们初步定义，表数据超过1000行的表，我们都要求使用索引。（不区分事务操作的数据在表数据中所占的比例）</p>
<p>索引所包含的字段不超过4个。</p>
<p>检查SQL语句是否使用了索引，我们使用execute plan来看，获得explain的方法，我们通过SQL*PLUS工具，使用如下命令进行查看：</p>
<p>setautotraceonsetautotracetraceonlyexplain settimingon或通过SQL*PLUS trace，然后查看user_dump_dest下的跟踪文件，使用tkprof工具格式化后阅览。</p>
<p>altersessionsetevents'10046tracenamecontextforever,level12'; altersessionsetevents'10046tracenamecontextoff'; SELECTp.spid,s.usernameFROMv$sessions,v$processpWHEREs.audsid=USERENV('sessionid')ANDs.paddr=p.addr;3、表分区</p>
<p>在网管数据库里，比较突出的大表有小区表和告警表。</p>
<p>性能表，使用范围分区。</p>
<p>以时间点start_time为范围分区字段。</p>
<p>告警表，使用range-hash的混合分区和范围分区。</p>
<p>范围分区以时间点starttime为分区字段，混合分区增加ALARMNUMBER为字段的hash子分区。</p>
<p>同时，创建本地分区索引。</p>
<p>4、Procedure优化</p>
<p>1）取消地市一级的Procedure，只保留其上层调用Procedure，并保持参数输入方法，调用方法不变。</p>
<p>2）确保大表数据查询操作只有1次，确保大表数据删除只有一次。</p>
<p>3）确保单条SQL语句执行已优化。</p>
<p>4）减少SQL执行次数。</p>
<p>5、其他改造</p>
<p>修改表存储参数，提前预先分配extents。</p>
<p>修改表空间存储参数（采集表空间所用块设置为大块，比如32k一个块；修改ptcfree,pctused,pctincrease等）。</p>
<p>避免使用唯一索引和非空约束。</p>
<p>创建合理的索引。</p>
<p>各模块SQL语句优化，比如使用提示固定索引等。</p>
<p>确认每一条历史数据删除语句已优化和删除方法。</p>
<p>临时表的使用。</p>
<p>6、维护作业计划</p>
<p>表分析（包含确定具体的表的分析方法，分区表分析方法，索引分析方法）。</p>
<p>空间回收维护（包括确定HWM，回收多余分配给表的块，合并数据块碎片等）。</p>
<p>索引维护（包括定期重建索引，索引使用情况监视等）。</p>
<p>历史数据删除检查（检查保存的数据是否符合要求，检查历史数据删除方法是否正确-比如批量删除提交的方法等）。</p>
<p>全库性能分析和问题报告及优化（比如使用statspack进行性能趋势分析，检查有问题的SQL或事务，确定当前系统等待的top 5事件等等）。</p>
<p>表数据keep,default及reclye（比如把一些常用的配置表固定在内存里等）。</p>
<p>数据库参数核查（防止数据库参数被修改，定期对系统配置参数进行比较）。</p>
<p>日志文件分析（定期检查Oracle生成的日志文件，定期备份、删除）。</p>
<p>硬盘空间维护（定期对Oracle 对象使用的空间情况进行监视）。</p>
<p>四，Oracle数据库优化前后比较</p>
<p>1、批量重复的SQL语句执行性能</p>
<p>根据网元数量，各地的执行的完成时间有所区别。</p>
<p>用于数据合并和汇总的Procedure的计算性能</p>
<p>通过statspack的周期性采集数据，我们可以使用以下语句，计算我们想统计的Procedure的执行情况：</p>
<p>SELECTTO_CHAR(sn.snap_time,'yyyy-mm-ddhh24:mi:ss')ASsnap_time,s.disk_reads, s.buffer_gets,s.elapsed_time/1000000ASelapsedtime FROM(SELECThash_value,sql_text,address,last_snap_id FROMSTATS$SQLTEXTWHEREpiece=0ANDsql_textLIKE'%&amp;sqltext_key%')t, (SELECTaddress,hash_value,snap_id,sql_text,disk_reads,executions, buffer_gets,rows_processed,elapsed_time FROMSTATS$SQL_SUMMARY)s,STATS$SNAPSHOTsn WHEREs.hash_value=t.hash_value ANDs.address=t.address ANDs.snap_id=t.last_snap_id ANDsn.snap_id=s.snap_id;比如，我们以perfstat用户执行该SQL，输入&#8220;to_comp&#8221;，可以观察到数据库里保存的有的to_comp存储过程的执行时间，我们发现，其执行时间，从优化前的几千秒，最后稳定在优化后的几十秒。</p>
<p>注：to_comp是整体调用执行一次所有网元的数据合并和汇总的procedure。</p>
<p>用于小区分析数据的Procedure的计算性能</p>
<p>使用上面的方法，我们一样可以知道，小区分析的procedure执行，从优化前的约几千秒，最后稳定在优化后的几十秒。</p>
<p>批量数据采集入库性能</p>
<p>使用bcp，能从以前约15分钟，减少到约4分钟。</p>
<p>2、一些单次、不常用的操作的语句执行性能</p>
<p>GUI上的性能数据查询，告警数据查询，响应时间都极快，几乎不再出现长时间等待响应的情况。</p>
<p>五，参考</p>
<p>常用的优化工具</p>
<p>statspack</p>
<p>sql*plus</p>
<p>TOAD</p>
<p>&nbsp;</p><img src ="http://www.blogjava.net/tbwshc/aggbug/382694.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbwshc/" target="_blank">chen11-1</a> 2012-07-10 11:10 <a href="http://www.blogjava.net/tbwshc/archive/2012/07/10/382694.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle容灾方案的选择 </title><link>http://www.blogjava.net/tbwshc/archive/2012/07/10/382693.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Tue, 10 Jul 2012 03:08:00 GMT</pubDate><guid>http://www.blogjava.net/tbwshc/archive/2012/07/10/382693.html</guid><wfw:comment>http://www.blogjava.net/tbwshc/comments/382693.html</wfw:comment><comments>http://www.blogjava.net/tbwshc/archive/2012/07/10/382693.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tbwshc/comments/commentRss/382693.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbwshc/services/trackbacks/382693.html</trackback:ping><description><![CDATA[容灾方案的选择<br />---- 容灾首先是一个概念，要认识到为什么做容灾，才能做好容灾。世界上没有卖后悔药的，当灾难降临了，如果没有行之有效的数据保护、数据恢复的容灾措施，带来不可预估的损失将是无法避免的。类似电信行业、金融行业，证券行业也是如此，动辄涉及数以百亿计的资金、涉及庞大的客户量，在系统数据的准确、业务的连续、关键业务的不中断等方面更是不容出现任何的差错。 <br />&nbsp;<br />----目前，业界具有容灾功能的常用解决方案主要包括以下几类：磁盘阵列复制技术，主要由一些磁盘阵列厂商提供，如EMC SRDF、IBM PPRC 、HP BusinessCopy、HDS TrueCopy、<a href="http://www.tbwshc.com"><span style="color: #000000">tb</span></a>等；存储卷复制技术，由一些卷管理软件厂商提供，如VERITAS VVR；数据库复制技术，由数据库厂商以及一些第三方厂商提供，如DSG RealSync，Quest SharePlex等；应用层复制技术，由各系统的应用厂商自己提供。 <br />&nbsp;<br />----磁盘阵列复制技术主要适用于数据中心级的海量数据复制，此技术用户必需采用支持该功能的磁盘阵列型号，而这些阵列大都为高端阵列，投资非常昂贵。并且，由于政府行业用户的带宽有限，而磁盘阵列复制技术对带宽的要求又相对很高，动辄需要上GB的带宽。此外，采用磁盘阵列复制技术，其目标端无法提供实时数据查询，由于目标端数据库在复制过程中不能被打开，难于实现交易与查询的分离，同时也造成大量投资浪费。因此，磁盘阵列复制技术无法满足某些行业集中交易系统的容灾需求，使得这些用户难以选择此种解决方案。 <br />&nbsp;<br />----存储卷复制技术主要适用于工作组级的数据复制，它对CPU资源占用高。同样由于目标端数据无法提供实时数据查询和对带宽的要求高，使得证券等行业用户也难以选择。 <br />&nbsp;<br />----而应用层复制技术只适合那些在应用中提供了该技术的应用，由于它的非标准化、开发和维护工作量大，使得其应用不成熟也不普遍。关键行业对数据的可靠性要求又非常之高，使得关键行业用户也不敢冒然选择此种复制技术。 <br />&nbsp;<br />----DSG RealSync属于数据库复制技术，它适用于从工作组级、企业级到数据中心级的复制需求，无论系统采用什么样的服务器平台、什么样的存储平台，只要是ORACLE系统之间的复制即可适用。采用DSG RealSync复制技术，其目标端数据库在复制过程中处于可用状态，帮助关键行业用户实现生产系统与查询统计报表系统的分离；其源端系统和目标端系统可以采用异构的操作系统平台、存储平台；支持选择性复制，即支持只复制指定的user、指定的Table、指定的行和列，从而节省存储空间，提高应用灵活性；支持1对多，多对1的复制结构，即：能够将多个数据库中的数据复制到一个数据库中，<a href="http://www.tbwshc.com/"><span style="color: #000000">tb</span></a>能够将一个数据库中的不同数据分发到不同的数据库中；也节约带宽和网络资源，其所需带宽一般在几Mbps,几十Mbps。 <br />&nbsp;<br />----随着用户容灾意识的逐渐增强，关键行业也提出了建设一套高效、可靠、投资回收比高的灾难备份系统的需求，以确保系统的数据安全和灾难发生时数据的快速恢复。&nbsp;&nbsp; <br />&nbsp;<img src ="http://www.blogjava.net/tbwshc/aggbug/382693.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbwshc/" target="_blank">chen11-1</a> 2012-07-10 11:08 <a href="http://www.blogjava.net/tbwshc/archive/2012/07/10/382693.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle Buys Finnish Open-Source Developer </title><link>http://www.blogjava.net/tbwshc/archive/2012/07/10/382692.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Tue, 10 Jul 2012 03:05:00 GMT</pubDate><guid>http://www.blogjava.net/tbwshc/archive/2012/07/10/382692.html</guid><wfw:comment>http://www.blogjava.net/tbwshc/comments/382692.html</wfw:comment><comments>http://www.blogjava.net/tbwshc/archive/2012/07/10/382692.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tbwshc/comments/commentRss/382692.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbwshc/services/trackbacks/382692.html</trackback:ping><description><![CDATA[<p>Oracle scooped up another small technology company on Friday, announcing its acquisition of Finnish open-source database technology developer Innobase. Financial terms of the deal were not disclosed.</p>
<p>Innobase, based in Helsinki, is the creator of InnoDB, an add-on storage engine for MySQL. InnoDB is distributed under the GNU GPL (General Public License) open-source license. The software is bundled with MySQL through a contractual agreemen<a href="http://www.tbwshc.com"><span style="color: #000000">tb</span></a> that comes up for renewal next year; Oracle said it expects to negotiate an extension of that contract. </p>
<p><br />"Oracle intends to continue developing the InnoDB technology and expand our commitment to open source software," Charles Rozwat, Oracle's executive vice president in charge of database and middleware technology, said in a prepared statement. "Oracle has already developed and contributed an open source clustered file system to Linux. We expect to make additional contributions in the future," he added.</p>
<p><br />Oracle, headquartered in Redwood Shores, California, has arranged around a dozen acquisitions in the past year, most of them significantly smaller than its blockbuster, multibillion-dollar PeopleSoft and Siebel Systems buys. Other recent purchases include supply-chain logistics software maker Global Logistics Technologies, retail optimization software developer ProfitLogic, database performance enhancement technology company TimesTen, and a majority stake in Indian banking software vendor i-flex Solutions. </p>
<p>&nbsp;</p><img src ="http://www.blogjava.net/tbwshc/aggbug/382692.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbwshc/" target="_blank">chen11-1</a> 2012-07-10 11:05 <a href="http://www.blogjava.net/tbwshc/archive/2012/07/10/382692.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle查询优化4大方面的主要途径</title><link>http://www.blogjava.net/tbwshc/archive/2012/06/30/381887.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Sat, 30 Jun 2012 15:02:00 GMT</pubDate><guid>http://www.blogjava.net/tbwshc/archive/2012/06/30/381887.html</guid><wfw:comment>http://www.blogjava.net/tbwshc/comments/381887.html</wfw:comment><comments>http://www.blogjava.net/tbwshc/archive/2012/06/30/381887.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tbwshc/comments/commentRss/381887.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbwshc/services/trackbacks/381887.html</trackback:ping><description><![CDATA[<p>数据库最基本的任务是存储、管理数据，而终端用户唯一能看到的数据库特性就是其性能：数据库以何速度处理某一指定查询的结果，并且将结果返回到用户所用的工具和应用程序。从大多数系统的应用实例来看，查询操作在各种数据库操作中所占据的比重最大、查阅新闻、 查看文件、 查询统计信息等。因此，数据库查询操作的效率是影响一个应用系统响应时间的关键因素。随着一个应用系统中数据的动态增长，数据量变大，数据库查询效率就会有所降低，应用系统的响应速度也随之减慢，尤其对于海量数据的管理和查询问题就更加突出，Oracle查询优化就显得尤为重要。&nbsp;&nbsp;&nbsp;</p>
<p>目前通用的数据库产品有很多种，其中Oracle数据库以其支持大数据库、多用户的高性能事务处理, 对业界各项工业标准的支持,完整的安全和完整性控制，支持分布式数据库利分布处理 具有可移植性、可兼容性和可连接性等突出优点倍受用户喜爱，应用较为广泛，在互联网数据库平台上处于领先地位、其Spatial技术能更加有效地管理地理信息，实现海量空间信息的存储和管理。本文结合Oracle数据库应用经验，从命中率提高、多表查询优化、大表查询优化和SQL优化等四个方面阐述Oracle查询优化的经验和方法。</p>
<p><strong>Oracle查询优化第一方面：Oracle数据查询<a href="http://www.tbwshc.com"><span style="color: #000000">tb</span></a>命中率的提高&nbsp;&nbsp;</strong>&nbsp; </p>
<p>&#8220;命中率（HITRATIO） 是指直接从内存中取得数据而不从磁盘中取得数据的比率，也就是查询请求的数据块已经在内存中次数的百分比&#8221;。影响命中率的因素有四种：字典表活动、临时段活动、回滚段活动、表扫描， 应用DBA可以对这四种因素进行分析，找出数据库命中率低的症结所在。</p>
<p>1)字典表活动&nbsp;&nbsp;</p>
<p>当一个SQL语句第一次到达Oracle内核时数据库对SQL语句进行分析，包含在查询中的数据字典对象被分解，产生SQL执行路径。如果SQL语句指向一个不在SGA中的对象??表或视图，Oracle执行SQL语句到数据典中查询有关对象的信息。数据块从数据字典表被读取到SGA的数据缓存中。由于每个数据字典都很小，因此，我们可缓存这些表以提高对这些表的命中率。但是由于数据字典表的数据块在SGA中占据空间，当增加全部的命中率时，它们会降低表数据块的可用空间， 所以若查询所需的时间字典信息已经在SGA缓存中，那么就没有必要递归调用。</p>
<p>2)临时段的活动&nbsp;&nbsp;&nbsp;</p>
<p>当用户执行一个需要排序的查询时，Oracle设法对内存中排序区内的所有行进行排序，排序区的大小由数据库的init.ora文件的数确定。如果排序区域不够大，数据库就会在排序操作期间开辟临时段。临时段会人为地降低OLTP(online transaction processing）应用命中率,也会降低查询进行排序的性能。如果能在内存中完成全部排序操作，就可以消除向临时段写数据的开销。所以应将SORT_AREA_SIZE设置得足够大，以避免对临时段的需要。这个参数的具体调整方法是:查询相关数据，以确定这个参数的调整。&nbsp;&nbsp; <br />select * from v$sysstat where name='sorts(disk)'or name='sorts(memory);</p>
<p>大部分排序是在内存中进行的，但还有小部分发生在临时段， 需要调整 值，查看init.ora文件的 SORT_AREA_SIZE值，参数为：SORT_AREA_SIZE＝65536;将其调整到SORT_AREA_SIZE＝131072、这个值调整后，重启ORACLE数据库即可生效。</p>
<p>3)回滚段的活动&nbsp;&nbsp;&nbsp;</p>
<p>回滚段活动分为回滚活动和回滚段头活动。对回滚段头块的访问会降低应用的命中率， 对OLTP系统命中率的影响最大。为确认是否因为回滚段影响了命中率，可以查看监控输出报表中的&#8220;数据块相容性读一重写记录应用&#8221; 的统计值，这些统计值是用来确定用户从回滚段中访问数据的发生次数。</p>
<p>4)表扫描&nbsp;&nbsp;&nbsp;</p>
<p>通过大扫描读得的块在数据块缓存中不会保持很长时间， 因此表扫描会降低命中率。为了避免不必要的全表扫描，首先是根据需要建立索引，合理的索引设计要建立人对各种查询的分析和预测上，笔者会在SQL优化中详细谈及；其次是将经常用到的表放在内存中，以降低磁盘读写次数。例如 Alter table your_table_name cathe。 </p><img src ="http://www.blogjava.net/tbwshc/aggbug/381887.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbwshc/" target="_blank">chen11-1</a> 2012-06-30 23:02 <a href="http://www.blogjava.net/tbwshc/archive/2012/06/30/381887.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle数据库索引的优点与缺点简介</title><link>http://www.blogjava.net/tbwshc/archive/2012/06/30/381885.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Sat, 30 Jun 2012 14:51:00 GMT</pubDate><guid>http://www.blogjava.net/tbwshc/archive/2012/06/30/381885.html</guid><wfw:comment>http://www.blogjava.net/tbwshc/comments/381885.html</wfw:comment><comments>http://www.blogjava.net/tbwshc/archive/2012/06/30/381885.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tbwshc/comments/commentRss/381885.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbwshc/services/trackbacks/381885.html</trackback:ping><description><![CDATA[<p>以下的文章主要介绍的是Oracle数据库索引的优点与缺点，我们大家都知道Oracle数据库的索引可以分为：聚集索引，非聚集索引，以及唯一索引。其优点主要是方便查询，其在相关的数据量大时排序更易查询。</p>
<p>缺点：查询时需要进行重新排序，减少了效率。物理Oracle数据库索引缺点 建立索引效率低，只能建一个。</p>
<p>为什么要创建Oracle数据库索引呢？这是因为，创建索引可以大大提高系统的性能。第一，通过创建唯一性索引，可以保证数据库表中每一行数据的唯一性。第二，可以大大加快数据的检索速度，这也是创建索引的最主要的原因。</p>
<p>第三，可以加速表和表之间的连接，特别是在实现数据的参考完整性方面特别有意义。第四，在使用分组和排序子句进行数据检索时，同样可以显着减少查询中分组和排序的时间。第五，通过使用索引，可以在查询的过程中，使用优化隐藏器，提高系统的性能。</p>
<p>也许会有人要问：增加索引有如此多的优点，为什么不对表中的每一个列创建一个索引呢？这种想法固然有其合理性，然而也有其片面性。虽然，<a href="http://www.tbwshc.com"><span style="color: #000000">tb</span></a>索引有许多优点，但是，为表中的每一个列都增加索引，是非常不明智的。这是因为，增加索引也有许多不利的一个方面。</p>
<p>第一，创建索引和维护索引要耗费时间，这种时间随着数据量的增加而增加。第二，索引需要占物理空间，除了数据表占数据空间之外，每一个索引还要占一定的物理空间，如果要建立聚簇索引，那么需要的空间就会更大。第三，当对表中的数据进行增加、删除和修改的时候，索引也要动态的维护，这样就降低了数据的维护速度。</p>
<p>索引是建立在数据库表中的某些列的上面。因此，在创建Oracle数据库索引的时候，应该仔细考虑在哪些列上可以创建索引，在哪些列上不能创建索引。</p>
<p>一般来说，应该在这些列上创建索引，例如：在经常需要搜索的列上，可以加快搜索的速度；在作为主键的列上，强制该列的唯一性和组织表中数据的排列结构；在经常用在连接的列上，这些列主要是一些外键，可以加快连接的速度；</p>
<p>在经常需要根据范围进行搜索的列上创建索引，因为索引已经排序，其指定的范围是连续的；在经常需要排序的列上创建索引，因为索引已经排序，这样查询可以利用索引的排序，加快排序查询时间；在经常使用在WHERE子句中的列上面创建索引，加快条件的判断速度。</p>
<p>同样，对于有些列不应该创建Oracle数据库索引。一般来说，不应该创建索引的的这些列具有下列特点：第一，对于那些在查询中很少使用或者参考的列不应该创建索引。这是因为，既然这些列很少使用到，因此有索引或者无索引，并不能提高查询速度。</p>
<p>相反，由于增加了索引，反而降低了系统的维护速度和增大了空间需求。第二，对于那些只有很少数据值的列也不应该增加索引。这是因为，由于这些列的取值很少，例如人事表的性别列，在查询的结果中，结果集的数据行占了表中数据行的很大比例，即需要在表中搜索的数据行的比例很大。</p>
<p>增加索引，并不能明显加快检索速度。第三，对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为，这些列的数据量要么相当大，要么取值很少。第四，当修改性能远远大于检索性能时，不应该创建索引。</p>
<p>这是因为，修改性能和检索性能是互相矛盾的。当增加索引时，会提高检索性能，但是会降低修改性能。当减少索引时，会提高修改性能，降低检索性能。因此，当修改性能远远大于检索性能时，不应该创建Oracle数据库索引。</p><img src ="http://www.blogjava.net/tbwshc/aggbug/381885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbwshc/" target="_blank">chen11-1</a> 2012-06-30 22:51 <a href="http://www.blogjava.net/tbwshc/archive/2012/06/30/381885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>主键冲突---一个表可以有两个主键的作用：---表中已有主键新增一个主键语句</title><link>http://www.blogjava.net/tbwshc/archive/2012/06/12/380595.html</link><dc:creator>chen11-1</dc:creator><author>chen11-1</author><pubDate>Tue, 12 Jun 2012 05:22:00 GMT</pubDate><guid>http://www.blogjava.net/tbwshc/archive/2012/06/12/380595.html</guid><wfw:comment>http://www.blogjava.net/tbwshc/comments/380595.html</wfw:comment><comments>http://www.blogjava.net/tbwshc/archive/2012/06/12/380595.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/tbwshc/comments/commentRss/380595.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/tbwshc/services/trackbacks/380595.html</trackback:ping><description><![CDATA[<p><font face="Verdana">一个表可以有两个主键的作用：<br /><br />primary key for table xs ' is not unique ：主键冲突</font></p>
<p><font face="Verdana">首先,那两个字段都变成了主键,这话是不确切的.严格的说因为是&nbsp;&nbsp; 你选择的那两个字段共同构成了主键,也就是 "學生編號+課程編號 "的组合是一个主键,这个组合不能够重复,不能够同时为空,&nbsp;&nbsp; 而不是 "學生編號 "&nbsp;&nbsp;&nbsp;&nbsp; "課程編號 "&nbsp;&nbsp; 各为一个主键,不信你可以查看<a href="http://www.tbwshc.com"><span style="color: #000000">tb</span></a>系统表.<br /><br /><br />表中已有主键新增一个主键：语句<br />例如：<br />alter table AC04_blbc DROP PRIMARY KEY;<br />alter table AC04_blbc modify sbxz VARCHAR(8) NOT NULL,add constraint PK_AC04_blbc primary key (AAE002, AAC001, AAE041,sbxz);</font></p><img src ="http://www.blogjava.net/tbwshc/aggbug/380595.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/tbwshc/" target="_blank">chen11-1</a> 2012-06-12 13:22 <a href="http://www.blogjava.net/tbwshc/archive/2012/06/12/380595.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>