<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>irockman&#039;s dream house &#187; + 程 序 +</title>
	<atom:link href="http://www.irockman.cn/category/program/feed" rel="self" type="application/rss+xml" />
	<link>http://www.irockman.cn</link>
	<description>关注自己,关注生活</description>
	<lastBuildDate>Mon, 21 Jun 2010 16:59:56 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>[转]oracle索引整理</title>
		<link>http://www.irockman.cn/2010/03/08/198.html</link>
		<comments>http://www.irockman.cn/2010/03/08/198.html#comments</comments>
		<pubDate>Mon, 08 Mar 2010 14:27:51 +0000</pubDate>
		<dc:creator>irockman</dc:creator>
				<category><![CDATA[+ 程 序 +]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[索引]]></category>

		<guid isPermaLink="false">http://www.irockman.cn/?p=198</guid>
		<description><![CDATA[一，
oracle的索引陷阱
一个表中有几百万条数据，对某个字段加了索引，但是查询时性能并没有什么提高，这主要可能是oracle的索引限制造成的。
oracle的索引有一些索引限制，在这些索引限制... ]]></description>
			<content:encoded><![CDATA[<p style="padding: 0px; margin: 0px;">一，</p>
<p style="padding: 0px; margin: 0px;"><span style="background-color: #ffff00;">oracle</span>的索引陷阱<br />
一个表中有几百万条数据，对某个字段加了索引，但是查询时性能并没有什么提高，这主要可能是<span style="background-color: #ffff00;">oracle</span>的索引限制造成的。<br />
<span style="background-color: #ffff00;">oracle</span>的索引有一些索引限制，在这些索引限制发生的情况下，即使已经加了索引，<span style="background-color: #ffff00;">oracle</span>还是会执行一次全表扫描，查询的性能不会比不加索引有所提高，反而可能由于数据库维护索引的系统开销造成性能更差。<br />
下面是一些常见的索引限制问题。</p>
<p>1、使用不等于操作符(&lt;&gt;, !=)<br />
下面这种情况，即使在列dept_id有一个索引，查询语句仍然执行一次全表扫描<br />
select * from dept where staff_num &lt;&gt; 1000;<br />
但是开发中的确需要这样的查询，难道没有解决问题的办法了吗？<br />
有！<br />
通过把用 or 语法替代不等号进行查询，就可以使用索引，以避免全表扫描：上面的语句改成下面这样的，就可以使用索引了。<br />
select * from dept shere staff_num &lt; 1000 or dept_id &gt; 1000;<br />
<span id="more-198"></span><br />
2、使用 is null 或 is not null<br />
使用 is null 或is nuo null也会限制索引的使用，因为数据库并没有定义null值。如果被索引的列中有很多null，就不会使用这个索引（除非索引是一个位图索引，关于位图索引，会在以后的blog文章里做详细解释）。在sql语句中使用null会造成很多麻烦。<br />
解决这个问题的办法就是：建表时把需要索引的列定义为非空(not null)</p>
<p>3、使用函数<br />
如果没有使用基于函数的索引，那么where子句中对存在索引的列使用函数时，会使优化器忽略掉这些索引。下面的查询就不会使用索引：<br />
select * from staff where trunc(birthdate) = &#8216;01-MAY-82&#8242;;<br />
但是把函数应用在条件上，索引是可以生效的，把上面的语句改成下面的语句，就可以通过索引进行查找。<br />
select * from staff where birthdate &lt; (to_date(&#8217;01-MAY-82&#8242;) + 0.9999);</p>
<p>4、比较不匹配的数据类型<br />
比较不匹配的数据类型也是难于发现的性能问题之一。<br />
下面的例子中，dept_id是一个varchar2型的字段，在这个字段上有索引，但是下面的语句会执行全表扫描。<br />
select * from dept where dept_id = 900198;<br />
这是因为<span style="background-color: #ffff00;">oracle</span>会自动把where子句转换成to_number(dept_id)=900198，就是3所说的情况，这样就限制了索引的使用。<br />
把SQL语句改为如下形式就可以使用索引<br />
select * from dept where dept_id = &#8216;900198&#8242;;</p>
<p style="padding: 0px; margin: 0px;">
<p style="padding: 0px; margin: 0px;">
<p style="padding: 0px; margin: 0px;">二，</p>
<p style="padding: 0px; margin: 0px;">各种索引使用场合及建议</p>
<p style="padding: 0px; margin: 0px;">
<p style="padding: 0px; margin: 0px;">（1）B*Tree索引。</p>
<p style="padding: 0px; margin: 0px;">常规索引，多用于oltp系统，快速定位行，应建立于高cardinality列（即列的唯一值除以行数为一个很大的值，存在很少的相同值）。</p>
<p style="padding: 0px; margin: 0px;">Create index indexname on tablename(columnname[columnname...])</p>
<p style="padding: 0px; margin: 0px;">（2）反向索引。</p>
<p style="padding: 0px; margin: 0px;">B*Tree的衍生产物，应用于特殊场合，在ops环境加序列增加的列上建立，不适合做区域扫描。</p>
<p style="padding: 0px; margin: 0px;">Create index indexname on tablename(columnname[columnname...]) reverse</p>
<p style="padding: 0px; margin: 0px;">（3）降序索引。</p>
<p style="padding: 0px; margin: 0px;">B*Tree的衍生产物，应用于有降序排列的搜索语句中，索引中储存了降序排列的索引码，提供了快速的降序搜索。</p>
<p style="padding: 0px; margin: 0px;">Create index indexname on tablename(columnname DESC[columnname...])</p>
<p style="padding: 0px; margin: 0px;">（4）位图索引。</p>
<p style="padding: 0px; margin: 0px;">位图方式管理的索引，适用于OLAP（在线分析）和DSS（决策处理）系统，应建立于低cardinality列，<br />
适合集中读取，不适合插入和修改，提供比B*Tree索引更节省的空间。</p>
<p style="padding: 0px; margin: 0px;">Create BITMAP index indexname on tablename(columnname[columnname...])</p>
<p style="padding: 0px; margin: 0px;">在实际应用中，如果某个字段的值需要频繁更新，那么就不适合在它上面创建位图索引。<br />
在位图索引中，如果你更新或插入其中一条数值为N的记录，<br />
那么相应表中数值为N的记录（可能成百上千条）全部被<span style="background-color: #ffff00;">Oracle</span>锁定，<br />
这就意味着其它用户不能同时更新这些数值为N的记录，其它用户必须要等第一个用户提交后，<br />
才能获得锁，更新或插入数据，bitmap index它主要用于决策支持系统或静态数据。</p>
<p style="padding: 0px; margin: 0px;">（5）函数索引。</p>
<p style="padding: 0px; margin: 0px;">B*Tree的衍生产物，应用于查询语句条件列上包含函数的情况，<br />
索引中储存了经过函数计算的索引码值。可以在不修改应用程序的基础上能提高查询效率。</p>
<p style="padding: 0px; margin: 0px;">索引创建策略<br />
1.导入数据后再创建索引<br />
2.不需要为很小的表创建索引<br />
3.对于取值范围很小的字段（比如性别字段）应当建立位图索引<br />
4.限制表中的索引的数目<br />
5.为索引设置合适的PCTFREE值<br />
6.存储索引的表空间最好单独设定</p>
<p style="padding: 0px; margin: 0px;">唯一索引和不唯一索引都只是针对B树索引而言.<br />
<span style="background-color: #ffff00;">Oracle</span>最多允许包含32个字段的复合索引<br />
由此估计出一个查询如果使用某个索引会需要读入的数据块块数。<br />
需要读入的数据块越多，则 cost 越大，<span style="background-color: #ffff00;">Oracle</span> 也就越有可能不选择使用 index</p>
<p style="padding: 0px; margin: 0px;">
<p style="padding: 0px; margin: 0px;">三，</p>
<p style="padding: 0px; margin: 0px;">能用唯一索引，一定用唯一索引<br />
能加非空，就加非空约束<br />
一定要统计表的信息，索引的信息，柱状图的信息。<br />
联合索引的顺序不同，影响索引的选择，尽量将值少的放在前面<br />
只有做到以上四点，数据库才会正确的选择执行计划。</p>
<p style="padding: 0px; margin: 0px;">
<p style="padding: 0px; margin: 0px;">原文地址：<a href="http://liusuper.javaeye.com/blog/219013">http://liusuper.javaeye.com/blog/219013</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.irockman.cn/2010/03/08/198.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>测试syntaxhighlighte</title>
		<link>http://www.irockman.cn/2009/11/16/65.html</link>
		<comments>http://www.irockman.cn/2009/11/16/65.html#comments</comments>
		<pubDate>Mon, 16 Nov 2009 12:47:20 +0000</pubDate>
		<dc:creator>irockman</dc:creator>
				<category><![CDATA[+ 程 序 +]]></category>
		<category><![CDATA[测试]]></category>

		<guid isPermaLink="false">http://www.irockman.cn/?p=65</guid>
		<description><![CDATA[
.breadcrumb a:hover {
text-decoration: underline;
}
.bread_home {
text-indent: -99999em;
}
.bread_home {
margin-right: 6px !important;
}
.bread_home a, .bread_home a:visited {
display: block;
background: url(images/bread_home.png) no-repeat;
height: 24p... ]]></description>
			<content:encoded><![CDATA[<pre class="brush: css;">
.breadcrumb a:hover {
text-decoration: underline;
}
.bread_home {
text-indent: -99999em;
}
.bread_home {
margin-right: 6px !important;
}
.bread_home a, .bread_home a:visited {
display: block;
background: url(images/bread_home.png) no-repeat;
height: 24px;
width: 24px;
}
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.irockman.cn/2009/11/16/65.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
