﻿<?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-VincentChen‘s Blog-文章分类-Database</title><link>http://www.blogjava.net/Vencent/category/7760.html</link><description>&lt;font color='orange'&gt;本博客仅为收集所用。在此对原作者表示感谢。&lt;/font&gt;
&lt;div class="custom"&gt;
&lt;script type="text/javascript"&gt;&lt;!--
google_ad_client = "pub-6256612161572960";
google_ad_width = 728;
google_ad_height = 90;
google_ad_format = "728x90_as";
google_ad_type = "text";
google_ad_channel ="";
google_page_url = document.location;
google_color_border = ["FFDDAA","FFDDAA","FFDDAA","FFDDAA"];
google_color_bg = ["FFDDAA","FFDDAA","FFDDAA","FFDDAA"];
google_color_link = ["FFDDAA","0033FF","00008B","99CC33"];
google_color_url = ["999999","0033FF","00008B","FFCC00"];
google_color_text = ["0033FF","AA9999","0033FF","AA9999"];
//--&gt;&lt;/script&gt;
&lt;script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;&lt;/div&gt;</description><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 06:49:24 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 06:49:24 GMT</pubDate><ttl>60</ttl><item><title>Oracle中按拼音排序</title><link>http://www.blogjava.net/Vencent/articles/57576.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Mon, 10 Jul 2006 16:00:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/57576.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/57576.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/57576.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/57576.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/57576.html</trackback:ping><description><![CDATA[
			nlssort(columnName,'NLS_SORT=SCHINESE_PINYIN_M')<img src ="http://www.blogjava.net/Vencent/aggbug/57576.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-07-11 00:00 <a href="http://www.blogjava.net/Vencent/articles/57576.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mysql 集群简介和配置</title><link>http://www.blogjava.net/Vencent/articles/55644.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Wed, 28 Jun 2006 15:45:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/55644.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/55644.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/55644.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/55644.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/55644.html</trackback:ping><description><![CDATA[
		<span style="" lang="EN">
				<span style="">1．<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">  </span></span>
		</span>
		<span style="font-family: 宋体;">先了解一下你是否应该用</span>
		<span style="" lang="EN">mysql</span>
		<span style="font-family: 宋体;">集群。</span>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;">
				<span style="" lang="EN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">减少数据中心结点压力和大数据量处理，采用把</span>
				<span style="" lang="EN">mysql</span>
				<span style="font-family: 宋体;">分布，一个或多个</span>
				<span style="" lang="EN">application </span>
				<span style="font-family: 宋体;">对应一个</span>
				<span style="" lang="EN">mysql</span>
				<span style="font-family: 宋体;">数据库。把几个</span>
				<span style="" lang="EN">mysql</span>
				<span style="font-family: 宋体;">数据库公用的数据做出共享数据，例如购物车，用户对象等等，存在数据结点里面。其他不共享的数据还维持在各自分布的</span>
				<span style="" lang="EN">mysql</span>
				<span style="font-family: 宋体;">数据库本身中。</span>
				<span style="" lang="EN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<o:p> </o:p>
				</span>
		</p>
		<span style="" lang="EN">
				<v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">
						<v:stroke joinstyle="miter">
						</v:stroke>
						<v:formulas>
								<v:f eqn="if lineDrawn pixelLineWidth 0">
								</v:f>
								<v:f eqn="sum @0 1 0">
								</v:f>
								<v:f eqn="sum 0 0 @1">
								</v:f>
								<v:f eqn="prod @2 1 2">
								</v:f>
								<v:f eqn="prod @3 21600 pixelWidth">
								</v:f>
								<v:f eqn="prod @3 21600 pixelHeight">
								</v:f>
								<v:f eqn="sum @0 0 1">
								</v:f>
								<v:f eqn="prod @6 1 2">
								</v:f>
								<v:f eqn="prod @7 21600 pixelWidth">
								</v:f>
								<v:f eqn="sum @8 21600 0">
								</v:f>
								<v:f eqn="prod @7 21600 pixelHeight">
								</v:f>
								<v:f eqn="sum @10 21600 0">
								</v:f>
						</v:formulas>
						<v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f">
						</v:path>
						<o:lock aspectratio="t" v:ext="edit">
						</o:lock>
				</v:shapetype>
				<div class="mediaobject">
						<img alt="MySQL Cluster Components" src="http://dev.mysql.com/doc/refman/5.0/en/images/cluster-components-1.png" />
				</div>
				<o:p>
				</o:p>
		</span>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;">
				<span style="" lang="EN">
						<span style="">2．<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">  </span></span>
				</span>
				<span style="font-family: 宋体;">集群</span>
				<span style="" lang="EN">Mysql</span>
				<span style="font-family: 宋体;">中名称概念</span>
				<span style="" lang="EN">.(</span>
				<span style="font-family: 宋体;">如上图</span>
				<span style="" lang="EN">)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;">
				<span style="" lang="EN">1</span>
				<span style="font-family: 宋体;">）</span>
				<span style="" lang="EN">Sql</span>
				<span style="font-family: 宋体;">结点（</span>
				<span style="" lang="EN">SQL node--</span>
				<span style="font-family: 宋体;">上图对应为</span>
				<span style="" lang="EN">mysqld</span>
				<span style="font-family: 宋体;">）</span>
				<span style="" lang="EN">:</span>
				<span style="font-family: 宋体;">分布式数据库。包括自身数据和查询中心结点数据</span>
				<span style="" lang="EN">.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;">
				<span style="" lang="EN">2</span>
				<span style="font-family: 宋体;">）数据结点</span>
				<span style="" lang="EN">(Data node -- ndbd):</span>
				<span style="font-family: 宋体;">集群共享数据</span>
				<span style="" lang="EN">(</span>
				<span style="font-family: 宋体;">内存中</span>
				<span style="" lang="EN">).<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;">
				<span style="" lang="EN">3</span>
				<span style="font-family: 宋体;">）管理服务器</span>
				<span style="" lang="EN">(Management Server – ndb_mgmd): </span>
				<span style="font-family: 宋体;">集群管理</span>
				<span style="" lang="EN">SQL node,Data node.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt;">
				<span style="" lang="EN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">3</span>
				<span style="font-family: 宋体;">．配置</span>
				<span style="" lang="EN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<span style="">       </span>mysql-max </span>
				<span style="font-family: 宋体;">版本，当然现在</span>
				<span style="" lang="EN">mysql</span>
				<span style="font-family: 宋体;">集群系统</span>
				<span style="" lang="EN">windonws</span>
				<span style="font-family: 宋体;">平台上面不被支持</span>
				<span style="" lang="EN">.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<span style="">       </span>
				</span>
				<span style="font-family: 宋体;">安装</span>
				<span style="" lang="EN">mysql</span>
				<span style="font-family: 宋体;">就不多说了，网上一打堆，简明扼要。</span>
				<span style="" lang="EN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<span style="">       </span>A:192.168.1.251 – Data node </span>
				<span style="font-family: 宋体;">和</span>
				<span style="">
						<span lang="EN">Management Server.<o:p></o:p></span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<span style="">       </span>B:192.168.1.254 – SQL node.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">当然，你也可以让一个机器同时为</span>
				<span style="" lang="EN"> 3</span>
				<span style="font-family: 宋体;">者。</span>
				<span style="" lang="EN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">A,B my.inf </span>
				<span style="font-family: 宋体;">加上：</span>
				<span style="">
						<span lang="EN">
								<o:p>
								</o:p>
						</span>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<span style="">       </span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">[MYSQLD]<span style="">                        </span><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">ndbcluster<span style="">                      </span># run NDB engine<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">ndb-connectstring=192.168.1.251<span style="">  </span># location of MGM node<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN"># Options for ndbd process:<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">[MYSQL_CLUSTER]<span style="">                 </span><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">ndb-connectstring=192.168.1.251<span style="">  </span># location of MGM node<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">A: /var/lib/mysql-cluster/config.ini<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">[NDBD DEFAULT]<span style="">    </span><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">NoOfReplicas=1<span style="">    </span># Number of replicas<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">DataMemory=<st1:chmetcnv w:st="on" unitname="m" sourcevalue="80" hasspace="False" negative="False" numbertype="1" tcsc="0">80M</st1:chmetcnv><span style="">    </span># How much memory to allocate for data storage<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">IndexMemory=<st1:chmetcnv w:st="on" unitname="m" sourcevalue="18" hasspace="False" negative="False" numbertype="1" tcsc="0">18M</st1:chmetcnv><span style="">   </span># How much memory to allocate for index storage<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<span style="">                  </span># For DataMemory and IndexMemory, we have used the<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<span style="">                  </span># default values. Since the "world" database takes up<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<span style="">                  </span># only about 500KB, this should be more than enough for<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<span style="">                  </span># this example Cluster setup.<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN"># TCP/IP options:<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">[TCP DEFAULT]<span style="">     </span><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">portnumber=2202<span style="">   </span># This the default; however, you can use any<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<span style="">                </span>
						<span style="">  </span># port that is free for all the hosts in cluster<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<span style="">                  </span># Note: It is recommended beginning with MySQL 5.0 that<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<span style="">                  </span># you do not specify the portnumber at all and simply allow<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<span style="">                  </span># the default value to be used instead<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN"># Management process options:<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">[NDB_MGMD]<span style="">                      </span><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">hostname=192.168.1.251<span style="">           </span># Hostname or IP address of MGM node<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">datadir=/var/lib/mysql-cluster<span style="">  </span># Directory for MGM node logfiles<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN"># Options for data node "A":<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">[NDBD]<span style="">                  </span><span style="">        </span><o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<span style="">                                </span># (one [NDBD] section per data node)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">hostname=192.168.1.251<span style="">           </span># Hostname or IP address<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">datadir=/usr/local/mysql/data<span style="">   </span># Directory for this data node's datafiles<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN"># SQL node options:<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">[MYSQLD]<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">hostname=192.168.1.254<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">#[MYSQLD] #</span>
				<span style="font-family: 宋体;">这个相当于</span>
				<span style="" lang="EN">192.168.1.251<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt 18pt; text-indent: -18pt;">
				<span style="" lang="EN">
						<span style="">4.<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">       </span></span>
				</span>
				<span style="font-family: 宋体;">启动测试</span>
				<span style="" lang="EN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<o:p> </o:p>
				</span>
		</p>
		<p style="margin-left: 36pt; text-indent: -18pt;">
				<span style="font-size: 10pt; font-family: Symbol;" lang="EN">
						<span style="">·<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span>
				</span>
				<span style="">
						<font face="宋体">在管理服务器上面<span lang="EN">(</span>这里是<code><span lang="EN">192.168.1.251</span></code><span lang="EN">): <o:p></o:p></span></font>
				</span>
		</p>
		<pre style="margin-left: 36pt; text-indent: -18pt;">
				<span style="font-size: 10pt; font-family: Symbol;" lang="EN">
						<br />
						<span style="">·<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">                </span></span>
						<br />
				</span>
				<br />
				<span style="" lang="EN">
						<br />
						<font face="宋体">shell&gt; <code><b>ndb_mgmd -f /var/lib/mysql-cluster/config.ini</b></code><o:p></o:p></font>
						<br />
				</span>
				<br />
		</pre>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<o:p> </o:p>
				</span>
		</p>
		<p style="margin-left: 36pt; text-indent: -18pt;">
				<span style="font-size: 10pt; font-family: Symbol;" lang="EN">
						<span style="">·<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span>
				</span>
				<span style="">
						<font face="宋体">在数据结点服务器上面<span lang="EN">(</span>依然是<code><span lang="EN">192.168.1.251</span></code><span lang="EN"> and more): <o:p></o:p></span></font>
				</span>
		</p>
		<pre style="margin-left: 36pt; text-indent: -18pt;">
				<span style="font-size: 10pt; font-family: Symbol;" lang="EN">
						<br />
						<span style="">·<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">                </span></span>
						<br />
				</span>
				<br />
				<font face="宋体">
						<br />
						<span style="" lang="EN">shell&gt; <code><b>ndbd </b>--initial (</code></span>
						<br />
						<code>
								<br />
								<span style="">第一次时加 <span lang="EN">--initial </span>参数<span lang="EN">)</span></span>
								<br />
						</code>
						<br />
						<span style="" lang="EN">
								<br />
								<o:p>
										<br />
								</o:p>
								<br />
						</span>
						<br />
				</font>
				<br />
		</pre>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<o:p> </o:p>
				</span>
		</p>
		<p style="margin-left: 36pt; text-indent: -18pt;">
				<span style="font-size: 10pt; font-family: Symbol;" lang="EN">
						<span style="">·<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">         </span></span>
				</span>
				<font face="宋体">
						<span style="" lang="EN">SQL</span>
						<span style="">结点服务器上面<span lang="EN">(<code>192.168.1.254</code>): <o:p></o:p></span></span>
				</font>
		</p>
		<pre style="margin-left: 36pt; text-indent: -18pt;">
				<span style="font-size: 10pt; font-family: Symbol;" lang="EN">
						<br />
						<span style="">·<span style="font-family: 'Times New Roman'; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">                </span></span>
						<br />
				</span>
				<br />
				<span style="" lang="EN">
						<br />
						<font face="宋体">shell&gt; <code><b>mysqld &amp;</b></code><o:p></o:p></font>
						<br />
				</span>
				<br />
		</pre>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">在</span>
				<span style="" lang="EN">251</span>
				<span style="font-family: 宋体;">上面察看</span>
				<span style="" lang="EN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">./ndb_mgm<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">-- NDB Cluster -- Management Client --<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">ndb_mgm&gt; show<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">Connected to Management Server at: 192.168.1.251:1186<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">Cluster Configuration<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">---------------------<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">[ndbd(NDB)]<span style="">     </span>1 node(s)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">id=2<span style="">    </span>@192.168.1.251<span style="">  </span>(Version: <st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">5.0.22</st1:chsdate>, Nodegroup: 0, Master)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<span style=""> </span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">[ndb_mgmd(MGM)] 1 node(s)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">id=1<span style="">    </span>@192.168.1.251<span style="">  </span>(Version: <st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">5.0.22</st1:chsdate>)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<span style=""> </span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">[mysqld(API)]<span style="">   </span>1 node(s)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">id=3<span style="">    </span>@192.168.1.254<span style="">  </span>(Version: <st1:chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899">5.0.22</st1:chsdate>)<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">
						<o:p> </o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">ok<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="font-family: 宋体;">关闭集群：</span>
				<span style="" lang="EN">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<span style="" lang="EN">shell&gt; </span>
				<code>
						<b>
								<span style="font-size: 12pt;" lang="EN">
										<font face="宋体">ndb_mgm -e shutdown<o:p></o:p></font>
								</span>
						</b>
				</code>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<code>
						<b>
								<span style="font-size: 12pt;" lang="EN">
										<o:p>
												<font face="宋体"> </font>
										</o:p>
								</span>
						</b>
				</code>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<code>
						<b>
								<span style="font-size: 12pt;" lang="EN">
										<o:p>
												<font face="宋体"> </font>
										</o:p>
								</span>
						</b>
				</code>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<font face="宋体">
						<code>
								<span style="font-size: 12pt;" lang="EN">5</span>
						</code>
						<code>
								<span style="font-size: 12pt;">．基本的集群说明<span lang="EN"><o:p></o:p></span></span>
						</code>
				</font>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 21pt;">
				<font face="宋体">
						<code>
								<span style="font-size: 12pt;" lang="EN">1</span>
						</code>
						<code>
								<span style="font-size: 12pt;">）在<span lang="EN">mysql </span>集群中<span lang="EN">.</span>当<span lang="EN">table</span>引擎为<span lang="EN">NDBCLUSTER</span>时才做集群，其他非<span lang="EN">NDBCLUSTER</span>表和一般<span lang="EN">mysql</span>数据库表一样，不会共享数据<span lang="EN">. NDBCLUSTER </span>表数据存储在<span lang="EN">Data node</span>服务器<b>内存中</b>，<span lang="EN">Data Node</span>可以为<span lang="EN">1</span>台或多台服务器，它们之间存放共享数据。<span lang="EN">Data Node</span>服务器可以分组数据<span lang="EN">copy</span>。<span lang="EN"><o:p></o:p></span></span>
						</code>
				</font>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<code>
						<span style="font-size: 12pt;">
								<font face="宋体">例如：<span lang="EN">2,3,4,5 </span>为四台<span lang="EN">Data Node</span>服务器<span lang="EN">ID. 2,3</span>为组<span lang="EN">0</span>。<span lang="EN"><span style="">  </span>4</span>，<span lang="EN">5</span>为组<span lang="EN">1</span>。<span lang="EN"><span style="">  </span>2</span>，<span lang="EN">3维持</span>数据相同，<span lang="EN"> 4</span>，<span lang="EN">5维持</span>数据相同。 组<span lang="EN">0</span>和组<span lang="EN">1维持</span>数据不同。<span lang="EN"><o:p></o:p></span></font>
						</span>
				</code>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<font face="宋体">
						<code>
								<span style="font-size: 12pt;" lang="EN">
										<span style="">    </span>2</span>
						</code>
						<code>
								<span style="font-size: 12pt;">）<span lang="EN"> sql node </span>服务器中，非<span lang="EN">NDBCLUSTER</span>数据存在本身数据库中，<span lang="EN">table</span>引擎为<span lang="EN">NDBCLUSTER</span>时，数据存储在<span lang="EN">Data Node </span>中。当查询<span lang="EN">NDBCLUSTER</span>表时，它会从<span lang="EN">Data node</span>集群中提起数据<span lang="EN">.<o:p></o:p></span></span>
						</code>
				</font>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<code>
						<span style="font-size: 12pt;" lang="EN">
								<font face="宋体">
										<span style="">    </span>3)Manager server<o:p></o:p></font>
						</span>
				</code>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<font face="宋体">
						<code>
								<span style="font-size: 12pt;" lang="EN">
										<span style="">    </span>
								</span>
						</code>
						<code>
								<span style="font-size: 12pt;">管理<span lang="EN">SQl node </span>和<span lang="EN">Data node </span>状态。<span lang="EN"><o:p></o:p></span></span>
						</code>
				</font>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<code>
						<span style="font-size: 12pt;" lang="EN">
								<o:p>
										<font face="宋体"> </font>
								</o:p>
						</span>
				</code>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<code>
						<span style="font-size: 12pt;" lang="EN">
								<o:p>
										<font face="宋体"> </font>
								</o:p>
						</span>
				</code>
		</p>
		<p class="MsoNormal" style="margin: 0cm 0cm 0pt;">
				<font face="宋体">
						<code>
								<span style="font-size: 12pt;" lang="EN">6 </span>
						</code>
						<code>
								<span style="font-size: 12pt;">深入了解</span>
						</code>
						<code>
								<span style="font-family: 'Times New Roman';" lang="EN">
										<o:p>
										</o:p>
								</span>
						</code>
				</font>
		</p>
		<span style="" lang="EN">http://dev.mysql.com/doc/refman/5.0/en/ndbcluster.html</span>
<img src ="http://www.blogjava.net/Vencent/aggbug/55644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-06-28 23:45 <a href="http://www.blogjava.net/Vencent/articles/55644.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle管理及常用基础脚本</title><link>http://www.blogjava.net/Vencent/articles/44204.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Sun, 30 Apr 2006 07:28:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/44204.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/44204.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/44204.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/44204.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/44204.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1								性能监控																																		1.				检测数据库中的事件和等待																												 														       SELECT event, total_waits, total_timeouts...&nbsp;&nbsp;<a href='http://www.blogjava.net/Vencent/articles/44204.html'>阅读全文</a><img src ="http://www.blogjava.net/Vencent/aggbug/44204.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-04-30 15:28 <a href="http://www.blogjava.net/Vencent/articles/44204.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle database link </title><link>http://www.blogjava.net/Vencent/articles/43150.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Tue, 25 Apr 2006 15:27:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/43150.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/43150.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/43150.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/43150.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/43150.html</trackback:ping><description><![CDATA[在<font face="System"><font color="#e46b52">tnsnames.ora</font></font>下建一条记录<br /><table border="0" cellpadding="0" cellspacing="0" width="582"><tbody><tr><td width="265"><strong><font color="#dd776f">链接字符串的设置</font></strong></td><td width="317"><p align="center"><font color="#dd776f" size="3"><strong>说       明</strong></font></p></td></tr><tr><td style="border-left: medium none; border-right: thin ridge rgb(0, 128, 0);" width="265"><font face="System" size="3">tobeijing=(description=</font></td><td align="center" width="317"><font face="System" size="3">database link名称：tobeijing</font></td></tr><tr><td style="border-left: medium none; border-right: thin ridge rgb(0, 128, 0);" width="265"><font face="System" size="3">(address=(protocol=tcp)</font></td><td align="center" width="317"><font face="System" size="3">采用tcp/ip协议</font></td></tr><tr><td style="border-left: medium none; border-right: thin ridge rgb(0, 128, 0);" width="265"><font face="System" size="3">(host=www.bj.col.com.cn)</font></td><td align="center" width="317"><font face="System" size="3">欲链接主机名称或IP地址</font></td></tr><tr><td style="border-left: medium none; border-right: thin ridge rgb(0, 128, 0);" width="265"><font face="System" size="3">(port=1521))</font></td><td align="center" width="317"><font face="System" size="3">网络端口1521 </font></td></tr><tr><td style="border-left: medium none; border-right: thin ridge rgb(0, 128, 0);" width="265"><font face="System" size="3">(connect_data=(sid=oracle7)))</font></td><td align="center" width="317"><font face="System" size="3">安装ORACLE采用的sid</font></td></tr></tbody></table><br /><font face="System" size="3">1.Create DB Link:<br />
CREATE [PUBLIC] DATABASE LINK &lt;link_name&gt;<br />
CONNECT TO &lt;user_name&gt;<br />
IDENTIFIED BY &lt;password&gt;<br />
USING '&lt;service_name&gt;';//这里为<font face="System" size="3">tobeijing</font><br />
2.Drop DB Link:<br />
DROP [PUBLIC] DATABASE LINK &lt;link_name&gt;;<br />
3.Query DB Link:<br />
SELECT db_link, owner, host, username<br />
FROM dba_db_links<br />
ORDER BY db_link;<br />
4.Use DB Link for SELECT:<br />
SELECT * FROM &lt;schema_name&gt;.&lt;table_name&gt;@&lt;link_name&gt;;</font><img src ="http://www.blogjava.net/Vencent/aggbug/43150.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-04-25 23:27 <a href="http://www.blogjava.net/Vencent/articles/43150.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle内存分配</title><link>http://www.blogjava.net/Vencent/articles/41000.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Thu, 13 Apr 2006 15:56:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/41000.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/41000.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/41000.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/41000.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/41000.html</trackback:ping><description><![CDATA[怎样改为：使用 300M 内存，100M 共享池，200M数据池？<br />db_name = orcl<br />db_files = 1020<br />control_files = ("C:\orant\database\ctl1orcl.ora", "C:\orant\database\ctl2orcl.ora")<br />db_file_multiblock_read_count = 16<br />db_block_buffers = 1000<br />shared_pool_size = 40000000<br />log_checkpoint_interval = 8000<br />processes = 100<br />dml_locks = 200<br />log_buffer = 32768<br />sequence_cache_entries = 30<br />sequence_cache_hash_buckets = 23<br />#audit_trail = true<br />#timed_statistics = true<br />background_dump_dest = C:\orant\rdbms80\trace<br />user_dump_dest = C:\orant\rdbms80\trace<br />db_block_size =8192<br />compatible = 8.0.5.0.0<br />sort_area_size = 65536<br />log_checkpoint_timeout = 0<br />remote_login_passwordfile = shared<br />max_dump_file_size = 10240<br /><br /><br />调整这两项就行了:<br />db_block_buffers = 1000<br />shared_pool_size = 40000000<br /><br /><br />上个月听人讲过一下，似乎是这样的：<br />共享池是shared_pool_size/1024/1024=100M<br />数据池好象是 db_block_size*db_block_buffers*1024*1024=200M（db_block_size是建库时指定的，好象不能改，只有改db_block_buffers了）。<br /><br /><br /><br /><br />ORACLE SGA 的分配<br />ORACLE 8.0.X 版本<br />SGA=((db_block_buffers * block size)+(shared_pool_size+large_pool_size+log_buffers)+1MB<br />ORACLE 8.1.X 版本<br />SGA=((db_block_buffers * block size)+(shared_pool_size+large_pool_size+java_pool_size+log_buffers)+1MB<br />理论上SGA可占OS系统物理内存的1/2——1/3，我们可以根据需求调整<br />我推荐SGA=0.45*(OS RAM)<br />假设服务器运行ORACLE 8.1.X 版本, OS系统内存为2G MEM, db_block_size 是8192 bytes,<br />除了运行ORACLE数据库外, 没有其它的应用程序或服务器软件.<br />这样SGA合计约为921M ( 0.45*2048M ),<br />设shared_pool_size 250M (250*1024*1024 bytes)<br />设database buffer cache 620M (79360*8192 bytes)<br />initorasid.ora文件里具体各参数如下:<br />shared_pool_size = 262144000<br /># 250 M<br />db_block_buffers = 79360<br /># 620 M<br />log_buffer = 524288<br /># 512k (128K*CPU个数)<br />large_pool_size = 31457280<br /># 30 M<br />java_pool_size = 20971520<br /># 20 M<br />sort_area_size = 524288<br /># 512k (65k--2M)<br />sort_area_retained_size = 524288<br /># MTS 时 sort_area_retained_size = sort_area_size<br />SUN Solaris里/etc/system文件里的几个参数同样跟内存分配有关<br />ORACLE安装时缺省的设置: 建议修改的设置:<br />set shmsys:shminfo_shmmax=4294967295<br />set shmsys:shminfo_shmmin=1<br />set shmsys:shminfo_shmmni=100<br />set shmsys:shminfo_shmseg=15<br />set semsys:seminfo_semmns=200<br />set semsys:seminfo_semmni=70<br />set ulimit=3000000<br />set semsys:seminfo_semmni=315<br />set semsys:seminfo_semmsl=300<br />set semsys:seminfo_semmns=630<br />set semsys:seminfo_semopm=315<br />set semsys:seminfo_semvmx=32767<br />set shmsys:shminfo_shmmax=4294967295<br />set shmsys:shminfo_shmmni=315<br />set shmsys:shminfo_shmseg=10<br />set shmsys:shminfo_shmmin=1<br />其中这些参数的含义<br />shmmax - 共享内存段，建议设大点， 达到最大SGA<br />shmmin - 最小的共享内存段.<br />shmmni - 共享内存标志符的数量.<br />shmseg - 一个进程可分配的最大内存段数.<br />shmall - 最大可允许的内存数，比SGA还要大.<br />semmns - 信号灯，跟ORACLE的PROCESS数有关.<br />semmsl - 一个信号灯中最大的信号灯数.<br /><br /><br />db_block_buffers * block size : shared_pool_size = 2.5:1<img src ="http://www.blogjava.net/Vencent/aggbug/41000.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-04-13 23:56 <a href="http://www.blogjava.net/Vencent/articles/41000.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Solaris10 x86 u1 下安装 Oracle 10g Release 2</title><link>http://www.blogjava.net/Vencent/articles/39121.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Tue, 04 Apr 2006 04:35:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/39121.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/39121.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/39121.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/39121.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/39121.html</trackback:ping><description><![CDATA[
		<font face="Verdana" size="2">Solaris10 x86 u1 下安装 Oracle 10g Release 2<br /><br />关键字<br /><br />Solaris、Oracle<br /><br />操作环境<br /><br />Dell 2850<br />Solaris 10 x86 u1<br />Oracle 10g Release 2<br />Bash shell<br /><br />综合知识<br /><br />Solaris 10 x86 u1会在Dell 2850下以64位模式运行。<br />Oracle 10g Release 2就是64位架构<br /><br />参考资料<br />安装文件10201_database_solx86_64.zip内的帮助文档<br />http://www.dbspecialists.com/presentations/oracle10gsolaris.html<br />http://download-west.oracle.com/docs/html/B13972_01/toc.htm<br /><br />下载文件<br />http://www.oracle.com/technology/software/products/database/oracle10g/index.html<br />注册后点击<br />Oracle Database 10g Release 2 (10.2.0.1.0) for Solaris Operating System (x86-64) <br />下载<br />10201_database_solx86_64.zip<br /><br />检查系统环境<br /><br />确保系统可以运行图形界面或可以远程运行图形界面，在此使用的远程桌面是X Manager 2.0<br />打开XBrowser，输入服务器的IP地址即可连上。<br /><br />查看系统版本（要求5.10 64-bit）<br />? uname -a<br />SunOS javasvr 5.10 Generic_118844-26 i86pc i386 i86pc<br />? isainfo -kv<br />64-bit amd64 kernel modules<br /><br />查看物理内存（要求512MB以上，按具体情况）<br />? /usr/sbin/prtconf | grep "Memory size"<br />Memory size: 2048 Megabytes<br /><br />查看交换文件（要求1G以上）<br />? /usr/sbin/swap -l<br />swapfile             dev  swaplo blocks   free<br />/dev/dsk/c0t0d0s1   55,65      8 4192952 4192952<br /><br />临时文件空间（要求400M以上）<br />? df -h /tmp<br />Filesystem             size   used  avail capacity  Mounted on<br />swap                   3.1G     8K   3.1G     1%    /tmp<br /><br />这里的物理内存为2G，理论上为2G*1.5=3G合适，这里再添加512MB<br /><br />创建一个512MB的交换文件：<br /># mkfile 512M /export/home/swapone<br /><br />添加刚创建的交换文件：<br /># swap -a /export/home/swapone<br /><br />检查一下：<br /># swap -l<br />swapfile             dev  swaplo blocks   free<br />/dev/dsk/c0d0s1     102,1       8 1056376 1056376<br />/export/home/swapone  -        8 1048568 1048568<br /><br />下面设置交换文件在重启后自动加载使用：<br /># vi /etc/vfstab<br />/export/home/swapone    -       -       swap    -       no      -<br /><br />查看硬盘空间（要求3.7G以上）<br /> df -h <br />Filesystem             size   used  avail capacity  Mounted on<br />/dev/dsk/c0t0d0s0       29G   3.1G    25G    12%    /<br />......<br />swap                   3.1G   636K   3.1G     1%    /etc/svc/volatile<br />......<br />/dev/dsk/c0t0d0s7       27G   6.3G    20G    24%    /export/home<br /><br />查看以下软件包是否存在<br />? pkginfo -i SUNWarc SUNWbtool SUNWhea SUNWlibm  SUNWlibms SUNWsprot SUNWtoo SUNWi1of  SUNWi1cs SUNWi15cs SUNWxwfnt<br />system      SUNWarc   Lint Libraries (usr)<br />system      SUNWbtool CCS tools bundled with SunOS<br />system      SUNWhea   SunOS Header Files<br />system      SUNWi1of  ISO-8859-1 (Latin-1) Optional Fonts<br />system      SUNWlibm  Math &amp; Microtasking Library Headers &amp; Lint Files (Usr)<br />system      SUNWlibms Math &amp; Microtasking Libraries (Usr)<br />system      SUNWsprot Solaris Bundled tools<br />system      SUNWtoo   Programming Tools<br />system      SUNWxwfnt X Window System platform required fonts<br />ERROR: information for "SUNWi1cs" was not found<br />ERROR: information for "SUNWi15cs" was not found<br /><br />这里需要安装两个包：SUNWi1cs和SUNWi15cs<br /><br />这里从下载的安装镜像文件安装<br /><br />加载存放镜像文件分区<br />? mkdir /mnt/storage<br />? mount -F pcfs /dev/dsk/c0t0d0p4:1 /mnt/storage<br /><br />以块设备加载镜像文件<br />? lofiadm -a /mnt/storage/solaris10/sol-10-u1-ga-x86-dvd.iso <br />/dev/lofi/1<br />? mount -F hsfs -o ro /dev/lofi/1 /mnt/isoimg<br /><br />安装这两个包<br />? pkgadd -d /mnt/isoimg/Solaris_10/Product SUNWi1cs<br />? pkgadd -d /mnt/isoimg/Solaris_10/Product SUNWi15cs<br /><br />卸载加载的文件<br />? umount /mnt/isoimg/<br />? lofiadm -d /dev/lofi/1<br />? umount /mnt/storage/<br /><br />由于使用的Solaris 10 u1比较新，就不打补丁了。<br /><br /><br />创建用户和组<br /><br />需要创建两个组oinstall和dba，两个用户oracle和nobody<br /><br />先查看是否已存在<br />? grep oinstall /etc/group<br />? grep dba /etc/group<br />? id -a oracle<br />? id -a nobody<br />uid=60001(nobody) gid=60001(nobody) groups=60001(nobody)<br /><br />创建组<br />? groupadd oinstall<br />? groupadd dba<br /><br />创建用户<br />? useradd -g oinstall -G dba -d /export/home/oracle -s /usr/bin/bash -c 'Oracle software owner' -m oracle<br />? id -a oracle<br />uid=107(oracle) gid=104(oinstall) groups=105(dba)<br /><br />设置密码<br />? passwd oracle<br />***<br /><br />创建所需目录<br /><br />需要创建两个目录oracle和oradata，一个用来存储程序文件，一个用来存储数据文件<br /><br />查看磁盘空间<br />? df -kh<br /><br />创建目录oracle（需要3G以上）<br />? mkdir -p /opt/oracle<br />? chown -R oracle:oinstall /opt/oracle<br />? chmod -R 775 /opt/oracle <br /><br />创建目录oradata（需要1.2G以上）<br />? mkdir -p /export/home/oradata<br />? chown -R oracle:oinstall /export/home/oradata<br />? chmod -R 775 /export/home/oradata<br /><br />调整内核参数<br /><br />备份配置文件<br />? cp /etc/system /etc/system.orig<br /><br />修改配置文件，添加如下几行<br />? vi /etc/system<br />* for install oracle 10g<br />set noexec_user_stack=1<br />set semsys:seminfo_semmni=100<br />set semsys:seminfo_semmns=1024<br />set semsys:seminfo_semmsl=256<br />set semsys:seminfo_semvmx=32767<br />set shmsys:shminfo_shmmax=4294967295<br />set shmsys:shminfo_shmmin=1<br />set shmsys:shminfo_shmmni=100<br />set shmsys:shminfo_shmseg=10<br /><br />重启系统<br />? reboot<br /><br />准备安装文件<br /><br />解压安装文件：<br />? unzip 10201_database_solx86_64.zip<br />得到文件夹database<br /><br />配置环境参数<br /><br />用oracle登录<br />? su - oracle<br /><br />设置环境参数<br />? vi .profile<br />umask 022<br />ORACLE_BASE=/opt/oracle<br />ORACLE_SID=cdtdb<br />export ORACLE_BASE ORACLE_SID<br /><br />重新登录查看<br />-bash-3.00$ umask<br />0022<br />? env | more<br />-bash-3.00$ env | more<br />......<br />ORACLE_SID=cdtdb<br />ORACLE_BASE=/opt/oracle<br />......<br /><br />开始安装过程<br /><br />用Xmanager登录到服务器<br />用oracle用户<br /><br />运行database目录下的runInstaller<br /><br />Select Installation Method<br />  Advanced Installation<br /><br />Specify Inventory directory and credentials<br />  /opt/oracle/oraInventory<br />  oinstall<br /><br />Select Installation Type<br />  Enterprise Edition<br /><br />Sepcify Home Details<br />  Name: OraDb10g_home1<br />  Path: /opt/oracle/oracle/product/10.2.0/db_1<br /><br />Product-Specific Prerequisite Checks<br />  全部通过即可！<br /><br />Select Configuration Option<br />  Create a database<br /><br />Select Database Configuration<br />  General Purpose<br /><br />Specify Database Configuration Options<br />Global Database Name:cdtdb    SID:cdtdb<br />Select Database Character set: Simplified Chinese ZHS16GBK<br />选中Create database with sample schemas<br /><br />Select Database Management Option<br />选中Use Database Control for Database Management<br />    Enable Email Notification<br />        61.144.43.235<br />        chenliqun@pyp.edu.cn<br /><br />Specify Database Storage Option<br />选中File System<br />    location:/export/home/oradata<br /><br />Specify Backup and Recovery Options<br />选中Do not enable Automated backups<br /><br />Specify Database Schema Passwords<br />统一使用一个密码：***<br /><br />Summary<br /><br />Execute Configuration Scripts<br />按照提示，用root用户运行脚本<br /><br />安装完成！<br /><br />安装日志：<br />/opt/oracle/oracle/product/10.2.0/db_1/cfgtoollogs/dbca/cdtdb<br /><br />iSQL*Plus URL:<br />http://192.168.200.11:5560/isqlplus<br /><br />iSQL*Plus DBA URL:<br />http://192.168.200.11:5560/isqlplus/dba<br /><br />Enterprise Manager 10g Database Control URL:<br />http://192.168.200.11:1158/em<br />用sys用户以sysdba身份登录<br /><br />完成服务配置<br /><br />用oracle登录<br />? su - oracle<br /><br />修改配置文件<br />? vi .profile<br />stty istrip<br />PS1='# '<br />umask 022<br />MAIL=/usr/mail/${LOGNAME:?}<br />PATH=/usr/bin:/usr/sbin:/usr/sadm/bin:/usr/sfw/bin:/usr/local/bin:/usr/ucb:/etc:.<br />ORACLE_SID=cdtdb<br />ORAENV_ASK=NO<br />ORACLE_BASE=/opt/oracle<br />export PS1 PATH ORACLE_BASE ORACLE_SID ORAENV_ASK<br />. oraenv<br /><br />正确配置数据库实例入口<br />? vi /var/opt/oracle/oratab <br />cdtdb:/opt/oracle/oracle/product/10.2.0/db_1:Y<br /><br />创建自动运行脚本<br />? vi /etc/init.d/oracle<br />#!/bin/sh<br />ORA_HOME=/opt/oracle/oracle/product/10.2.0/db_1<br />ORA_OWNER=oracle<br />if [ ! -f $ORA_HOME/bin/dbstart ]<br />then<br />  echo "Oracle startup: cannot start"<br />  exit<br />fi<br />case "$1" in<br />   'start') # Start the Oracle databases and listeners<br />            su - $ORA_OWNER -c "$ORA_HOME/bin/dbstart"<br />            su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl start"<br />            su - $ORA_OWNER -c "$ORA_HOME/bin/emctl start dbconsole"<br />            su - $ORA_OWNER -c "$ORA_HOME/bin/isqlplusctl start"<br />            ;;<br />   'stop')  # Stop the Oracle databases and listeners<br />            su - $ORA_OWNER -c "$ORA_HOME/bin/isqlplusctl stop"<br />            su - $ORA_OWNER -c "$ORA_HOME/bin/emctl stop dbconsole"<br />            su - $ORA_OWNER -c "$ORA_HOME/bin/lsnrctl stop"<br />            su - $ORA_OWNER -c "$ORA_HOME/bin/dbshut"<br />            ;;<br />esac<br /><br />建立符号连接<br />? ln -s /etc/init.d/oracle /etc/rc2.d/S99oracle<br />? ln -s /etc/init.d/oracle /etc/rc0.d/K10oracle<br /><br /><br />其它配置和错误排除<br /><br />解决em和isqlplus中文按钮乱码问题<br /># cd $ORACLE_HOME/jre/1.4.2/lib<br /># cp font.properties font.properties.orig<br /># cp font.properties.zh_CN_UTF8 font.properties<br /><br /># cd $ORACLE_HOME/jdk/jre/lib/<br /># cp font.properties font.properties.orig<br /># cp font.properties.zh_CN_UTF8 font.properties<br /><br />清除缓存的文件<br /># cd $ORACLE_HOME/oc4j/j2ee/oc4j_applications/applications/em/em/cabo/images/cache/zhs<br /># rm *.*<br /><br /># cd $ORACLE_HOME/oc4j/j2ee/oc4j_applications/applications/isqlplus/isqlplus/cabo/images/cache/zhs<br /># rm *.*<br /><br />排除tnslsnr启动错误：<br />错误信息：Failed to auto-start Oracle Net Listene using /ade/vikrkuma_new/oracle/bin/tnslsnr<br />这里的Listene应该是Listener吧！<br /><br /># vi $ORACLE_HOME/bin/dbstart<br />将 ORACLE_HOME_LISTNER=/ade/vikrkuma_new/oracle<br />改为 ORACLE_HOME_LISTNER=$ORACLE_HOME<br /><br />可见，这是由于Oracel工程师手误引起！非常不应该！<br /><br />启动Oracle时启动Apache出错<br /><br />查看错误提示<br /># vi /var/adm/messages<br />Mar 30 08:31:50 javasvr svc.startd[7]: [ID 652011 daemon.warning] svc:/network/http:apache2: Method "/<br />lib/svc/method/http-apache2 start" failed with exit status 1.<br /><br />? svcs -a | grep apache2<br />maintenance    Mar_31   svc:/network/http:apache2<br />上面说明apache2没有正常运行<br /><br />应该是Oracle安装时，想启动Apache2，但Apache2作为SMF服务，不允许外部程序单独启用。<br /><br />如果不需要Apache2服务，关闭它<br />? svcadm disable http:apache2<br /><br />如果需要，就启用它<br />? svcadm disable http:apache2<br />? svcadm enable http:apache2<br /><br />注意，em和isqlplus使用的是oc4j服务器。</font>
<img src ="http://www.blogjava.net/Vencent/aggbug/39121.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-04-04 12:35 <a href="http://www.blogjava.net/Vencent/articles/39121.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL优化</title><link>http://www.blogjava.net/Vencent/articles/36601.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Tue, 21 Mar 2006 04:40:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/36601.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/36601.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/36601.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/36601.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/36601.html</trackback:ping><description><![CDATA[最近做项目发现很多SQL没有优化: 现在总结几种优化方式.<br /> 首先先了解一个SQL语句的执行过程分3步: 语法分析(parase)与编译,执行,取数据. <br />1： 在语法分析与编译时:oracle 使用哈希函数为SQL语句在库缓存中分配一个SQL区,<br />首先检查语句是否存在,若在,则查询数据库字典、检查必须的权限。<br />若无，需要语法分析与编译。所以SQL语句存在与内存中，将减少分析，编译时间。<br />SQL语句的分析与编译占整个语句运行过程的60%的时间，SQL优化的目标就是减少分析与编译的时间，共享代码。
		<p>查询SQL语句分析与编译的时间：<br />select * from v$sysstat <br />where name in ('parse time cpu','parse time elapsed','parse count (hard)')</p><p>一个SQL语句的响应时间(elapsed time )应该是服务时间+等待时间.<br />服务时间= CPU执行时间.<br />等待时间 可以从v$system_event<br />select total_waits, total_timeouts, time_waited, average_wait ,event <br />from v$system_event <br />where event='latch free'<br />所以解析一个SQL语句的平均等待时间是"等待时间/parse count" 这个值接近0<br />通过数据字典v$sqlare,可以查询到频繁被分析与编译的SQL语句.应该减少SQL语句的分析与编译的次数.</p><p>2: 将常用的实体驻留内存.<br />为了减少分析与编译时间,可以将常用的的实体如: 存储过程,包等,尽可能驻留在内存区域.<br /> 1)预留内存空间. sql&gt; show parameter shared_pool_reserved_size<br />       2)将频繁使用的实体驻留在内存中. 在使用DBMS_SHARED_POOL程序包前,必须首先运行系统提供的程序包: dbmspool.sql 和prvtpool.plb<br /> 在加载这两个程序包后,自动生成所需的包. <br />      加载: sql&gt; @/u01/app/oracle/product/8.17/rdbms/admin/dbmspool.sql<br />           sql&gt; @/u01/app/oracle/product/8.17/rdbms/admin/prvtpool.sql<br />      包DBMS_SHARED_POOL包含以下存储过程.<br />      dbms_shared_pool.keep 用于将实体保存内存. dbms_shared_pool.keep(object in varchar2,[type in char default p]);<br />                             object 表示参数名, type 表示被驻留内存的实体类型;P 表示存储过程,C表示光标,R表示触发器,默认P<br />        <br />      dbms_shared_pool.unkeep 用于取消被设置进入内存的实体. dbms_shared_pool.unkeep(object in varchar2,[type in char default p]);<br />                             object 表示参数名, type 表示被驻留内存的实体类型;P 表示存储过程,C表示光标,R表示触发器,默认P<br />      <br />      dbms_shared_pool.size(minsize in number)</p><p>      select name ,type ,source_size+code_size+parsed_size+error_size "total bytes" <br />      from dba_object_size <br />      where owner='SCOTT'</p><p>3: 创建索引. <br />   select index_name,table_owner, table_name, tablespace_name from all_indexes<br />   <br />   select user_indexes.TABLE_NAME, user_indexes.INDEX_NAME,uniqueness, column_name<br />   from user_ind_columns ,user_indexes<br />   where user_ind_columns.INDEX_NAME=user_indexes.INDEX_NAME<br />   and user_ind_columns.TABLE_NAME=user_indexes.TABLE_NAME<br />   order by user_indexes.TABLE_TYPE,user_indexes.TABLE_NAME,user_indexes.INDEX_NAME,user_ind_columns.COLUMN_POSITION</p><p>4: 创建聚簇(cluster): 是一组存储在一起的有共同列或经常一起使用的表,被聚簇的两个表只有一个数据段.聚簇表在存储时,在物理层将子表合并到父表中,这样就少了表的连接时间.</p><p>5: 创建哈希索引.<br /> <br />6: SQL优化器: 基于成本的优化器CBO(cose_based)和基于规则RBO(rule_based)<br />   sql&gt; show parameter OPTIMIZER_MODE<br />   可以修改参数文件: initSID.ora,增加: optimizer_Mode={CHOOSE| RULE| FIRST_ROWS|ALL_ROWS}<br />  all_rows , first_rows(n)基于成本; rule 基于规则,choose基于规则、成本。<br />  /*+ ordered*/ <br />  /*+ rule */<br />  /*+ first_rows(50) */</p><p>  /*+ordered star*/ <br />  写发：  <br />  alter system flush shared_pool;<br />select /*+ rule */ aa from visit </p><img src ="http://www.blogjava.net/Vencent/aggbug/36601.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-03-21 12:40 <a href="http://www.blogjava.net/Vencent/articles/36601.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>手工创建数据库</title><link>http://www.blogjava.net/Vencent/articles/35129.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Mon, 13 Mar 2006 13:01:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/35129.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/35129.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/35129.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/35129.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/35129.html</trackback:ping><description><![CDATA[<font face="verdana, arial, helvetica" size="2"><span class="javascript" id="text1817591">第一次创建数据库是用的DBCA，中间发生了错误。后来看书(机械工业Couchman的书)才知道，<br>
创建新数据库时，必须将原来的数据库shutdown，否则会出现错误。然后进SQLPLUS，一直提示<br>
ORA12560，监听报错。<br>
   试了半天，又用DBCA把所有的数据库都删掉了，还是用DBCA重新创建了一个数据库，这次没有<br>
出现问题。觉得很奇怪。查了一下资料，可能是在上次创建的时候INIT.ORA文件破坏了。<br>
<br>
  在网上找到了一个8I的手动配置过程，呵呵，真是如获至宝啊。<br>
  <br>
  结合我自己的情况把经验和大家共享，请大家给提提意见。<br>
 <br>
  系统环境：  <br>
1、操作系统：Windows 2003 Server<br>
2、数据库：　Oracle9I Release 9.2.0.1.0 <br>
3、安装路径：D:\ORACLE <br>
  <br>
建库步骤：  <br>
1、手工创建相关目录 <br>
D:\Oracle\admin\test <br>
D:\Oracle\admin\test\adhoc <br>
D:\Oracle\admin\test\bdump <br>
D:\Oracle\admin\test\cdump <br>
D:\Oracle\admin\test\create <br>
D:\Oracle\admin\test\exp <br>
D:\Oracle\admin\test\pfile <br>
D:\Oracle\admin\test\udump <br>
  <br>
D:\Oracle\oradata\test <br>
D:\Oracle\oradata\test\archive <br>
<br>
------------------------------------<br>
这几步比较简单，很快就完成了。觉得手动创建数据库对理解结构还是很有帮助的。<br>
<br>
<br>
<br>
  <br>
2、手工创建初始化启动参数文件：D:\Oracle\admin\test\pfile\inittest.ora，内容： <br>
-------------------------------------<br>
db_name = "test"<br>
instance_name = test<br>
service_names = test<br>
db_files = 1024<br>
control_files = ("D:\Oracle\oradata\test\control01.ctl", <br>
<br>
"D:\Oracle\oradata\test\control02.ctl", "D:\Oracle\oradata\test\control03.ctl")<br>
open_cursors = 200<br>
max_enabled_roles = 30<br>
db_file_multiblock_read_count = 8<br>
db_block_buffers = 4096<br>
shared_pool_size = 52428800<br>
large_pool_size = 78643200<br>
java_pool_size = 20971520<br>
log_checkpoint_interval = 10000<br>
log_checkpoint_timeout = 1800<br>
processes = 115<br>
parallel_max_servers = 5<br>
log_buffer = 32768<br>
max_dump_file_size = 10240<br>
global_names = true<br>
oracle_trace_collection_name = ""<br>
background_dump_dest = D:\Oracle\admin\test\bdump<br>
user_dump_dest = D:\Oracle\admin\test\udump<br>
db_block_size = 16384<br>
remote_login_passwordfile = exclusive<br>
os_authent_prefix = ""<br>
job_queue_processes = 4<br>
job_queue_interval = 60<br>
open_links = 4<br>
<br>
# log_archive_start = true<br>
# log_archive_dest_1 = "location=D:\Oracle\oradata\oradb\archive"<br>
# log_archive_format = %%ORACLE_SID%%T%TS%S.ARC  <br>
<br>
------------------------------------------<br>
奇怪的是，我当时创建了空的init.ora,最后竟然也能成功创建，<br>
是不是因为OMF的原因？<br>
<br>
<br>
<br>
3、手工创建D:\Oracle\Ora92\DATABASE\inittest.ora文件， <br>
  <br>
    内容：IFILE='D:\Oracle\admin\test\pfile\inittest.ora' <br>
  <br>
<br>
<br>
4、使用orapwd.exe命令，创建D:\Oracle\Ora92\DATABASE\PWDtest.ora <br>
  <br>
    命令：D:\Oracle\Ora92\bin\orapwd file=D:\Oracle\Ora81\DATABASE\PWDtest.ora <br>
<br>
password=ORACLE entries=5 <br>
  <br>
5、通过oradim.exe命令，在服务里生成一个新的实例管理服务，启动方式为手工 <br>
    set ORACLE_SID=test (这个很重要，否则出现ORA-12560错误)<br>
    D:\Oracle\Ora92\bin\oradim -new -sid test -startmode manual -pfile <br>
<br>
"D:\Oracle\admin\test\pfile\inittest.ora" <br>
  <br>
6、生成各种数据库对象 <br>
D:\&gt;Oracle\Ora92\bin\sqlplus<br>
<br>
Connect:SYS as SYSDBA<br>
Password:Orace  <br>
<br>
--创建数据库 <br>
 <br>
startup nomount pfile="D:\Oracle\admin\test\pfile\inittest.ora" <br>
CREATE DATABASE test <br>
LOGFILE 'D:\Oracle\oradata\test\redo01.log' SIZE 2048K, <br>
     'D:\Oracle\oradata\test\redo02.log' SIZE 2048K, <br>
     'D:\Oracle\oradata\test\redo03.log' SIZE 2048K <br>
MAXLOGFILES 32 <br>
MAXLOGMEMBERS 2 <br>
MAXLOGHISTORY 1 <br>
DATAFILE 'D:\Oracle\oradata\test\system01.dbf' SIZE 58M  REUSE AUTOEXTEND ON NEXT 640K <br>
MAXDATAFILES 254 <br>
MAXINSTANCES 1 <br>
CHARACTER SET ZHS16GBK <br>
NATIONAL CHARACTER SET ZHS16GBK; <br>
  <br>
控制文件、日志文件在上面语句执行时生成 <br>
<br>
<br>
以下是网上资料中ORACEL 8I中Init.ora的其他部分，我因为是做实验，所以省略了<br>
***********************************************************************<br>
<br>
  <br>
connect INTERNAL/oracle <br>
--修改系统表空间 <br>
ALTER TABLESPACE SYSTEM DEFAULT STORAGE ( INITIAL 64K NEXT 64K MINEXTENTS 1 MAXEXTENTS <br>
<br>
UNLIMITED PCTINCREASE 50); <br>
ALTER TABLESPACE SYSTEM MINIMUM EXTENT 64K; <br>
  <br>
--创建回滚表空间 <br>
CREATE TABLESPACE RBS DATAFILE 'D:\Oracle\oradata\test\rbs01.dbf' SIZE 256M REUSE <br>
   AUTOEXTEND ON NEXT 5120K <br>
   MINIMUM EXTENT 512K <br>
   DEFAULT STORAGE ( INITIAL 512K NEXT 512K MINEXTENTS 8 MAXEXTENTS 4096); <br>
  <br>
--创建用户表空间 <br>
CREATE TABLESPACE USERS DATAFILE 'D:\Oracle\oradata\test\users01.dbf' SIZE 128M REUSE <br>
   AUTOEXTEND ON NEXT 1280K <br>
   MINIMUM EXTENT 128K <br>
   DEFAULT STORAGE ( INITIAL 128K NEXT 128K MINEXTENTS 1 MAXEXTENTS 4096 PCTINCREASE 0); <br>
  <br>
--创建临时表空间 <br>
CREATE TABLESPACE TEMP DATAFILE 'D:\Oracle\oradata\test\temp01.dbf' SIZE 32M REUSE <br>
   AUTOEXTEND ON NEXT 640K <br>
   MINIMUM EXTENT 64K <br>
   DEFAULT STORAGE ( INITIAL 64K NEXT 64K MINEXTENTS 1 MAXEXTENTS UNLIMITED PCTINCREASE 0) <br>
<br>
TEMPORARY; <br>
  <br>
--创建工具表空间 <br>
CREATE TABLESPACE TOOLS DATAFILE 'D:\Oracle\oradata\test\tools01.dbf' SIZE 64M REUSE <br>
   AUTOEXTEND ON NEXT 320K <br>
   MINIMUM EXTENT 32K <br>
   DEFAULT STORAGE ( INITIAL 32K NEXT 32K MINEXTENTS 1 MAXEXTENTS 4096 PCTINCREASE 0); <br>
  <br>
--创建索引表空间 <br>
CREATE TABLESPACE INDX DATAFILE 'D:\Oracle\oradata\test\indx01.dbf' SIZE 32M REUSE <br>
   AUTOEXTEND ON NEXT 1280K <br>
   MINIMUM EXTENT 128K <br>
   DEFAULT STORAGE ( INITIAL 128K NEXT 128K MINEXTENTS 1 MAXEXTENTS 4096 PCTINCREASE 0); <br>
  <br>
--创建回滚段 <br>
CREATE PUBLIC ROLLBACK SEGMENT RBS0 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br>
CREATE PUBLIC ROLLBACK SEGMENT RBS1 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br>
CREATE PUBLIC ROLLBACK SEGMENT RBS2 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br>
CREATE PUBLIC ROLLBACK SEGMENT RBS3 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br>
CREATE PUBLIC ROLLBACK SEGMENT RBS4 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br>
CREATE PUBLIC ROLLBACK SEGMENT RBS5 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br>
CREATE PUBLIC ROLLBACK SEGMENT RBS6 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br>
CREATE PUBLIC ROLLBACK SEGMENT RBS7 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br>
CREATE PUBLIC ROLLBACK SEGMENT RBS8 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br>
CREATE PUBLIC ROLLBACK SEGMENT RBS9 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br>
CREATE PUBLIC ROLLBACK SEGMENT RBS10 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br>
CREATE PUBLIC ROLLBACK SEGMENT RBS11 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br>
CREATE PUBLIC ROLLBACK SEGMENT RBS12 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br>
CREATE PUBLIC ROLLBACK SEGMENT RBS13 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br>
CREATE PUBLIC ROLLBACK SEGMENT RBS14 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br>
CREATE PUBLIC ROLLBACK SEGMENT RBS15 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br>
CREATE PUBLIC ROLLBACK SEGMENT RBS16 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br>
CREATE PUBLIC ROLLBACK SEGMENT RBS17 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br>
CREATE PUBLIC ROLLBACK SEGMENT RBS18 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br>
CREATE PUBLIC ROLLBACK SEGMENT RBS19 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br>
CREATE PUBLIC ROLLBACK SEGMENT RBS20 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br>
CREATE PUBLIC ROLLBACK SEGMENT RBS21 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br>
CREATE PUBLIC ROLLBACK SEGMENT RBS22 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br>
CREATE PUBLIC ROLLBACK SEGMENT RBS23 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br>
CREATE PUBLIC ROLLBACK SEGMENT RBS24 TABLESPACE RBS STORAGE ( OPTIMAL 4096K ); <br>
  <br>
--使回滚段在线 <br>
ALTER ROLLBACK SEGMENT "RBS0" ONLINE; <br>
ALTER ROLLBACK SEGMENT "RBS1" ONLINE; <br>
ALTER ROLLBACK SEGMENT "RBS2" ONLINE; <br>
ALTER ROLLBACK SEGMENT "RBS3" ONLINE; <br>
ALTER ROLLBACK SEGMENT "RBS4" ONLINE; <br>
ALTER ROLLBACK SEGMENT "RBS5" ONLINE; <br>
ALTER ROLLBACK SEGMENT "RBS6" ONLINE; <br>
ALTER ROLLBACK SEGMENT "RBS7" ONLINE; <br>
ALTER ROLLBACK SEGMENT "RBS8" ONLINE; <br>
ALTER ROLLBACK SEGMENT "RBS9" ONLINE; <br>
ALTER ROLLBACK SEGMENT "RBS10" ONLINE; <br>
ALTER ROLLBACK SEGMENT "RBS11" ONLINE; <br>
ALTER ROLLBACK SEGMENT "RBS12" ONLINE; <br>
ALTER ROLLBACK SEGMENT "RBS13" ONLINE; <br>
ALTER ROLLBACK SEGMENT "RBS14" ONLINE; <br>
ALTER ROLLBACK SEGMENT "RBS15" ONLINE; <br>
ALTER ROLLBACK SEGMENT "RBS16" ONLINE; <br>
ALTER ROLLBACK SEGMENT "RBS17" ONLINE; <br>
ALTER ROLLBACK SEGMENT "RBS18" ONLINE; <br>
ALTER ROLLBACK SEGMENT "RBS19" ONLINE; <br>
ALTER ROLLBACK SEGMENT "RBS20" ONLINE; <br>
ALTER ROLLBACK SEGMENT "RBS21" ONLINE; <br>
ALTER ROLLBACK SEGMENT "RBS22" ONLINE; <br>
ALTER ROLLBACK SEGMENT "RBS23" ONLINE; <br>
ALTER ROLLBACK SEGMENT "RBS24" ONLINE; <br>
  <br>
--修改sys用户的临时表空间为TEMP <br>
alter user sys temporary tablespace TEMP; <br>
  <br>
--创建数据字典表 <br>
@D:\Oracle\Ora81\Rdbms\admin\catalog.sql; <br>
@D:\Oracle\Ora81\Rdbms\admin\catexp7.sql <br>
@D:\Oracle\Ora81\Rdbms\admin\catproc.sql <br>
@D:\Oracle\Ora81\Rdbms\admin\caths.sql <br>
  <br>
connect system/manager <br>
@D:\Oracle\Ora81\sqlplus\admin\pupbld.sql <br>
  <br>
connect internal/oracle <br>
@D:\Oracle\Ora81\Rdbms\admin\catrep.sql <br>
exit <br>
  <br>
--生成SQL*Plus帮助系统 <br>
sqlplus SYSTEM/manager <br>
@D:\Oracle\Ora81\sqlplus\admin\help\helpbld.sql helpus.sql <br>
exit <br>
  <br>
--修改system用户默认表空间和临时表空间 <br>
svrmgrl <br>
connect internal/oracle <br>
alter user system default tablespace TOOLS; <br>
alter user system temporary tablespace TEMP; <br>
exit <br>
**************************************************************  <br>
7、将test实例启动服务设置成自动启动方式 <br>
<br>
D:\Oracle\Ora81\bin\oradim -edit -sid test -startmode auto<br>
看看服务里多了一项OracleServerTest.<br>
<br>
<br>
终于能看到Database Created,对于我这种初学者，还是很开心的一件事情。<br>
然后到OEM里看看自己新建的数据库，同时在SQLPLUS创建了一个用户，在OEM看到了，呵呵。<br>
证明确实是我刚才创建的数据库。<br>
<br>
这个时候问题又出现了，在OEM里，我试着用SQLPLUS worksheet，<br>
connect sys as sysdba<br>
<br>
Enter password: ERROR:<br>
ORA-12560: TNS<img src="http://www.itpub.net/images/smilies/13.gif" alt="吐舌" border="0">rotocol adapter error<br>
<br>
这是怎么回事呢？刚才用的DOS下的SQLPLUS没有关，我在DOS下试着连接，很好啊，<br>
那问题出在哪里呢？于是把DOS窗口重新开了一次，再连SQLPLUS，<br>
呵呵，出现了和Worksheet一样的错误。<br>
<br>
接着，又检查了inittest.ora,没有找到什么。<br>
反复的startup mount,start nomount pfile="..inittest.ora"<br>
shutdown normal,还是出现这个ORA-12560<br>
<br>
既然是监听出现问题，是不是与SID有关呢？<br>
问题出在set ORACLE_SID=test.<br>
在DOS下，先SET ORACLE_SID,然后在SQLPLUS里面CONNECT，<br>
呵呵，SQLPLUS一切正常了。但是在OEM里还是使用不了SQLPLUS worksheet,这是为什么？<br><br></span></font><font face="verdana, arial, helvetica" size="2"><span class="javascript" id="text2014512">步骤一：其实是不用手动创建的，在oracle\ora92\admin\sample目录下有模版，直接考过来，将initsmp.ora改名即可。</span></font><br><img src ="http://www.blogjava.net/Vencent/aggbug/35129.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-03-13 21:01 <a href="http://www.blogjava.net/Vencent/articles/35129.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> oracle常用命令(我的笔记)</title><link>http://www.blogjava.net/Vencent/articles/35130.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Mon, 13 Mar 2006 13:01:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/35130.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/35130.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/35130.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/35130.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/35130.html</trackback:ping><description><![CDATA[<font face="verdana, arial, helvetica" size="2"><span class="javascript" id="text3650298">oracle里常用命令第一章：日志管理 <br>
<br>
1.forcing log switches <br>
sql&gt; alter system switch logfile;<br>
2.forcing checkpoints <br>
sql&gt; alter system checkpoint; <br>
3.adding online redo log groups <br>
sql&gt; alter database add logfile [group 4] <br>
sql&gt; ('/disk3/log4a.rdo','/disk4/log4b.rdo') size 1m; <br>
4.adding online redo log members <br>
sql&gt; alter database add logfile member <br>
sql&gt; '/disk3/log1b.rdo' to group 1, <br>
sql&gt; '/disk4/log2b.rdo' to group 2; <br>
5.changes the name of the online redo logfile <br>
sql&gt; alter database rename file 'c:/oracle/oradata/oradb/redo01.log' <br>
sql&gt; to 'c:/oracle/oradata/redo01.log'; <br>
6.drop online redo log groups <br>
sql&gt; alter database drop logfile group 3; <br>
7.drop online redo log members <br>
sql&gt; alter database drop logfile member 'c:/oracle/oradata/redo01.log'; <br>
8.clearing online redo log files <br>
sql&gt; alter database clear [unarchived] logfile 'c:/oracle/log2a.rdo'; <br>
9.using logminer analyzing redo logfiles <br>
a. in the init.ora specify utl_file_dir = ' ' <br>
b. sql&gt; execute dbms_logmnr_d.build('oradb.ora','c:\oracle\oradb\log'); <br>
c. sql&gt; execute dbms_logmnr_add_logfile('c:\oracle\oradata\oradb\redo01.log', <br>
sql&gt; dbms_logmnr.new); <br>
d. sql&gt; execute dbms_logmnr.add_logfile('c:\oracle\oradata\oradb\redo02.log', <br>
sql&gt; dbms_logmnr.addfile); <br>
e. sql&gt; execute dbms_logmnr.start_logmnr(dictfilename=&gt;'c:\oracle\oradb\log\oradb.ora'); <br>
f. sql&gt; select * from v$logmnr_contents(v$logmnr_dictionary,v$logmnr_parameters <br>
sql&gt; v$logmnr_logs); <br>
g. sql&gt; execute dbms_logmnr.end_logmnr; <br>
<br>
第二章：表空间管理 <br>
1.create tablespaces <br>
sql&gt; create tablespace tablespace_name datafile 'c:\oracle\oradata\file1.dbf' size 100m, <br>
sql&gt; 'c:\oracle\oradata\file2.dbf' size 100m minimum extent 550k [logging/nologging] <br>
sql&gt; default storage (initial 500k next 500k maxextents 500 pctinccease 0) <br>
sql&gt; [online/offline] [permanent/temporary] [extent_management_clause] <br>
2.locally managed tablespace <br>
sql&gt; create tablespace user_data datafile 'c:\oracle\oradata\user_data01.dbf' <br>
sql&gt; size 500m extent management local uniform size 10m; <br>
3.temporary tablespace <br>
sql&gt; create temporary tablespace temp tempfile 'c:\oracle\oradata\temp01.dbf' <br>
sql&gt; size 500m extent management local uniform size 10m; <br>
4.change the storage setting <br>
sql&gt; alter tablespace app_data minimum extent 2m; <br>
sql&gt; alter tablespace app_data default storage(initial 2m next 2m maxextents 999); <br>
5.taking tablespace offline or online <br>
sql&gt; alter tablespace app_data offline; <br>
sql&gt; alter tablespace app_data online; <br>
6.read_only tablespace <br>
sql&gt; alter tablespace app_data read only|write; <br>
7.droping tablespace <br>
sql&gt; drop tablespace app_data including contents; <br>
8.enableing automatic extension of data files <br>
sql&gt; alter tablespace app_data add datafile 'c:\oracle\oradata\app_data01.dbf' size 200m <br>
sql&gt; autoextend on next 10m maxsize 500m; <br>
9.change the size fo data files manually <br>
sql&gt; alter database datafile 'c:\oracle\oradata\app_data.dbf' resize 200m; <br>
10.Moving data files: alter tablespace <br>
sql&gt; alter tablespace app_data rename datafile 'c:\oracle\oradata\app_data.dbf' <br>
sql&gt; to 'c:\oracle\app_data.dbf'; <br>
11.moving data files:alter database <br>
sql&gt; alter database rename file 'c:\oracle\oradata\app_data.dbf' <br>
sql&gt; to 'c:\oracle\app_data.dbf'; <br>
<br>
第三章：表 <br>
<br>
1.create a table <br>
sql&gt; create table table_name (column datatype,column datatype]....) <br>
sql&gt; tablespace tablespace_name [pctfree integer] [pctused integer] <br>
sql&gt; [initrans integer] [maxtrans integer] <br>
sql&gt; storage(initial 200k next 200k pctincrease 0 maxextents 50) <br>
sql&gt; [logging|nologging] [cache|nocache] <br>
2.copy an existing table <br>
sql&gt; create table table_name [logging|nologging] as subquery <br>
3.create temporary table <br>
sql&gt; create global temporary table xay_temp as select * from xay; <br>
on commit preserve rows/on commit delete rows <br>
4.pctfree = (average row size - initial row size) *100 /average row size <br>
pctused = 100-pctfree- (average row size*100/available data space) <br>
5.change storage and block utilization parameter <br>
sql&gt; alter table table_name pctfree=30 pctused=50 storage(next 500k <br>
sql&gt; minextents 2 maxextents 100); <br>
6.manually allocating extents <br>
sql&gt; alter table table_name allocate extent(size 500k datafile 'c:/oracle/data.dbf'); <br>
7.move tablespace <br>
sql&gt; alter table employee move tablespace users; <br>
8.deallocate of unused space <br>
sql&gt; alter table table_name deallocate unused [keep integer] <br>
9.truncate a table <br>
sql&gt; truncate table table_name; <br>
10.drop a table <br>
sql&gt; drop table table_name [cascade constraints]; <br>
11.drop a column <br>
sql&gt; alter table table_name drop column comments cascade constraints checkpoint 1000; <br>
alter table table_name drop columns continue; <br>
12.mark a column as unused <br>
sql&gt; alter table table_name set unused column comments cascade constraints; <br>
alter table table_name drop unused columns checkpoint 1000; <br>
alter table orders drop columns continue checkpoint 1000 <br>
data_dictionary : dba_unused_col_tabs <br>
<br>
第四章：索引 <br>
<br>
1.creating function-based indexes <br>
sql&gt; create index summit.item_quantity on summit.item(quantity-quantity_shipped); <br>
2.create a B-tree index <br>
sql&gt; create [unique] index index_name on table_name(column,.. asc/desc) tablespace <br>
sql&gt; tablespace_name [pctfree integer] [initrans integer] [maxtrans integer] <br>
sql&gt; [logging | nologging] [nosort] storage(initial 200k next 200k pctincrease 0 <br>
sql&gt; maxextents 50); <br>
3.pctfree(index)=(maximum number of rows-initial number of rows)*100/maximum number of rows <br>
4.creating reverse key indexes <br>
sql&gt; create unique index xay_id on xay(a) reverse pctfree 30 storage(initial 200k <br>
sql&gt; next 200k pctincrease 0 maxextents 50) tablespace indx; <br>
5.create bitmap index <br>
sql&gt; create bitmap index xay_id on xay(a) pctfree 30 storage( initial 200k next 200k <br>
sql&gt; pctincrease 0 maxextents 50) tablespace indx; <br>
6.change storage parameter of index <br>
sql&gt; alter index xay_id storage (next 400k maxextents 100); <br>
7.allocating index space <br>
sql&gt; alter index xay_id allocate extent(size 200k datafile 'c:/oracle/index.dbf'); <br>
8.alter index xay_id deallocate unused; <br>
<br>
第五章：约束 <br>
<br>
1.define constraints as immediate or deferred <br>
sql&gt; alter session set constraint[s] = immediate/deferred/default; <br>
set constraint[s] constraint_name/all immediate/deferred; <br>
2. sql&gt; drop table table_name cascade constraints <br>
sql&gt; drop tablespace tablespace_name including contents cascade constraints <br>
3. define constraints while create a table <br>
sql&gt; create table xay(id number(7) constraint xay_id primary key deferrable <br>
sql&gt; using index storage(initial 100k next 100k) tablespace indx); <br>
primary key/unique/references table(column)/check <br>
4.enable constraints <br>
sql&gt; alter table xay enable novalidate constraint xay_id; <br>
5.enable constraints <br>
sql&gt; alter table xay enable validate constraint xay_id; <br>
<br>
第六章：LOAD数据 <br>
<br>
1.loading data using direct_load insert <br>
sql&gt; insert /*+append */ into emp nologging <br>
sql&gt; select * from emp_old; <br>
2.parallel direct-load insert <br>
sql&gt; alter session enable parallel dml; <br>
sql&gt; insert /*+parallel(emp,2) */ into emp nologging <br>
sql&gt; select * from emp_old; <br>
3.using sql*loader <br>
sql&gt; sqlldr scott/tiger \ <br>
sql&gt; control = ulcase6.ctl \ <br>
sql&gt; log = ulcase6.log direct=true <br>
<br>
第七章：reorganizing data <br>
<br>
1.using expoty <br>
$exp scott/tiger tables(dept,emp) file=c:\emp.dmp log=exp.log compress=n direct=y <br>
2.using import <br>
$imp scott/tiger tables(dept,emp) file=emp.dmp log=imp.log ignore=y <br>
3.transporting a tablespace <br>
sql&gt;alter tablespace sales_ts read only; <br>
$exp sys/.. file=xay.dmp transport_tablespace=y tablespace=sales_ts <br>
triggers=n constraints=n <br>
$copy datafile <br>
$imp sys/.. file=xay.dmp transport_tablespace=y datafiles=(/disk1/sles01.dbf,/disk2 <br>
/sles02.dbf) <br>
sql&gt; alter tablespace sales_ts read write; <br>
4.checking transport set <br>
sql&gt; DBMS_tts.transport_set_check(ts_list =&gt;'sales_ts' ..,incl_constraints=&gt;true); <br>
在表transport_set_violations 中查看 <br>
sql&gt; dbms_tts.isselfcontained 为true 是， 表示自包含 <br>
<br>
第八章： managing password security and resources <br>
<br>
1.controlling account lock and password <br>
sql&gt; alter user juncky identified by oracle account unlock; <br>
2.user_provided password function <br>
sql&gt; function_name(userid in varchar2(30),password in varchar2(30), <br>
old_password in varchar2(30)) return boolean <br>
3.create a profile : password setting <br>
sql&gt; create profile grace_5 limit failed_login_attempts 3 <br>
sql&gt; password_lock_time unlimited password_life_time 30 <br>
sql&gt;password_reuse_time 30 password_verify_function verify_function <br>
sql&gt; password_grace_time 5; <br>
4.altering a profile <br>
sql&gt; alter profile default failed_login_attempts 3 <br>
sql&gt; password_life_time 60 password_grace_time 10; <br>
5.drop a profile <br>
sql&gt; drop profile grace_5 [cascade]; <br>
6.create a profile : resource limit <br>
sql&gt; create profile developer_prof limit sessions_per_user 2 <br>
sql&gt; cpu_per_session 10000 idle_time 60 connect_time 480; <br>
7. view =&gt; resource_cost : alter resource cost <br>
dba_Users,dba_profiles <br>
8. enable resource limits <br>
sql&gt; alter system set resource_limit=true; <br>
<br>
第九章：Managing users <br>
<br>
1.create a user: database authentication <br>
sql&gt; create user juncky identified by oracle default tablespace users <br>
sql&gt; temporary tablespace temp quota 10m on data password expire <br>
sql&gt; [account lock|unlock] [profile profilename|default]; <br>
2.change user quota on tablespace <br>
sql&gt; alter user juncky quota 0 on users; <br>
3.drop a user <br>
sql&gt; drop user juncky [cascade]; <br>
4. monitor user <br>
view: dba_users , dba_ts_quotas <br>
<br>
第十章：managing privileges <br>
<br>
1.system privileges: view =&gt; system_privilege_map ,dba_sys_privs,session_privs <br>
2.grant system privilege <br>
sql&gt; grant create session,create table to managers; <br>
sql&gt; grant create session to scott with admin option; <br>
with admin option can grant or revoke privilege from any user or role; <br>
3.sysdba and sysoper privileges: <br>
sysoper: startup,shutdown,alter database open|mount,alter database backup controlfile, <br>
alter tablespace begin/end backup,recover database <br>
alter database archivelog,restricted session <br>
sysdba: sysoper privileges with admin option,create database,recover database until <br>
4.password file members: view:=&gt; v$pwfile_users <br>
5.O7_dictionary_accessibility =true restriction access to view or tables in other schema <br>
6.revoke system privilege <br>
sql&gt; revoke create table from karen; <br>
sql&gt; revoke create session from scott; <br>
7.grant object privilege <br>
sql&gt; grant execute on dbms_pipe to public; <br>
sql&gt; grant update(first_name,salary) on employee to karen with grant option; <br>
8.display object privilege : view =&gt; dba_tab_privs, dba_col_privs <br>
9.revoke object privilege <br>
sql&gt; revoke execute on dbms_pipe from scott [cascade constraints]; <br>
10.audit record view :=&gt; sys.aud$ <br>
11. protecting the audit trail <br>
sql&gt; audit delete on sys.aud$ by access; <br>
12.statement auditing <br>
sql&gt; audit user; <br>
13.privilege auditing <br>
sql&gt; audit select any table by summit by access; <br>
14.schema object auditing <br>
sql&gt; audit lock on summit.employee by access whenever successful; <br>
15.view audit option : view=&gt; all_def_audit_opts,dba_stmt_audit_opts,dba_priv_audit_opts,dba_obj_audit_opts <br>
16.view audit result: view=&gt; dba_audit_trail,dba_audit_exists,dba_audit_object,dba_audit_session,dba_audit_statement <br>
<br>
第十一章： manager role <br>
<br>
1.create roles <br>
sql&gt; create role sales_clerk; <br>
sql&gt; create role hr_clerk identified by bonus; <br>
sql&gt; create role hr_manager identified externally; <br>
2.modify role <br>
sql&gt; alter role sales_clerk identified by commission; <br>
sql&gt; alter role hr_clerk identified externally; <br>
sql&gt; alter role hr_manager not identified; <br>
3.assigning roles <br>
sql&gt; grant sales_clerk to scott; <br>
sql&gt; grant hr_clerk to hr_manager; <br>
sql&gt; grant hr_manager to scott with admin option; <br>
4.establish default role <br>
sql&gt; alter user scott default role hr_clerk,sales_clerk; <br>
sql&gt; alter user scott default role all; <br>
sql&gt; alter user scott default role all except hr_clerk; <br>
sql&gt; alter user scott default role none; <br>
5.enable and disable roles <br>
sql&gt; set role hr_clerk; <br>
sql&gt; set role sales_clerk identified by commission; <br>
sql&gt; set role all except sales_clerk; <br>
sql&gt; set role none; <br>
6.remove role from user <br>
sql&gt; revoke sales_clerk from scott; <br>
sql&gt; revoke hr_manager from public; <br>
7.remove role <br>
sql&gt; drop role hr_manager; <br>
8.display role information <br>
view: =&gt;dba_roles,dba_role_privs,role_role_privs,dba_sys_privs,role_sys_privs,role_tab_privs,session_roles <br>
<br>
第十二章: BACKUP and RECOVERY <br>
<br>
1. v$sga,v$instance,v$process,v$bgprocess,v$database,v$datafile,v$sgastat <br>
2. Rman need set dbwr_IO_slaves or backup_tape_IO_slaves and large_pool_size <br>
3. Monitoring Parallel Rollback <br>
&gt; v$fast_start_servers , v$fast_start_transactions <br>
4.perform a closed database backup (noarchivelog) <br>
&gt; shutdown immediate <br>
&gt; cp files /backup/ <br>
&gt; startup <br>
5.restore to a different location <br>
&gt; connect system/manager as sysdba <br>
&gt; startup mount <br>
&gt; alter database rename file '/disk1/../user.dbf' to '/disk2/../user.dbf'; <br>
&gt; alter database open; <br>
6.recover syntax <br>
--recover a mounted database <br>
&gt;recover database; <br>
&gt;recover datafile '/disk1/data/df2.dbf'; <br>
&gt;alter database recover database; <br>
--recover an opened database <br>
&gt;recover tablespace user_data; <br>
&gt;recover datafile 2; <br>
&gt;alter database recover datafile 2; <br>
7.how to apply redo log files automatically <br>
&gt;set autorecovery on <br>
&gt;recover automatic datafile 4; <br>
8.complete recovery: <br>
--method 1(mounted databae) <br>
&gt;copy c:\backup\user.dbf c:\oradata\user.dbf <br>
&gt;startup mount <br>
&gt;recover datafile 'c:\oradata\user.dbf; <br>
&gt;alter database open; <br>
--method 2(opened database,initially opened,not system or rollback datafile) <br>
&gt;copy c:\backup\user.dbf c:\oradata\user.dbf (alter tablespace offline) <br>
&gt;recover datafile 'c:\oradata\user.dbf' or <br>
&gt;recover tablespace user_data; <br>
&gt;alter database datafile 'c:\oradata\user.dbf' online or <br>
&gt;alter tablespace user_data online; <br>
--method 3(opened database,initially closed not system or rollback datafile) <br>
&gt;startup mount <br>
&gt;alter database datafile 'c:\oradata\user.dbf' offline; <br>
&gt;alter database open <br>
&gt;copy c:\backup\user.dbf d:\oradata\user.dbf <br>
&gt;alter database rename file 'c:\oradata\user.dbf' to 'd:\oradata\user.dbf' <br>
&gt;recover datafile 'e:\oradata\user.dbf' or recover tablespace user_data; <br>
&gt;alter tablespace user_data online; <br>
--method 4(loss of data file with no backup and have all archive log) <br>
&gt;alter tablespace user_data offline immediate; <br>
&gt;alter database create datafile 'd:\oradata\user.dbf' as 'c:\oradata\user.dbf'' <br>
&gt;recover tablespace user_data; <br>
&gt;alter tablespace user_data online <br>
5.perform an open database backup <br>
&gt; alter tablespace user_data begin backup; <br>
&gt; copy files /backup/ <br>
&gt; alter database datafile '/c:/../data.dbf' end backup; <br>
&gt; alter system switch logfile; <br>
6.backup a control file <br>
&gt; alter database backup controlfile to 'control1.bkp'; <br>
&gt; alter database backup controlfile to trace; <br>
7.recovery (noarchivelog mode) <br>
&gt; shutdown abort <br>
&gt; cp files <br>
&gt; startup <br>
8.recovery of file in backup mode <br>
&gt;alter database datafile 2 end backup; <br>
9.clearing redo log file <br>
&gt;alter database clear unarchived logfile group 1; <br>
&gt;alter database clear unarchived logfile group 1 unrecoverable datafile; <br>
10.redo log recovery <br>
&gt;alter database add logfile group 3 'c:\oradata\redo03.log' size 1000k; <br>
&gt;alter database drop logfile group 1; <br>
&gt;alter database open; <br>
or &gt;cp c:\oradata\redo02.log' c:\oradata\redo01.log <br>
&gt;alter database clear logfile 'c:\oradata\log01.log';</span></font><img src ="http://www.blogjava.net/Vencent/aggbug/35130.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-03-13 21:01 <a href="http://www.blogjava.net/Vencent/articles/35130.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>持久对象原生数据库查询语言（中文版）——预览</title><link>http://www.blogjava.net/Vencent/articles/32615.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Mon, 27 Feb 2006 04:32:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/32615.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/32615.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/32615.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/32615.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/32615.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 持久对象原生数据库查询语言设计白皮书&nbsp;&nbsp;&nbsp;William R. Cook&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;<a href='http://www.blogjava.net/Vencent/articles/32615.html'>阅读全文</a><img src ="http://www.blogjava.net/Vencent/aggbug/32615.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-02-27 12:32 <a href="http://www.blogjava.net/Vencent/articles/32615.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL性能优化系列 (十三)</title><link>http://www.blogjava.net/Vencent/articles/32454.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Sat, 25 Feb 2006 14:34:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/32454.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/32454.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/32454.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/32454.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/32454.html</trackback:ping><description><![CDATA[<table cellpadding="0" cellspacing="0"><tbody><tr><td class="font14" align="center"><div class="style34 style35" align="center"><strong>ORACLE 
              SQL性能优化系列 (十三) </strong></div></td>
        </tr>
        <tr>
          <td class="font12 style36" align="center"><div align="center"><br>
          作者: black_snail</div></td>
        </tr>
        <tr>
          <td class="font12"><br></td>
        </tr>
        <tr>
          <td class="font12" align="center"><table cellpadding="0" cellspacing="0">
              <tbody><tr>
                <td><p class="style35">&nbsp;</p>
                  <p class="style35">关键字 ORACLE PERFORMANCE TUNING PL/SQL <br>
                    <br>
            出处 http://www.dbasupport.com <br>
            <br>
            <br>
            <br>
            43. 用WHERE替代ORDER BY <br>
            <br>
            ORDER BY 子句只在两种严格的条件下使用索引. <br>
            <br>
            <br>
            ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序. <br>
            <br>
            ORDER BY中所有的列必须定义为非空. <br>
            <br>
            <br>
            WHERE子句使用的索引和ORDER BY子句中所使用的索引不能并列. <br>
            <br>
            <br>
            例如: <br>
            <br>
            表DEPT包含以下列: <br>
            <br>
            DEPT_CODE PK NOT NULL <br>
            <br>
            DEPT_DESC NOT NULL <br>
            <br>
            DEPT_TYPE NULL <br>
            <br>
            <br>
            非唯一性的索引(DEPT_TYPE) <br>
            <br>
            <br>
            低效: (索引不被使用) <br>
            <br>
            SELECT DEPT_CODE <br>
            <br>
            FROM DEPT <br>
            <br>
            ORDER BY DEPT_TYPE <br>
            <br>
            <br>
            EXPLAIN PLAN: <br>
            <br>
            SORT ORDER BY <br>
            <br>
            TABLE ACCESS FULL <br>
            <br>
            <br>
            高效: (使用索引) <br>
            <br>
            <br>
            SELECT DEPT_CODE <br>
            <br>
            FROM DEPT <br>
            <br>
            WHERE DEPT_TYPE &gt; 0 <br>
            <br>
            <br>
            EXPLAIN PLAN: <br>
            <br>
            TABLE ACCESS BY ROWID ON EMP <br>
            <br>
            INDEX RANGE SCAN ON DEPT_IDX <br>
            <br>
            译者按: <br>
            <br>
            ORDER BY 也能使用索引! 这的确是个容易被忽视的知识点. 我们来验证一下: <br>
            <br>
            SQL&gt; select * from emp order by empno; <br>
            <br>
            Execution Plan <br>
            <br>
            ---------------------------------------------------------- <br>
            <br>
            0 SELECT STATEMENT Optimizer=CHOOSE <br>
            <br>
            1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP' <br>
            <br>
            2 1 INDEX (FULL SCAN) OF 'EMPNO' (UNIQUE) <br>
            <br>
            <br>
            <br>
            44. 避免改变索引列的类型. <br>
            <br>
            当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换. <br>
            <br>
            <br>
            假设 EMPNO是一个数值类型的索引列. <br>
            <br>
            <br>
            SELECT … <br>
            <br>
            FROM EMP <br>
            <br>
            WHERE EMPNO = ‘123' <br>
            <br>
            <br>
            实际上,经过ORACLE类型转换, 语句转化为: <br>
            <br>
            SELECT … <br>
            <br>
            FROM EMP <br>
            <br>
            WHERE EMPNO = TO_NUMBER(‘123') <br>
            <br>
            <br>
            幸运的是,类型转换没有发生在索引列上,索引的用途没有被改变. <br>
            <br>
            <br>
            现在,假设EMP_TYPE是一个字符类型的索引列. <br>
            <br>
            SELECT … <br>
            <br>
            FROM EMP <br>
            <br>
            WHERE EMP_TYPE = 123 <br>
            <br>
            <br>
            这个语句被ORACLE转换为: <br>
            <br>
            SELECT … <br>
            <br>
            FROM EMP <br>
            <br>
            WHERE TO_NUMBER(EMP_TYPE)=123 <br>
            <br>
            <br>
            因为内部发生的类型转换, 这个索引将不会被用到! <br>
            <br>
            译者按: <br>
            <br>
            为了避免ORACLE对你的SQL进行隐式的类型转换, 最好把类型转换用显式表现出来. 注意当字符和数值比较时, ORACLE会优先转换数值类型到字符类型. <br>
            <br>
            <br>
            <br>
            45. 需要当心的WHERE子句 <br>
            <br>
            某些SELECT 语句中的WHERE子句不使用索引. 这里有一些例子. <br>
            <br>
            在下面的例子里, ‘!=' 将不使用索引. 记住, 索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中. <br>
            <br>
            不使用索引: <br>
            <br>
            SELECT ACCOUNT_NAME <br>
            <br>
            FROM TRANSACTION <br>
            <br>
            WHERE AMOUNT !=0; <br>
            <br>
            使用索引: <br>
            <br>
            SELECT ACCOUNT_NAME <br>
            <br>
            FROM TRANSACTION <br>
            <br>
            WHERE AMOUNT &gt;0; <br>
            <br>
            <br>
            下面的例子中, ‘||'是字符连接函数. 就象其他函数那样, 停用了索引. <br>
            <br>
            不使用索引: <br>
            <br>
            SELECT ACCOUNT_NAME,AMOUNT <br>
            <br>
            FROM TRANSACTION <br>
            <br>
            WHERE ACCOUNT_NAME||ACCOUNT_TYPE='AMEXA'; <br>
            <br>
            使用索引: <br>
            <br>
            SELECT ACCOUNT_NAME,AMOUNT <br>
            <br>
            FROM TRANSACTION <br>
            <br>
            WHERE ACCOUNT_NAME = ‘AMEX' <br>
            <br>
            AND ACCOUNT_TYPE=' A'; <br>
            <br>
            <br>
            下面的例子中, ‘+'是数学函数. 就象其他数学函数那样, 停用了索引. <br>
            <br>
            不使用索引: <br>
            <br>
            SELECT ACCOUNT_NAME, AMOUNT <br>
            <br>
            FROM TRANSACTION <br>
            <br>
            WHERE AMOUNT + 3000 &gt;5000; <br>
            <br>
            使用索引: <br>
            <br>
            SELECT ACCOUNT_NAME, AMOUNT <br>
            <br>
            FROM TRANSACTION <br>
            <br>
            WHERE AMOUNT &gt; 2000 ; <br>
            <br>
            下面的例子中,相同的索引列不能互相比较,这将会启用全表扫描. <br>
            <br>
            不使用索引: <br>
            <br>
            SELECT ACCOUNT_NAME, AMOUNT <br>
            <br>
            FROM TRANSACTION <br>
            <br>
            WHERE ACCOUNT_NAME = NVL(:ACC_NAME,ACCOUNT_NAME); <br>
            <br>
            使用索引: <br>
            <br>
            SELECT ACCOUNT_NAME, AMOUNT <br>
            <br>
            FROM TRANSACTION <br>
            <br>
            WHERE ACCOUNT_NAME LIKE NVL(:ACC_NAME,'%'); <br>
            <br>
            <br>
            译者按: <br>
            <br>
            如果一定要对使用函数的列启用索引, ORACLE新的功能: 基于函数的索引(Function-Based Index) 也许是一个较好的方案. <br>
            <br>
            CREATE INDEX EMP_I ON EMP (UPPER(ename)); /*建立基于函数的索引*/ <br>
            <br>
            SELECT * FROM emp WHERE UPPER(ename) = ‘BLACKSNAIL'; /*将使用索引*/ </p></td></tr></tbody></table></td></tr></tbody></table><img src ="http://www.blogjava.net/Vencent/aggbug/32454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-02-25 22:34 <a href="http://www.blogjava.net/Vencent/articles/32454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL性能优化系列 (十四) 完结篇</title><link>http://www.blogjava.net/Vencent/articles/32455.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Sat, 25 Feb 2006 14:34:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/32455.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/32455.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/32455.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/32455.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/32455.html</trackback:ping><description><![CDATA[<table cellpadding="0" cellspacing="0"><tbody><tr><td class="font14" align="center"><div class="style34 style35" align="center"><strong>ORACLE 
              SQL性能优化系列 (十四) 完结篇 </strong></div></td>
        </tr>
        <tr>
          <td class="font12" align="center"><div class="style36" align="center"><br>
          作者: black_snail</div></td>
        </tr>
        <tr>
          <td class="font12"><br></td>
        </tr>
        <tr>
          <td class="font12" align="center"><table cellpadding="0" cellspacing="0">
              <tbody><tr>
                <td><p class="style35">&nbsp;</p>
                  <p class="style35">关键字 ORACLE PERFORMANCE TUNING PL/SQL <br>
                    <br>
            出处 http://www.dbasupport.com <br>
            <br>
            <br>
            <br>
            46. 连接多个扫描 <br>
            <br>
            如果你对一个列和一组有限的值进行比较, 优化器可能执行多次扫描并对结果进行合并连接. <br>
            <br>
            举例: <br>
            <br>
            SELECT * <br>
            <br>
            FROM LODGING <br>
            <br>
            WHERE MANAGER IN (‘BILL GATES','KEN MULLER'); <br>
            <br>
            <br>
            优化器可能将它转换成以下形式 <br>
            <br>
            SELECT * <br>
            <br>
            FROM LODGING <br>
            <br>
            WHERE MANAGER = ‘BILL GATES' <br>
            <br>
            OR MANAGER = 'KEN MULLER'; <br>
            <br>
            <br>
            当选择执行路径时, 优化器可能对每个条件采用LODGING$MANAGER上的索引范围扫描. 返回的ROWID用来访问LODGING表的记录
            (通过TABLE ACCESS BY ROWID 的方式). 最后两组记录以连接(CONCATENATION)的形式被组合成一个单一的集合. <br>
                  <br>
                  <br>
                  Explain Plan : <br>
            <br>
            <br>
            SELECT STATEMENT Optimizer=CHOOSE <br>
            <br>
            CONCATENATION <br>
            <br>
            TABLE ACCESS (BY INDEX ROWID) OF LODGING <br>
            <br>
            INDEX (RANGE SCAN ) OF LODGING$MANAGER (NON-UNIQUE) <br>
            <br>
            TABLE ACCESS (BY INDEX ROWID) OF LODGING <br>
            <br>
            INDEX (RANGE SCAN ) OF LODGING$MANAGER (NON-UNIQUE) <br>
            <br>
            译者按: <br>
            <br>
            本节和第37节似乎有矛盾之处. <br>
            <br>
            <br>
            <br>
            47. CBO下使用更具选择性的索引 <br>
            <br>
            基于成本的优化器(CBO, Cost-Based Optimizer)对索引的选择性进行判断来决定索引的使用是否能提高效率. <br>
            <br>
            如果索引有很高的选择性, 那就是说对于每个不重复的索引键值,只对应数量很少的记录. <br>
            <br>
            比如, 表中共有100条记录而其中有80个不重复的索引键值. 这个索引的选择性就是80/100 = 0.8 . 选择性越高, 通过索引键值检索出的记录就越少. <br>
            <br>
            如果索引的选择性很低, 检索数据就需要大量的索引范围查询操作和ROWID 访问表的 <br>
            <br>
            操作. 也许会比全表扫描的效率更低. <br>
            <br>
            <br>
            译者按: <br>
            <br>
            下列经验请参阅: <br>
            <br>
            a. 如果检索数据量超过30%的表中记录数.使用索引将没有显著的效率提高. <br>
            <br>
            b. 在特定情况下, 使用索引也许会比全表扫描慢, 但这是同一个数量级上的 <br>
            <br>
            区别. 而通常情况下,使用索引比全表扫描要块几倍乃至几千倍! <br>
            <br>
            <br>
            <br>
            48. 避免使用耗费资源的操作 <br>
            <br>
            带有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL语句会启动SQL引擎 <br>
            <br>
            执行耗费资源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要执行两次排序. <br>
            <br>
            例如,一个UNION查询,其中每个查询都带有GROUP BY子句, GROUP BY会触发嵌入排序(NESTED SORT) ;
            这样, 每个查询需要执行一次排序, 然后在执行UNION时, 又一个唯一排序(SORT UNIQUE)操作被执行而且它只能在前面的嵌入排序结束后才能开始执行.
            嵌入的排序的深度会大大影响查询的效率. <br>
                  <br>
            通常, 带有UNION, MINUS , INTERSECT的SQL语句都可以用其他方式重写. <br>
            <br>
            译者按: <br>
            <br>
            如果你的数据库的SORT_AREA_SIZE调配得好, 使用UNION , MINUS, INTERSECT也是可以考虑的, 毕竟它们的可读性很强 <br>
            <br>
            <br>
            <br>
            49. 优化GROUP BY <br>
            <br>
            提高GROUP BY 语句的效率, 可以通过将不需要的记录在GROUP BY 之前过滤掉.下面两个查询返回相同结果但第二个明显就快了许多. <br>
            <br>
            <br>
            低效: <br>
            <br>
            SELECT JOB , AVG(SAL) <br>
            <br>
            FROM EMP <br>
            <br>
            GROUP JOB <br>
            <br>
            HAVING JOB = ‘PRESIDENT' <br>
            <br>
            OR JOB = ‘MANAGER' <br>
            <br>
            高效: <br>
            <br>
            SELECT JOB , AVG(SAL) <br>
            <br>
            FROM EMP <br>
            <br>
            WHERE JOB = ‘PRESIDENT' <br>
            <br>
            OR JOB = ‘MANAGER' <br>
            <br>
            GROUP JOB <br>
            <br>
            <br>
            译者按: <br>
            <br>
            本节和14节相同. 可略过. <br>
            <br>
            <br>
            <br>
            50. 使用日期 <br>
            <br>
            当使用日期是,需要注意如果有超过5位小数加到日期上, 这个日期会进到下一天! <br>
            <br>
            <br>
            例如: <br>
            <br>
            1. <br>
            <br>
            SELECT TO_DATE(‘01-JAN-93'+.99999) <br>
            <br>
            FROM DUAL; <br>
            <br>
            <br>
            Returns: <br>
            <br>
            '01-JAN-93 23:59:59' <br>
            <br>
            2. <br>
            <br>
            SELECT TO_DATE(‘01-JAN-93'+.999999) <br>
            <br>
            FROM DUAL; <br>
            <br>
            <br>
            Returns: <br>
            <br>
            '02-JAN-93 00:00:00' <br>
            <br>
            <br>
            译者按: <br>
            <br>
            虽然本节和SQL性能优化没有关系, 但是作者的功力可见一斑 <br>
            <br>
            <br>
            <br>
            51. 使用显式的游标(CURSORs) <br>
            <br>
            使用隐式的游标,将会执行两次操作. 第一次检索记录, 第二次检查TOO MANY ROWS 这个exception . 而显式游标不执行第二次操作. <br>
            <br>
            <br>
            <br>
            52. 优化EXPORT和IMPORT <br>
            <br>
            使用较大的BUFFER(比如10MB , 10,240,000)可以提高EXPORT和IMPORT的速度. <br>
            <br>
            ORACLE将尽可能地获取你所指定的内存大小,即使在内存不满足,也不会报错.这个值至少要和表中最大的列相当,否则列值会被截断. <br>
            <br>
            译者按: <br>
            <br>
            可以肯定的是, 增加BUFFER会大大提高EXPORT , IMPORT的效率. (曾经碰到过一个CASE, 增加BUFFER后,IMPORT/EXPORT快了10倍!) <br>
            <br>
            作者可能犯了一个错误: “这个值至少要和表中最大的列相当,否则列值会被截断. “ <br>
            <br>
            其中最大的列也许是指最大的记录大小. <br>
            <br>
            关于EXPORT/IMPORT的优化,CSDN论坛中有一些总结性的贴子,比如关于BUFFER参数, COMMIT参数等等, 详情请查. <br>
            <br>
            <br>
            <br>
            53. 分离表和索引 <br>
            <br>
            总是将你的表和索引建立在不同的表空间内(TABLESPACES). 决不要将不属于ORACLE内部系统的对象存放到SYSTEM表空间里.
            同时,确保数据表空间和索引表空间置于不同的硬盘上. <br>
                  <br>
                  <br>
                  译者按: <br>
            <br>
            “同时,确保数据表空间和索引表空间置与不同的硬盘上.”可能改为如下更为准确 “同时,确保数据表空间和索引表空间置与不同的硬盘控制卡控制的硬盘上.” <br>
            <br>
            <br>
            (全文完) <br>
            <br>作者：</p><p class="style35">Black_Snail <br>
            <br>
            ligang1000@hotmail.com <br>
            <br>
            4/Sep/2003 </p></td></tr></tbody></table></td></tr></tbody></table><img src ="http://www.blogjava.net/Vencent/aggbug/32455.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-02-25 22:34 <a href="http://www.blogjava.net/Vencent/articles/32455.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL性能优化系列 (十)</title><link>http://www.blogjava.net/Vencent/articles/32451.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Sat, 25 Feb 2006 14:33:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/32451.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/32451.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/32451.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/32451.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/32451.html</trackback:ping><description><![CDATA[<table cellpadding="0" cellspacing="0"><tbody><tr><td class="font14" align="center"><div class="style34 style35" align="center"><strong>ORACLE 
              SQL性能优化系列 (十) </strong></div></td>
        </tr>
        <tr>
          <td class="style35 style36" align="center"><div align="center"><br>
          作者: black_snail</div></td>
        </tr>
        <tr>
          <td class="font12"><br></td>
        </tr>
        <tr>
          <td class="font12" align="center"><table cellpadding="0" cellspacing="0">
              <tbody><tr>
                <td><p class="style35">&nbsp;</p>
                  <p class="style35">关键字 ORACLE PERFORMANCE TUNING PL/SQL <br>
                    <br>
            出处 http://WWW.DBASUPPORT.COM <br>
            <br>
            <br>
            <br>
            31. 强制索引失效 <br>
            <br>
            <br>
            如果两个或以上索引具有相同的等级,你可以强制命令ORACLE优化器使用其中的一个(通过它,检索出的记录数量少) . <br>
            <br>
            <br>
            举例: <br>
            <br>
            <br>
            SELECT ENAME <br>
            <br>
            FROM EMP <br>
            <br>
            WHERE EMPNO = 7935 <br>
            <br>
            AND DEPTNO + 0 = 10 /*DEPTNO上的索引将失效*/ <br>
            <br>
            AND EMP_TYPE || ‘' = ‘A' /*EMP_TYPE上的索引将失效*/ <br>
            <br>
            <br>
            这是一种相当直接的提高查询效率的办法. 但是你必须谨慎考虑这种策略,一般来说,只有在你希望单独优化几个SQL时才能采用它. <br>
            <br>
            <br>
            这里有一个例子关于何时采用这种策略, <br>
            <br>
            <br>
            假设在EMP表的EMP_TYPE列上有一个非唯一性的索引而EMP_CLASS上没有索引. <br>
            <br>
            <br>
            SELECT ENAME <br>
            <br>
            FROM EMP <br>
            <br>
            WHERE EMP_TYPE = ‘A' <br>
            <br>
            AND EMP_CLASS = ‘X'; <br>
            <br>
            <br>
优化器会注意到EMP_TYPE上的索引并使用它. 这是目前唯一的选择. 如果,一段时间以后,
另一个非唯一性建立在EMP_CLASS上,优化器必须对两个索引进行选择,在通常情况下,优化器将使用两个索引并在他们的结果集合上执行排序及合并.
然而,如果其中一个索引（EMP_TYPE）接近于唯一性而另一个索引（EMP_CLASS）上有几千个重复的值.
排序及合并就会成为一种不必要的负担. 在这种情况下,你希望使优化器屏蔽掉EMP_CLASS索引. <br>
                  <br>
            用下面的方案就可以解决问题. <br>
            <br>
            SELECT ENAME <br>
            <br>
            FROM EMP <br>
            <br>
            WHERE EMP_TYPE = ‘A' <br>
            <br>
            AND EMP_CLASS||'' = ‘X'; <br>
            <br>
            <br>
            <br>
            32. 避免在索引列上使用计算． <br>
            <br>
            WHERE子句中，如果索引列是函数的一部分．优化器将不使用索引而使用全表扫描． <br>
            <br>
            <br>
            举例: <br>
            <br>
            <br>
            低效： <br>
            <br>
            SELECT … <br>
            <br>
            FROM DEPT <br>
            <br>
            WHERE SAL * 12 &gt; 25000; <br>
            <br>
            <br>
            高效: <br>
            <br>
            SELECT … <br>
            <br>
            FROM DEPT <br>
            <br>
            WHERE SAL &gt; 25000/12; <br>
            <br>
            <br>
            译者按: <br>
            <br>
            这是一个非常实用的规则，请务必牢记 <br>
            <br>
            <br>
            <br>
            33. 自动选择索引 <br>
            <br>
            如果表中有两个以上（包括两个）索引，其中有一个唯一性索引，而其他是非唯一性． <br>
            <br>
            在这种情况下，ORACLE将使用唯一性索引而完全忽略非唯一性索引． <br>
            <br>
            <br>
            举例: <br>
            <br>
            SELECT ENAME <br>
            <br>
            FROM EMP <br>
            <br>
            WHERE EMPNO = 2326 <br>
            <br>
            AND DEPTNO = 20 ; <br>
            <br>
            <br>
            这里，只有EMPNO上的索引是唯一性的，所以EMPNO索引将用来检索记录． <br>
            <br>
            TABLE ACCESS BY ROWID ON EMP <br>
            <br>
            INDEX UNIQUE SCAN ON EMP_NO_IDX <br>
            <br>
            <br>
            <br>
            34. 避免在索引列上使用NOT <br>
            <br>
            通常，　我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的 <br>
            <br>
            影响. 当ORACLE”遇到”NOT,他就会停止使用索引转而执行全表扫描. <br>
            <br>
            举例: <br>
            <br>
            <br>
            低效: (这里,不使用索引) <br>
            <br>
            <br>
            SELECT … <br>
            <br>
            FROM DEPT <br>
            <br>
            WHERE DEPT_CODE NOT = 0; <br>
            <br>
            <br>
            高效: (这里,使用了索引) <br>
            <br>
            <br>
            SELECT … <br>
            <br>
            FROM DEPT <br>
            <br>
            WHERE DEPT_CODE &gt; 0; <br>
            <br>
            <br>
            需要注意的是,在某些时候, ORACLE优化器会自动将NOT转化成相对应的关系操作符. <br>
            <br>
            NOT &gt; to &lt;= <br>
            <br>
            NOT &gt;= to &lt; <br>
            <br>
            NOT &lt; to &gt;= <br>
            <br>
            NOT &lt;= to &gt; <br>
            <br>
            <br>
            <br>
            译者按: <br>
            <br>
            在这个例子中,作者犯了一些错误. 例子中的低效率SQL是不能被执行的. <br>
            <br>
            我做了一些测试: <br>
            <br>
            <br>
            SQL&gt; select * from emp where NOT empno &gt; 1; <br>
            <br>
            no rows selected <br>
            <br>
            Execution Plan <br>
            <br>
            ---------------------------------------------------------- <br>
            <br>
            0 SELECT STATEMENT Optimizer=CHOOSE <br>
            <br>
            1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP' <br>
            <br>
            2 1 INDEX (RANGE SCAN) OF 'EMPNO' (UNIQUE) <br>
            <br>
            <br>
            SQL&gt; select * from emp where empno &lt;= 1; <br>
            <br>
            no rows selected <br>
            <br>
            Execution Plan <br>
            <br>
            ---------------------------------------------------------- <br>
            <br>
            0 SELECT STATEMENT Optimizer=CHOOSE <br>
            <br>
            1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP' <br>
            <br>
            2 1 INDEX (RANGE SCAN) OF 'EMPNO' (UNIQUE) <br>
            <br>
            <br>
            两者的效率完全一样，也许这符合作者关于” 在某些时候, ORACLE优化器会自动将NOT转化成相对应的关系操作符” 的观点． <br>
            <br>
            <br>
            <br>
            35. 用&gt;=替代&gt; <br>
            <br>
            <br>
            如果DEPTNO上有一个索引, <br>
            <br>
            <br>
            高效: <br>
            <br>
            <br>
            SELECT * <br>
            <br>
            FROM EMP <br>
            <br>
            WHERE DEPTNO &gt;=4 <br>
            <br>
            <br>
            低效: <br>
            <br>
            <br>
            SELECT * <br>
            <br>
            FROM EMP <br>
            <br>
            WHERE DEPTNO &gt;3 <br>
            <br>
            <br>
            两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定位到DEPTNO=3的记录并且向前扫描到第一个DEPT大于3的记录. </p></td></tr></tbody></table></td></tr></tbody></table><img src ="http://www.blogjava.net/Vencent/aggbug/32451.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-02-25 22:33 <a href="http://www.blogjava.net/Vencent/articles/32451.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL性能优化系列 (十一)</title><link>http://www.blogjava.net/Vencent/articles/32452.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Sat, 25 Feb 2006 14:33:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/32452.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/32452.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/32452.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/32452.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/32452.html</trackback:ping><description><![CDATA[<table cellpadding="0" cellspacing="0"><tbody><tr><td class="font14" align="center"><div class="style34 style35" align="center"><strong>ORACLE 
              SQL性能优化系列 (十一) </strong></div></td>
        </tr>
        <tr>
          <td class="font12 style35 style36" align="center"><div align="center"><br>
          作者: black_snail</div></td>
        </tr>
        <tr>
          <td class="font12"><br></td>
        </tr>
        <tr>
          <td class="font12" align="center"><table cellpadding="0" cellspacing="0">
              <tbody><tr>
                <td><p class="style35">&nbsp;</p>
                  <p class="style35">关键字 ORACLE PERFORMANCE PL/SQL TUNING <br>
                    <br>
            出处 http://www.dbasupport.com <br>
            <br>
            <br>
            <br>
            36. 用UNION替换OR (适用于索引列) <br>
            <br>
            通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效.
            如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低. <br>
                  <br>
            在下面的例子中, LOC_ID 和REGION上都建有索引. <br>
            <br>
            高效: <br>
            <br>
            SELECT LOC_ID , LOC_DESC , REGION <br>
            <br>
            FROM LOCATION <br>
            <br>
            WHERE LOC_ID = 10 <br>
            <br>
            UNION <br>
            <br>
            SELECT LOC_ID , LOC_DESC , REGION <br>
            <br>
            FROM LOCATION <br>
            <br>
            WHERE REGION = “MELBOURNE” <br>
            <br>
            <br>
            低效: <br>
            <br>
            SELECT LOC_ID , LOC_DESC , REGION <br>
            <br>
            FROM LOCATION <br>
            <br>
            WHERE LOC_ID = 10 OR REGION = “MELBOURNE” <br>
            <br>
            <br>
            如果你坚持要用OR, 那就需要返回记录最少的索引列写在最前面. <br>
            <br>
            <br>
            注意: <br>
            <br>
            <br>
            WHERE KEY1 = 10 (返回最少记录) <br>
            <br>
            OR KEY2 = 20 (返回最多记录) <br>
            <br>
            <br>
            ORACLE 内部将以上转换为 <br>
            <br>
            WHERE KEY1 = 10 AND <br>
            <br>
            ((NOT KEY1 = 10) AND KEY2 = 20) <br>
            <br>
            <br>
            译者按: <br>
            <br>
            <br>
            下面的测试数据仅供参考: (a = 1003 返回一条记录 , b = 1 返回1003条记录) <br>
            <br>
            SQL&gt; select * from unionvsor /*1st test*/ <br>
            <br>
            2 where a = 1003 or b = 1; <br>
            <br>
            1003 rows selected. <br>
            <br>
            Execution Plan <br>
            <br>
            ---------------------------------------------------------- <br>
            <br>
            0 SELECT STATEMENT Optimizer=CHOOSE <br>
            <br>
            1 0 CONCATENATION <br>
            <br>
            2 1 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR' <br>
            <br>
            3 2 INDEX (RANGE SCAN) OF 'UB' (NON-UNIQUE) <br>
            <br>
            4 1 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR' <br>
            <br>
            5 4 INDEX (RANGE SCAN) OF 'UA' (NON-UNIQUE) <br>
            <br>
            Statistics <br>
            <br>
            ---------------------------------------------------------- <br>
            <br>
            0 recursive calls <br>
            <br>
            0 db block gets <br>
            <br>
            144 consistent gets <br>
            <br>
            0 physical reads <br>
            <br>
            0 redo size <br>
            <br>
            63749 bytes sent via SQL*Net to client <br>
            <br>
            7751 bytes received via SQL*Net from client <br>
            <br>
            68 SQL*Net roundtrips to/from client <br>
            <br>
            0 sorts (memory) <br>
            <br>
            0 sorts (disk) <br>
            <br>
            1003 rows processed <br>
            <br>
            SQL&gt; select * from unionvsor /*2nd test*/ <br>
            <br>
            2 where b = 1 or a = 1003 ; <br>
            <br>
            1003 rows selected. <br>
            <br>
            Execution Plan <br>
            <br>
            ---------------------------------------------------------- <br>
            <br>
            0 SELECT STATEMENT Optimizer=CHOOSE <br>
            <br>
            1 0 CONCATENATION <br>
            <br>
            2 1 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR' <br>
            <br>
            3 2 INDEX (RANGE SCAN) OF 'UA' (NON-UNIQUE) <br>
            <br>
            4 1 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR' <br>
            <br>
            5 4 INDEX (RANGE SCAN) OF 'UB' (NON-UNIQUE) <br>
            <br>
            Statistics <br>
            <br>
            ---------------------------------------------------------- <br>
            <br>
            0 recursive calls <br>
            <br>
            0 db block gets <br>
            <br>
            143 consistent gets <br>
            <br>
            0 physical reads <br>
            <br>
            0 redo size <br>
            <br>
            63749 bytes sent via SQL*Net to client <br>
            <br>
            7751 bytes received via SQL*Net from client <br>
            <br>
            68 SQL*Net roundtrips to/from client <br>
            <br>
            0 sorts (memory) <br>
            <br>
            0 sorts (disk) <br>
            <br>
            1003 rows processed <br>
            <br>
            <br>
            <br>
            SQL&gt; select * from unionvsor /*3rd test*/ <br>
            <br>
            2 where a = 1003 <br>
            <br>
            3 union <br>
            <br>
            4 select * from unionvsor <br>
            <br>
            5 where b = 1; <br>
            <br>
            1003 rows selected. <br>
            <br>
            Execution Plan <br>
            <br>
            ---------------------------------------------------------- <br>
            <br>
            0 SELECT STATEMENT Optimizer=CHOOSE <br>
            <br>
            1 0 SORT (UNIQUE) <br>
            <br>
            2 1 UNION-ALL <br>
            <br>
            3 2 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR' <br>
            <br>
            4 3 INDEX (RANGE SCAN) OF 'UA' (NON-UNIQUE) <br>
            <br>
            5 2 TABLE ACCESS (BY INDEX ROWID) OF 'UNIONVSOR' <br>
            <br>
            6 5 INDEX (RANGE SCAN) OF 'UB' (NON-UNIQUE) <br>
            <br>
            Statistics <br>
            <br>
            ---------------------------------------------------------- <br>
            <br>
            0 recursive calls <br>
            <br>
            0 db block gets <br>
            <br>
            10 consistent gets <br>
            <br>
            0 physical reads <br>
            <br>
            0 redo size <br>
            <br>
            63735 bytes sent via SQL*Net to client <br>
            <br>
            7751 bytes received via SQL*Net from client <br>
            <br>
            68 SQL*Net roundtrips to/from client <br>
            <br>
            1 sorts (memory) <br>
            <br>
            0 sorts (disk) <br>
            <br>
            1003 rows processed <br>
            <br>
            用UNION的效果可以从consistent gets和 SQL*NET的数据交换量的减少看出 <br>
            <br>
            <br>
            <br>
            37. 用IN来替换OR <br>
            <br>
            <br>
            下面的查询可以被更有效率的语句替换: <br>
            <br>
            <br>
            低效: <br>
            <br>
            <br>
            SELECT…. <br>
            <br>
            FROM LOCATION <br>
            <br>
            WHERE LOC_ID = 10 <br>
            <br>
            OR LOC_ID = 20 <br>
            <br>
            OR LOC_ID = 30 <br>
            <br>
            <br>
            高效 <br>
            <br>
            SELECT… <br>
            <br>
            FROM LOCATION <br>
            <br>
            WHERE LOC_IN IN (10,20,30); <br>
            <br>
            <br>
            译者按: <br>
            <br>
            这是一条简单易记的规则，但是实际的执行效果还须检验，在ORACLE8i下，两者的执行路径似乎是相同的．　 <br>
            <br>
            <br>
            <br>
            38. 避免在索引列上使用IS NULL和IS NOT NULL <br>
            <br>
            避免在索引中使用任何可以为空的列，ORACLE将无法使用该索引 ．对于单列索引，如果列包含空值，索引中将不存在此记录. 对于复合索引，如果每个列都为空，索引中同样不存在此记录.　如果至少有一个列不为空，则记录存在于索引中． <br>
            <br>
            举例: <br>
            <br>
            如果唯一性索引建立在表的A列和B列上, 并且表中存在一条记录的A,B值为(123,null) , ORACLE将不接受下一条具有相同A,B值（123,null）的记录(插入).
            然而如果 <br>
                  <br>
            所有的索引列都为空，ORACLE将认为整个键值为空而空不等于空. 因此你可以插入1000 <br>
            <br>
            条具有相同键值的记录,当然它们都是空! <br>
            <br>
            <br>
            因为空值不存在于索引列中,所以WHERE子句中对索引列进行空值比较将使ORACLE停用该索引. <br>
            <br>
            举例: <br>
            <br>
            <br>
            低效: (索引失效) <br>
            <br>
            SELECT … <br>
            <br>
            FROM DEPARTMENT <br>
            <br>
            WHERE DEPT_CODE IS NOT NULL; <br>
            <br>
            <br>
            高效: (索引有效) <br>
            <br>
            SELECT … <br>
            <br>
            FROM DEPARTMENT <br>
            <br>
            WHERE DEPT_CODE &gt;=0; </p></td></tr></tbody></table></td></tr></tbody></table><img src ="http://www.blogjava.net/Vencent/aggbug/32452.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-02-25 22:33 <a href="http://www.blogjava.net/Vencent/articles/32452.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL性能优化系列 (十二)</title><link>http://www.blogjava.net/Vencent/articles/32453.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Sat, 25 Feb 2006 14:33:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/32453.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/32453.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/32453.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/32453.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/32453.html</trackback:ping><description><![CDATA[<table cellpadding="0" cellspacing="0"><tbody><tr><td class="font14" align="center"><div class="style34 style35" align="center"><strong>ORACLE 
              SQL性能优化系列 (十二) </strong></div></td>
        </tr>
        <tr>
          <td class="font12" align="center"><div class="style36" align="center"><br>
          作者: black_snail</div></td>
        </tr>
        <tr>
          <td class="font12"><br></td>
        </tr>
        <tr>
          <td class="font12" align="center"><table cellpadding="0" cellspacing="0">
              <tbody><tr>
                <td><p class="style35">&nbsp;</p>
                  <p class="style35">关键字 ORACLE PERFORMANCE TUNING PL/SQL <br>
                    <br>
            出处 http://www.dbasupport.com <br>
            <br>
            <br>
            <br>
            39. 总是使用索引的第一个列 <br>
            <br>
            如果索引是建立在多个列上, 只有在它的第一个列(leading column)被where子句引用时,优化器才会选择使用该索引. <br>
            <br>
            <br>
            译者按: <br>
            <br>
            这也是一条简单而重要的规则. 见以下实例. <br>
            <br>
            <br>
            SQL&gt; create table multiindexusage ( inda number , indb number
            , descr varchar2(10)); <br>
                  <br>
            Table created. <br>
            <br>
            SQL&gt; create index multindex on multiindexusage(inda,indb); <br>
            <br>
            Index created. <br>
            <br>
            SQL&gt; set autotrace traceonly <br>
            <br>
            <br>
            SQL&gt; select * from multiindexusage where inda = 1; <br>
            <br>
            Execution Plan <br>
            <br>
            ---------------------------------------------------------- <br>
            <br>
            0 SELECT STATEMENT Optimizer=CHOOSE <br>
            <br>
            1 0 TABLE ACCESS (BY INDEX ROWID) OF 'MULTIINDEXUSAGE' <br>
            <br>
            2 1 INDEX (RANGE SCAN) OF 'MULTINDEX' (NON-UNIQUE) <br>
            <br>
            <br>
            SQL&gt; select * from multiindexusage where indb = 1; <br>
            <br>
            Execution Plan <br>
            <br>
            ---------------------------------------------------------- <br>
            <br>
            0 SELECT STATEMENT Optimizer=CHOOSE <br>
            <br>
            1 0 TABLE ACCESS (FULL) OF 'MULTIINDEXUSAGE' <br>
            <br>
            <br>
            很明显, 当仅引用索引的第二个列时,优化器使用了全表扫描而忽略了索引 <br>
            <br>
            <br>
            <br>
            40. ORACLE内部操作 <br>
            <br>
            当执行查询时,ORACLE采用了内部的操作. 下表显示了几种重要的内部操作. <br>
            <br>
            ORACLE Clause <br>
            内部操作 <br>
            <br>
            ORDER BY <br>
            SORT ORDER BY <br>
            <br>
            UNION <br>
            UNION-ALL <br>
            <br>
            MINUS <br>
            MINUS <br>
            <br>
            INTERSECT <br>
            INTERSECT <br>
            <br>
            DISTINCT,MINUS,INTERSECT,UNION <br>
            SORT UNIQUE <br>
            <br>
            MIN,MAX,COUNT <br>
            SORT AGGREGATE <br>
            <br>
            GROUP BY <br>
            SORT GROUP BY <br>
            <br>
            ROWNUM <br>
            COUNT or COUNT STOPKEY <br>
            <br>
            Queries involving Joins <br>
            SORT JOIN,MERGE JOIN,NESTED LOOPS <br>
            <br>
            CONNECT BY <br>
            CONNECT BY <br>
            <br>
            <br>
            <br>
            <br>
            41. 用UNION-ALL 替换UNION ( 如果有可能的话) <br>
            <br>
            <br>
            当SQL语句需要UNION两个查询结果集合时,这两个结果集合会以UNION-ALL的方式被合并, 然后在输出最终结果前进行排序. <br>
            <br>
            如果用UNION ALL替代UNION, 这样排序就不是必要了. 效率就会因此得到提高. <br>
            <br>
            <br>
            举例: <br>
            <br>
            低效： <br>
            <br>
            　　　　 SELECT ACCT_NUM, BALANCE_AMT <br>
            <br>
            FROM DEBIT_TRANSACTIONS <br>
            <br>
            WHERE TRAN_DATE = '31-DEC-95' <br>
            <br>
            UNION <br>
            <br>
            SELECT ACCT_NUM, BALANCE_AMT <br>
            <br>
            FROM DEBIT_TRANSACTIONS <br>
            <br>
            WHERE TRAN_DATE = '31-DEC-95' <br>
            <br>
            高效: <br>
            <br>
            SELECT ACCT_NUM, BALANCE_AMT <br>
            <br>
            FROM DEBIT_TRANSACTIONS <br>
            <br>
            WHERE TRAN_DATE = '31-DEC-95' <br>
            <br>
            UNION ALL <br>
            <br>
            SELECT ACCT_NUM, BALANCE_AMT <br>
            <br>
            FROM DEBIT_TRANSACTIONS <br>
            <br>
            WHERE TRAN_DATE = '31-DEC-95' <br>
            <br>
            <br>
            译者按: <br>
            <br>
            需要注意的是，UNION ALL 将重复输出两个结果集合中相同记录. 因此各位还是 <br>
            <br>
            要从业务需求分析使用UNION ALL的可行性. <br>
            <br>
            UNION 将对结果集合排序,这个操作会使用到SORT_AREA_SIZE这块内存. 对于这 <br>
            <br>
            块内存的优化也是相当重要的. 下面的SQL可以用来查询排序的消耗量 <br>
            <br>
            <br>
            Select substr(name,1,25) "Sort Area Name", <br>
            <br>
            substr(value,1,15) "Value" <br>
            <br>
            from v$sysstat <br>
            <br>
            where name like 'sort%' <br>
            <br>
            <br>
            <br>
            42. 使用提示(Hints) <br>
            <br>
            对于表的访问,可以使用两种Hints. <br>
            <br>
            FULL 和 ROWID <br>
            <br>
            <br>
            FULL hint 告诉ORACLE使用全表扫描的方式访问指定表. <br>
            <br>
            例如: <br>
            <br>
            SELECT /*+ FULL(EMP) */ * <br>
            <br>
            FROM EMP <br>
            <br>
            WHERE EMPNO = 7893; <br>
            <br>
            <br>
            ROWID hint 告诉ORACLE使用TABLE ACCESS BY ROWID的操作访问表. <br>
            <br>
            <br>
            通常, 你需要采用TABLE ACCESS BY ROWID的方式特别是当访问大表的时候, 使用这种方式, 你需要知道ROIWD的值或者使用索引. <br>
            <br>
            如果一个大表没有被设定为缓存(CACHED)表而你希望它的数据在查询结束是仍然停留 <br>
            <br>
            在SGA中,你就可以使用CACHE hint 来告诉优化器把数据保留在SGA中. 通常CACHE hint 和 FULL hint
            一起使用. <br>
                  <br>
            例如: <br>
            <br>
            SELECT /*+ FULL(WORKER) CACHE(WORKER)*/ * <br>
            <br>
            FROM WORK; <br>
            <br>
            <br>
            索引hint 告诉ORACLE使用基于索引的扫描方式. 你不必说明具体的索引名称 <br>
            <br>
            例如: <br>
            <br>
            SELECT /*+ INDEX(LODGING) */ LODGING <br>
            <br>
            FROM LODGING <br>
            <br>
            WHERE MANAGER = ‘BILL GATES'; <br>
            <br>
            <br>
            在不使用hint的情况下, 以上的查询应该也会使用索引,然而,如果该索引的重复值过多而你的优化器是CBO, 优化器就可能忽略索引.
            在这种情况下, 你可以用INDEX hint强制ORACLE使用该索引. <br>
                  <br>
                  <br>
                  ORACLE hints 还包括ALL_ROWS, FIRST_ROWS, RULE,USE_NL, USE_MERGE,
                  USE_HASH 等等. <br>
                  <br>
                  <br>
                  译者按: <br>
            <br>
            使用hint , 表示我们对ORACLE优化器缺省的执行路径不满意,需要手工修改. <br>
            <br>
            这是一个很有技巧性的工作. 我建议只针对特定的,少数的SQL进行hint的优化. <br>
            <br>
            对ORACLE的优化器还是要有信心(特别是CBO) </p></td></tr></tbody></table></td></tr></tbody></table><img src ="http://www.blogjava.net/Vencent/aggbug/32453.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-02-25 22:33 <a href="http://www.blogjava.net/Vencent/articles/32453.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL性能优化系列 (八)</title><link>http://www.blogjava.net/Vencent/articles/32449.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Sat, 25 Feb 2006 14:32:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/32449.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/32449.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/32449.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/32449.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/32449.html</trackback:ping><description><![CDATA[<table cellpadding="0" cellspacing="0"><tbody><tr><td class="font14" align="center"><div class="style35" align="center">ORACLE 
              SQL性能优化系列 (八) </div></td>
        </tr>
        <tr>
          <td class="font12" align="center"><div class="style36" align="center"><br>
          作者: black_snail</div></td>
        </tr>
        <tr>
          <td class="font12"><br></td>
        </tr>
        <tr>
          <td class="font12" align="center"><table cellpadding="0" cellspacing="0">
              <tbody><tr>
                <td><p class="style37">&nbsp;</p>
                  <p class="style37">关键字 ORACLE SQL PERFORMANCE TUNING <br>
                    <br>
            出处 http://www.dbasupport.com <br>
            <br>
            <br>
            <br>
            25. 用索引提高效率 <br>
            <br>
            <br>
            索引是表的一个概念部分,用来提高检索数据的效率. 实际上,ORACLE使用了一个复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快.
            当ORACLE找出执行查询和Update语句的最佳路径时, ORACLE优化器将使用索引. 同样在联结多个表时使用索引也可以提高效率.
            另一个使用索引的好处是,它提供了主键(primary key)的唯一性验证. <br>
                  <br>
            除了那些LONG或LONG RAW数据类型, 你可以索引几乎所有的列. 通常, 在大型表中使用索引特别有效. 当然,你也会发现,
            在扫描小表时,使用索引同样能提高效率. <br>
                  <br>
            虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价. 索引需要空间来 <br>
            <br>
            存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修改. 这意味着每条记录的INSERT , DELETE
            , UPDATE将为此多付出4 , 5 次的磁盘I/O . 因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢. <br>
                  <br>
                  <br>
                  译者按: <br>
            <br>
            定期的重构索引是有必要的. <br>
            <br>
            ALTER INDEX &lt;INDEXNAME&gt; REBUILD &lt;TABLESPACENAME&gt; <br>
            <br>
            <br>
            <br>
            26. 索引的操作 <br>
            <br>
            <br>
            ORACLE对索引有两种访问模式. <br>
            <br>
            <br>
            索引唯一扫描 ( INDEX UNIQUE SCAN) <br>
            <br>
            <br>
            大多数情况下, 优化器通过WHERE子句访问INDEX. <br>
            <br>
            <br>
            例如: <br>
            <br>
            表LODGING有两个索引 : 建立在LODGING列上的唯一性索引LODGING_PK和建立在MANAGER列上的非唯一性索引LODGING$MANAGER. <br>
            <br>
            <br>
            <br>
            SELECT * <br>
            <br>
            FROM LODGING <br>
            <br>
            WHERE LODGING = ‘ROSE HILL'; <br>
            <br>
            <br>
            在内部 , 上述SQL将被分成两步执行, 首先 , LODGING_PK 索引将通过索引唯一扫描的方式被访问 , 获得相对应的ROWID,
            通过ROWID访问表的方式 执行下一步检索. <br>
                  <br>
            如果被检索返回的列包括在INDEX列中,ORACLE将不执行第二步的处理(通过ROWID访问表). 因为检索数据保存在索引中, 单单访问索引就可以完全满足查询结果. <br>
            <br>
            下面SQL只需要INDEX UNIQUE SCAN 操作. <br>
            <br>
            <br>
            SELECT LODGING <br>
            <br>
            FROM LODGING <br>
            <br>
            WHERE LODGING = ‘ROSE HILL'; <br>
            <br>
            <br>
            索引范围查询(INDEX RANGE SCAN) <br>
            <br>
            适用于两种情况: <br>
            <br>
            1. 基于一个范围的检索 <br>
            <br>
            2. 基于非唯一性索引的检索 <br>
            <br>
            <br>
            例1: <br>
            <br>
            <br>
            SELECT LODGING <br>
            <br>
            FROM LODGING <br>
            <br>
            WHERE LODGING LIKE ‘M%'; <br>
            <br>
            <br>
            WHERE子句条件包括一系列值, ORACLE将通过索引范围查询的方式查询LODGING_PK . 由于索引范围查询将返回一组值,
            它的效率就要比索引唯一扫描 <br>
                  <br>
            低一些. <br>
            <br>
            <br>
            例2: <br>
            <br>
            <br>
            SELECT LODGING <br>
            <br>
            FROM LODGING <br>
            <br>
            WHERE MANAGER = ‘BILL GATES'; <br>
            <br>
            <br>
            这个SQL的执行分两步, LODGING$MANAGER的索引范围查询(得到所有符合条件记录的ROWID) 和下一步同过ROWID访问表得到LODGING列的值.
            由于LODGING$MANAGER是一个非唯一性的索引,数据库不能对它执行索引唯一扫描. <br>
                  <br>
                  <br>
                  由于SQL返回LODGING列,而它并不存在于LODGING$MANAGER索引中, 所以在索引范围查询后会执行一个通过ROWID访问表的操作. <br>
            <br>
            <br>
            WHERE子句中, 如果索引列所对应的值的第一个字符由通配符(WILDCARD)开始, 索引将不被采用. <br>
            <br>
            <br>
            SELECT LODGING <br>
            <br>
            FROM LODGING <br>
            <br>
            WHERE MANAGER LIKE ‘％HANMAN'; <br>
            <br>
            <br>
            在这种情况下，ORACLE将使用全表扫描. </p></td></tr></tbody></table></td></tr></tbody></table><img src ="http://www.blogjava.net/Vencent/aggbug/32449.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-02-25 22:32 <a href="http://www.blogjava.net/Vencent/articles/32449.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL性能优化系列 (九)</title><link>http://www.blogjava.net/Vencent/articles/32450.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Sat, 25 Feb 2006 14:32:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/32450.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/32450.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/32450.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/32450.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/32450.html</trackback:ping><description><![CDATA[<table cellpadding="0" cellspacing="0"><tbody><tr><td class="font14" align="center"><div class="style34 style35" align="center"><strong>ORACLE 
              SQL性能优化系列 (九) </strong></div></td>
        </tr>
        <tr>
          <td class="font12" align="center"><div class="style36" align="center"><br>
          作者: black_snail</div></td>
        </tr>
        <tr>
          <td class="font12"><br></td>
        </tr>
        <tr>
          <td class="font12" align="center"><table cellpadding="0" cellspacing="0">
              <tbody><tr>
                <td><p class="style35">&nbsp;</p>
                  <p class="style35">关键字 ORACLE PL/SQL TUNING PERFORMANCE <br>
                    <br>
            出处 http://www.dbasupport.com <br>
            <br>
            <br>
            <br>
            27. 基础表的选择 <br>
            <br>
            <br>
            基础表(Driving Table)是指被最先访问的表(通常以全表扫描的方式被访问). 根据优化器的不同, SQL语句中基础表的选择是不一样的. <br>
            <br>
            如果你使用的是CBO (COST BASED OPTIMIZER),优化器会检查SQL语句中的每个表的物理大小,索引的状态,然后选用花费最低的执行路径. <br>
            <br>
            如果你用RBO (RULE BASED OPTIMIZER) , 并且所有的连接条件都有索引对应, 在这种情况下, 基础表就是FROM
            子句中列在最后的那个表. <br>
                  <br>
            举例: <br>
            <br>
            SELECT A.NAME , B.MANAGER <br>
            <br>
            FROM　WORKER A, <br>
            <br>
            LODGING B <br>
            <br>
            WHERE　A.LODGING = B.LODING; <br>
            <br>
            由于LODGING表的LODING列上有一个索引, 而且WORKER表中没有相比较的索引, WORKER表将被作为查询中的基础表. <br>
            <br>
            <br>
            <br>
            28. 多个平等的索引 <br>
            <br>
            当SQL语句的执行路径可以使用分布在多个表上的多个索引时, ORACLE会同时使用多个索引并在运行时对它们的记录进行合并, 检索出仅对全部索引有效的记录. <br>
            <br>
            在ORACLE选择执行路径时,唯一性索引的等级高于非唯一性索引. 然而这个规则只有 <br>
            <br>
            当WHERE子句中索引列和常量比较才有效.如果索引列和其他表的索引类相比较. 这种子句在优化器中的等级是非常低的. <br>
            <br>
            如果不同表中两个想同等级的索引将被引用, FROM子句中表的顺序将决定哪个会被率先使用. FROM子句中最后的表的索引将有最高的优先级. <br>
            <br>
            如果相同表中两个想同等级的索引将被引用, WHERE子句中最先被引用的索引将有最高的优先级. <br>
            <br>
            举例: <br>
            <br>
            DEPTNO上有一个非唯一性索引,EMP_CAT也有一个非唯一性索引. <br>
            <br>
            SELECT ENAME, <br>
            <br>
            FROM EMP <br>
            <br>
            WHERE DEPT_NO = 20 <br>
            <br>
            AND EMP_CAT = ‘A'; <br>
            <br>
            这里,DEPTNO索引将被最先检索,然后同EMP_CAT索引检索出的记录进行合并. 执行路径如下: <br>
            <br>
            <br>
            <br>
            TABLE ACCESS BY ROWID ON EMP <br>
            <br>
            AND-EQUAL <br>
            <br>
            INDEX RANGE SCAN ON DEPT_IDX <br>
            <br>
            INDEX RANGE SCAN ON CAT_IDX <br>
            <br>
            <br>
            <br>
            29. 等式比较和范围比较 <br>
            <br>
            当WHERE子句中有索引列, ORACLE不能合并它们,ORACLE将用范围比较. <br>
            <br>
            <br>
            举例: <br>
            <br>
            DEPTNO上有一个非唯一性索引,EMP_CAT也有一个非唯一性索引. <br>
            <br>
            SELECT ENAME <br>
            <br>
            FROM EMP <br>
            <br>
            WHERE DEPTNO &gt; 20 <br>
            <br>
            AND EMP_CAT = ‘A'; <br>
            <br>
            <br>
            <br>
            这里只有EMP_CAT索引被用到,然后所有的记录将逐条与DEPTNO条件进行比较. 执行路径如下: <br>
            <br>
            TABLE ACCESS BY ROWID ON EMP <br>
            <br>
            INDEX RANGE SCAN ON CAT_IDX <br>
            <br>
            <br>
            <br>
            30. 不明确的索引等级 <br>
            <br>
            <br>
            当ORACLE无法判断索引的等级高低差别,优化器将只使用一个索引,它就是在WHERE子句中被列在最前面的. <br>
            <br>
            举例: <br>
            <br>
            DEPTNO上有一个非唯一性索引,EMP_CAT也有一个非唯一性索引. <br>
            <br>
            <br>
            SELECT ENAME <br>
            <br>
            FROM EMP <br>
            <br>
            WHERE DEPTNO &gt; 20 <br>
            <br>
            AND EMP_CAT &gt; ‘A'; <br>
            <br>
            <br>
            这里, ORACLE只用到了DEPT_NO索引. 执行路径如下: <br>
            <br>
            <br>
            TABLE ACCESS BY ROWID ON EMP <br>
            <br>
            INDEX RANGE SCAN ON DEPT_IDX <br>
            <br>
            <br>
            译者按: <br>
            <br>
            我们来试一下以下这种情况: <br>
            <br>
            SQL&gt; select index_name, uniqueness from user_indexes where table_name
            = 'EMP'; <br>
                  <br>
                  <br>
                  INDEX_NAME UNIQUENES <br>
            <br>
            ------------------------------ --------- <br>
            <br>
            EMPNO UNIQUE <br>
            <br>
            EMPTYPE NONUNIQUE <br>
            <br>
            <br>
            SQL&gt; select * from emp where empno &gt;= 2 and emp_type = 'A'
            ; <br>
                  <br>
                  <br>
                  no rows selected <br>
            <br>
            <br>
            <br>
            Execution Plan <br>
            <br>
            ---------------------------------------------------------- <br>
            <br>
            0 SELECT STATEMENT Optimizer=CHOOSE <br>
            <br>
            1 0 TABLE ACCESS (BY INDEX ROWID) OF 'EMP' <br>
            <br>
            2 1 INDEX (RANGE SCAN) OF 'EMPTYPE' (NON-UNIQUE) <br>
            <br>
            <br>
            虽然EMPNO是唯一性索引,但是由于它所做的是范围比较, 等级要比非唯一性索引的等式比较低! </p></td></tr></tbody></table></td></tr></tbody></table><img src ="http://www.blogjava.net/Vencent/aggbug/32450.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-02-25 22:32 <a href="http://www.blogjava.net/Vencent/articles/32450.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL性能优化系列 (六)</title><link>http://www.blogjava.net/Vencent/articles/32447.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Sat, 25 Feb 2006 14:31:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/32447.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/32447.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/32447.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/32447.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/32447.html</trackback:ping><description><![CDATA[<table cellpadding="0" cellspacing="0"><tbody><tr><td class="font14" align="center"><div class="style34 style35" align="center"><strong>ORACLE 
              SQL性能优化系列 (六) </strong></div></td>
        </tr>
        <tr>
          <td class="font12" align="center"><div class="style36" align="center"><br>
          作者: black_snail</div></td>
        </tr>
        <tr>
          <td class="font12"><br></td>
        </tr>
        <tr>
          <td class="font12" align="center"><table cellpadding="0" cellspacing="0">
              <tbody><tr>
                <td height="1893"><p>&nbsp;</p>
                  <p class="style35">关键字 ORACLE PERFORMANCE TUNING SQL <br>
                    <br>
            出处 http://www.dbasupport.com <br>
            <br>
            <br>
            <br>
            20. 用表连接替换EXISTS <br>
            <br>
            <br>
            通常来说 , 采用表连接的方式比EXISTS更有效率 <br>
            <br>
            SELECT ENAME <br>
            <br>
            FROM EMP E <br>
            <br>
            WHERE EXISTS (SELECT ‘X' <br>
            <br>
            FROM DEPT <br>
            <br>
            WHERE DEPT_NO = E.DEPT_NO <br>
            <br>
            AND DEPT_CAT = ‘A'); <br>
            <br>
            <br>
            (更高效) <br>
            <br>
            SELECT ENAME <br>
            <br>
            FROM DEPT D,EMP E <br>
            <br>
            WHERE E.DEPT_NO = D.DEPT_NO <br>
            <br>
            AND DEPT_CAT = ‘A' ; <br>
            <br>
            <br>
            (译者按: 在RBO的情况下,前者的执行路径包括FILTER,后者使用NESTED LOOP) <br>
            <br>
            <br>
            <br>
            21. 用EXISTS替换DISTINCT <br>
            <br>
            当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换 <br>
            <br>
            <br>
            例如: <br>
            <br>
            低效: <br>
            <br>
            SELECT DISTINCT DEPT_NO,DEPT_NAME <br>
            <br>
            FROM DEPT D,EMP E <br>
            <br>
            WHERE D.DEPT_NO = E.DEPT_NO <br>
            <br>
            高效: <br>
            <br>
            SELECT DEPT_NO,DEPT_NAME <br>
            <br>
            FROM DEPT D <br>
            <br>
            WHERE EXISTS ( SELECT ‘X' <br>
            <br>
            FROM EMP E <br>
            <br>
            WHERE E.DEPT_NO = D.DEPT_NO); <br>
            <br>
            <br>
            EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果. <br>
            <br>
            <br>
            <br>
            22. 识别'低效执行'的SQL语句 <br>
            <br>
            <br>
            用下列SQL工具找出低效SQL: <br>
            <br>
            SELECT EXECUTIONS , DISK_READS, BUFFER_GETS, <br>
            <br>
            ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio, <br>
            <br>
            ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run, <br>
            <br>
            SQL_TEXT <br>
            <br>
            FROM V$SQLAREA <br>
            <br>
            WHERE EXECUTIONS&gt;0 <br>
            <br>
            AND BUFFER_GETS &gt; 0 <br>
            <br>
            AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS &lt; 0.8 <br>
            <br>
            ORDER BY 4 DESC; <br>
            <br>
            <br>
            (译者按: 虽然目前各种关于SQL优化的图形化工具层出不穷,但是写出自己的SQL工具来解决问题始终是一个最好的方法) <br>
            <br>
            <br>
            <br>
            23. 使用TKPROF 工具来查询SQL性能状态 <br>
            <br>
            <br>
            SQL trace 工具收集正在执行的SQL的性能状态数据并记录到一个跟踪文件中. 这个跟踪文件提供了许多有用的信息,例如解析次数.执行次数,CPU使用时间等.这些数据将可以用来优化你的系统. <br>
            <br>
            <br>
            设置SQL TRACE在会话级别: 有效 <br>
            <br>
            <br>
            ALTER SESSION SET SQL_TRACE TRUE <br>
            <br>
            <br>
            设置SQL TRACE 在整个数据库有效仿, 你必须将SQL_TRACE参数在init.ora中设为TRUE, USER_DUMP_DEST参数说明了生成跟踪文件的目录 <br>
            <br>
            <br>
            (译者按: 这一节中,作者并没有提到TKPROF的用法, 对SQL TRACE的用法也不够准确, 设置SQL TRACE首先要在init.ora中设定TIMED_STATISTICS,
            这样才能得到那些重要的时间状态. 生成的trace文件是不可读的,所以要用TKPROF工具对其进行转换,TKPROF有许多执行参数.
            大家可以参考ORACLE手册来了解具体的配置. ) </p></td></tr></tbody></table></td></tr></tbody></table><img src ="http://www.blogjava.net/Vencent/aggbug/32447.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-02-25 22:31 <a href="http://www.blogjava.net/Vencent/articles/32447.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL性能优化系列 (七 )</title><link>http://www.blogjava.net/Vencent/articles/32448.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Sat, 25 Feb 2006 14:31:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/32448.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/32448.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/32448.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/32448.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/32448.html</trackback:ping><description><![CDATA[<table cellpadding="0" cellspacing="0"><tbody><tr><td class="font14" align="center"><div class="style34 style35" align="center"><strong>ORACLE 
              SQL性能优化系列 (七 ) </strong></div></td>
        </tr>
        <tr>
          <td class="font12" align="center"><div class="style36" align="center"><br>
          作者: black_snail</div></td>
        </tr>
        <tr>
          <td class="font12"><br></td>
        </tr>
        <tr>
          <td class="font12" align="center"><table cellpadding="0" cellspacing="0">
              <tbody><tr>
                <td><p class="style35">&nbsp;</p>
                  <p class="style35">24. 用EXPLAIN PLAN 分析SQL语句 <br>
                    <br>
                    <br>
EXPLAIN PLAN 是一个很好的分析SQL语句的工具,它甚至可以在不执行SQL的情况下分析语句.
通过分析,我们就可以知道ORACLE是怎么样连接表,使用什么方式扫描表(索引扫描或全表扫描)以及使用到的索引名称. <br>
            <br>
            你需要按照从里到外,从上到下的次序解读分析的结果. EXPLAIN PLAN分析的结果是用缩进的格式排列的, 最内部的操作将被最先解读,
            如果两个操作处于同一层中,带有最小操作号的将被首先执行. <br>
                  <br>
            NESTED LOOP是少数不按照上述规则处理的操作, 正确的执行路径是检查对NESTED LOOP提供数据的操作,其中操作号最小的将被最先处理. <br>
            <br>
            <br>
            译者按: <br>
            <br>
            通过实践, 感到还是用SQLPLUS中的SET TRACE 功能比较方便. <br>
            <br>
            举例: <br>
            <br>
            <br>
            SQL&gt; list <br>
            <br>
            1 SELECT * <br>
            <br>
            2 FROM dept, emp <br>
            <br>
            3* WHERE emp.deptno = dept.deptno <br>
            <br>
            SQL&gt; set autotrace traceonly /*traceonly 可以不显示执行结果*/ <br>
            <br>
            SQL&gt; / <br>
            <br>
            14 rows selected. <br>
            <br>
            Execution Plan <br>
            <br>
            ---------------------------------------------------------- <br>
            <br>
            0 SELECT STATEMENT Optimizer=CHOOSE <br>
            <br>
            1 0 NESTED LOOPS <br>
            <br>
            2 1 TABLE ACCESS (FULL) OF 'EMP' <br>
            <br>
            3 1 TABLE ACCESS (BY INDEX ROWID) OF 'DEPT' <br>
            <br>
            4 3 INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE) <br>
            <br>
            <br>
            Statistics <br>
            <br>
            ---------------------------------------------------------- <br>
            <br>
            0 recursive calls <br>
            <br>
            2 db block gets <br>
            <br>
            30 consistent gets <br>
            <br>
            0 physical reads <br>
            <br>
            0 redo size <br>
            <br>
            2598 bytes sent via SQL*Net to client <br>
            <br>
            503 bytes received via SQL*Net from client <br>
            <br>
            2 SQL*Net roundtrips to/from client <br>
            <br>
            0 sorts (memory) <br>
            <br>
            0 sorts (disk) <br>
            <br>
            14 rows processed <br>
            <br>
            <br>
            通过以上分析,可以得出实际的执行步骤是: <br>
            <br>
            1. TABLE ACCESS (FULL) OF 'EMP' <br>
            <br>
            2. INDEX (UNIQUE SCAN) OF 'PK_DEPT' (UNIQUE) <br>
            <br>
            3. TABLE ACCESS (BY INDEX ROWID) OF 'DEPT' <br>
            <br>
            4. NESTED LOOPS (JOINING 1 AND 3) <br>
            <br>
            <br>
            <br>
            注: 目前许多第三方的工具如TOAD和ORACLE本身提供的工具如OMS的SQL Analyze都提供了极其方便的EXPLAIN
            PLAN工具.也许喜欢图形化界面的朋友们可以选用它们. </p></td></tr></tbody></table></td></tr></tbody></table><img src ="http://www.blogjava.net/Vencent/aggbug/32448.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-02-25 22:31 <a href="http://www.blogjava.net/Vencent/articles/32448.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL性能优化系列 (四)</title><link>http://www.blogjava.net/Vencent/articles/32445.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Sat, 25 Feb 2006 14:30:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/32445.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/32445.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/32445.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/32445.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/32445.html</trackback:ping><description><![CDATA[<table cellpadding="0" cellspacing="0"><tbody><tr><td class="font14" align="center"><div class="style34 style35" align="center">ORACLE 
              SQL性能优化系列 (四) </div></td>
        </tr>
        <tr>
          <td class="font12" align="center"><div class="style36" align="center"><br>
          作者: black_snail</div></td>
        </tr>
        <tr>
          <td class="font12"><br></td>
        </tr>
        <tr>
          <td class="font12" align="center"><table cellpadding="0" cellspacing="0">
              <tbody><tr>
                <td><p class="style37">&nbsp;</p>
                  <p class="style37">关键字 ORACLE SQL PERFORMANCE TUNING <br>
                    <br>
            出处 http://WWW.DBASUPPORT.COM <br>
            <br>
            <br>
            <br>
            13. 计算记录条数 <br>
            <br>
            和一般的观点相反, count(*) 比count(1)稍快 , 当然如果可以通过索引检索,对索引列的计数仍旧是最快的. 例如 COUNT(EMPNO) <br>
            <br>
            <br>
            (译者按: 在CSDN论坛中,曾经对此有过相当热烈的讨论, 作者的观点并不十分准确,通过实际的测试,上述三种方法并没有显著的性能差别) <br>
            <br>
            <br>
            14. 用Where子句替换HAVING子句 <br>
            <br>
            <br>
            避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销. <br>
            <br>
            <br>
            例如: <br>
            <br>
            <br>
            低效: <br>
            <br>
            SELECT REGION，AVG(LOG_SIZE) <br>
            <br>
            FROM LOCATION <br>
            <br>
            GROUP BY REGION <br>
            <br>
            HAVING REGION REGION != ‘SYDNEY' <br>
            <br>
            AND REGION != ‘PERTH' <br>
            <br>
            <br>
            高效 <br>
            <br>
            SELECT REGION，AVG(LOG_SIZE) <br>
            <br>
            FROM LOCATION <br>
            <br>
            WHERE REGION REGION != ‘SYDNEY' <br>
            <br>
            AND REGION != ‘PERTH' <br>
            <br>
            GROUP BY REGION <br>
            <br>
            (译者按: HAVING 中的条件一般用于对一些集合函数的比较,如COUNT() 等等. 除此而外,一般的条件应该写在WHERE子句中) <br>
            <br>
            <br>
            15. 减少对表的查询 <br>
            <br>
            在含有子查询的SQL语句中,要特别注意减少对表的查询. <br>
            <br>
            <br>
            例如: <br>
            <br>
            低效 <br>
            <br>
            SELECT TAB_NAME <br>
            <br>
            FROM TABLES <br>
            <br>
            WHERE TAB_NAME = ( SELECT TAB_NAME <br>
            <br>
            FROM TAB_COLUMNS <br>
            <br>
            WHERE VERSION = 604) <br>
            <br>
            AND　DB_VER= ( SELECT DB_VER <br>
            <br>
            FROM TAB_COLUMNS <br>
            <br>
            WHERE VERSION = 604) <br>
            <br>
            <br>
            高效 <br>
            <br>
            SELECT TAB_NAME <br>
            <br>
            FROM TABLES <br>
            <br>
            WHERE (TAB_NAME,DB_VER) <br>
            <br>
            = ( SELECT TAB_NAME,DB_VER) <br>
            <br>
            FROM TAB_COLUMNS <br>
            <br>
            WHERE VERSION = 604) <br>
            <br>
            <br>
            Update 多个Column 例子: <br>
            <br>
            低效: <br>
            <br>
            UPDATE EMP <br>
            <br>
            SET EMP_CAT = (SELECT MAX(CATEGORY) FROM EMP_CATEGORIES), <br>
            <br>
            SAL_RANGE = (SELECT MAX(SAL_RANGE) FROM EMP_CATEGORIES) <br>
            <br>
            WHERE EMP_DEPT = 0020; <br>
            <br>
            <br>
            高效: <br>
            <br>
            UPDATE EMP <br>
            <br>
            SET (EMP_CAT, SAL_RANGE) <br>
            <br>
            = (SELECT MAX(CATEGORY) , MAX(SAL_RANGE) <br>
            <br>
            FROM EMP_CATEGORIES) <br>
            <br>
            WHERE EMP_DEPT = 0020; <br>
            <br>
            <br>
            <br>
            16. 通过内部函数提高SQL效率. <br>
            <br>
            <br>
            SELECT H.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC,COUNT(*) <br>
            <br>
            FROM HISTORY_TYPE T,EMP E,EMP_HISTORY H <br>
            <br>
            WHERE H.EMPNO = E.EMPNO <br>
            <br>
            AND H.HIST_TYPE = T.HIST_TYPE <br>
            <br>
            GROUP BY H.EMPNO,E.ENAME,H.HIST_TYPE,T.TYPE_DESC; <br>
            <br>
            <br>
            通过调用下面的函数可以提高效率. <br>
            <br>
            FUNCTION LOOKUP_HIST_TYPE(TYP IN NUMBER) RETURN VARCHAR2 <br>
            <br>
            AS <br>
            <br>
            TDESC VARCHAR2(30); <br>
            <br>
            CURSOR C1 IS <br>
            <br>
            SELECT TYPE_DESC <br>
            <br>
            FROM HISTORY_TYPE <br>
            <br>
            WHERE HIST_TYPE = TYP; <br>
            <br>
            BEGIN <br>
            <br>
            OPEN C1; <br>
            <br>
            FETCH C1 INTO TDESC; <br>
            <br>
            CLOSE C1; <br>
            <br>
            RETURN (NVL(TDESC,'?')); <br>
            <br>
            END; <br>
            <br>
            <br>
            FUNCTION LOOKUP_EMP(EMP IN NUMBER) RETURN VARCHAR2 <br>
            <br>
            AS <br>
            <br>
            ENAME VARCHAR2(30); <br>
            <br>
            CURSOR C1 IS <br>
            <br>
            SELECT ENAME <br>
            <br>
            FROM EMP <br>
            <br>
            WHERE EMPNO=EMP; <br>
            <br>
            BEGIN <br>
            <br>
            OPEN C1; <br>
            <br>
            FETCH C1 INTO ENAME; <br>
            <br>
            CLOSE C1; <br>
            <br>
            RETURN (NVL(ENAME,'?')); <br>
            <br>
            END; <br>
            <br>
            <br>
            SELECT H.EMPNO,LOOKUP_EMP(H.EMPNO), <br>
            <br>
            H.HIST_TYPE,LOOKUP_HIST_TYPE(H.HIST_TYPE),COUNT(*) <br>
            <br>
            FROM EMP_HISTORY H <br>
            <br>
            GROUP BY H.EMPNO , H.HIST_TYPE; <br>
            <br>
            <br>
            (译者按: 经常在论坛中看到如 '能不能用一个SQL写出….' 的贴子, 殊不知复杂的SQL往往牺牲了执行效率. 能够掌握上面的运用函数解决问题的方法在实际工作中是非常有意义的) </p></td></tr></tbody></table></td></tr></tbody></table><img src ="http://www.blogjava.net/Vencent/aggbug/32445.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-02-25 22:30 <a href="http://www.blogjava.net/Vencent/articles/32445.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL性能优化系列 (五)</title><link>http://www.blogjava.net/Vencent/articles/32446.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Sat, 25 Feb 2006 14:30:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/32446.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/32446.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/32446.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/32446.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/32446.html</trackback:ping><description><![CDATA[<table cellpadding="0" cellspacing="0"><tbody><tr><td class="font14" align="center"><div class="style34 style35" align="center"><strong>ORACLE 
              SQL性能优化系列 (五) </strong></div></td>
        </tr>
        <tr>
          <td class="font12" align="center"><div class="style36" align="center"><br>
          作者: black_snail</div></td>
        </tr>
        <tr>
          <td class="font12"><br></td>
        </tr>
        <tr>
          <td class="font12" align="center"><table cellpadding="0" cellspacing="0">
              <tbody><tr>
                <td><p class="style35">&nbsp;</p>
                  <p class="style35">关键字 ORACLE PERFORMANCE SQL TUNING <br>
                    <br>
            出处 http://WWW.DBASUPPORT.COM <br>
            <br>
            <br>
            <br>
            17. 使用表的别名(Alias) <br>
            <br>
            当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误. <br>
            <br>
            <br>
            (译者注: Column歧义指的是由于SQL中不同的表具有相同的Column名,当SQL语句中出现这个Column时,SQL解析器无法判断这个Column的归属) <br>
            <br>
            <br>
            18. 用EXISTS替代IN <br>
            <br>
            在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的效率. <br>
            <br>
            <br>
            低效: <br>
            <br>
            SELECT * <br>
            <br>
            FROM EMP (基础表) <br>
            <br>
            WHERE EMPNO &gt; 0 <br>
            <br>
            AND DEPTNO IN (SELECT DEPTNO <br>
            <br>
            FROM DEPT <br>
            <br>
            WHERE LOC = ‘MELB') <br>
            <br>
            <br>
            高效: <br>
            <br>
            SELECT * <br>
            <br>
            FROM EMP (基础表) <br>
            <br>
            WHERE EMPNO &gt; 0 <br>
            <br>
            AND EXISTS (SELECT ‘X' <br>
            <br>
            FROM DEPT <br>
            <br>
            WHERE DEPT.DEPTNO = EMP.DEPTNO <br>
            <br>
            AND LOC = ‘MELB') <br>
            <br>
            <br>
            (译者按: 相对来说,用NOT EXISTS替换NOT IN 将更显著地提高效率,下一节中将指出) <br>
            <br>
            <br>
            <br>
            19. 用NOT EXISTS替代NOT IN <br>
            <br>
            在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个全表遍历).
            为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS. <br>
                  <br>
                  <br>
                  例如: <br>
            <br>
            SELECT … <br>
            <br>
            FROM EMP <br>
            <br>
            WHERE DEPT_NO NOT IN (SELECT DEPT_NO <br>
            <br>
            FROM DEPT <br>
            <br>
            WHERE DEPT_CAT='A'); <br>
            <br>
            <br>
            为了提高效率.改写为: <br>
            <br>
            <br>
            (方法一: 高效) <br>
            <br>
            SELECT …. <br>
            <br>
            FROM EMP A,DEPT B <br>
            <br>
            WHERE A.DEPT_NO = B.DEPT(+) <br>
            <br>
            AND B.DEPT_NO IS NULL <br>
            <br>
            AND B.DEPT_CAT(+) = ‘A' <br>
            <br>
            <br>
            <br>
            (方法二: 最高效) <br>
            <br>
            SELECT …. <br>
            <br>
            FROM EMP E <br>
            <br>
            WHERE NOT EXISTS (SELECT ‘X' <br>
            <br>
            FROM DEPT D <br>
            <br>
            WHERE D.DEPT_NO = E.DEPT_NO <br>
            <br>
            AND DEPT_CAT = ‘A'); </p></td></tr></tbody></table></td></tr></tbody></table><img src ="http://www.blogjava.net/Vencent/aggbug/32446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-02-25 22:30 <a href="http://www.blogjava.net/Vencent/articles/32446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL性能优化系列 (三)</title><link>http://www.blogjava.net/Vencent/articles/32444.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Sat, 25 Feb 2006 14:29:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/32444.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/32444.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/32444.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/32444.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/32444.html</trackback:ping><description><![CDATA[<table cellpadding="0" cellspacing="0"><tbody><tr><td class="font14" align="center"><div class="style35" align="center">ORACLE 
              SQL性能优化系列 (三) </div></td>
        </tr>
        <tr>
          <td class="font12" align="center"><div class="style36" align="center"><br>
          作者: black_snail</div></td>
        </tr>
        <tr>
          <td class="font12"><br></td>
        </tr>
        <tr>
          <td class="font12" align="center"><table cellpadding="0" cellspacing="0">
              <tbody><tr>
                <td><p class="style37">&nbsp;</p>
                  <p class="style37">关键字 ORACLE SQL PERFORMANCE TUNING <br>
                    <br>
            出处 http://www.dbasupport.com <br>
            <br>
            <br>
            <br>
            8. 使用DECODE函数来减少处理时间 <br>
                    <br>
                    <br>
                    使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表. <br>
                    <br>
                    <br>
            例如: <br>
            <br>
            SELECT COUNT(*)，SUM(SAL) <br>
            <br>
            FROM　EMP <br>
            <br>
            WHERE DEPT_NO = 0020 <br>
            <br>
            AND ENAME LIKE　‘SMITH%'; <br>
            <br>
            <br>
            SELECT COUNT(*)，SUM(SAL) <br>
            <br>
            FROM　EMP <br>
            <br>
            WHERE DEPT_NO = 0030 <br>
            <br>
            AND ENAME LIKE　‘SMITH%'; <br>
            <br>
            <br>
            你可以用DECODE函数高效地得到相同结果 <br>
            <br>
            <br>
            SELECT COUNT(DECODE(DEPT_NO,0020,'X',NULL)) D0020_COUNT, <br>
            <br>
            COUNT(DECODE(DEPT_NO,0030,'X',NULL)) D0030_COUNT, <br>
            <br>
            SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL, <br>
            <br>
            SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SAL <br>
            <br>
            FROM EMP WHERE ENAME LIKE ‘SMITH%'; <br>
            <br>
            <br>
            类似的,DECODE函数也可以运用于GROUP BY 和ORDER BY子句中. <br>
            <br>
            <br>
            <br>
            9. 整合简单,无关联的数据库访问 <br>
            <br>
            <br>
            如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系) <br>
            <br>
            例如: <br>
            <br>
            <br>
            SELECT NAME <br>
            <br>
            FROM EMP <br>
            <br>
            WHERE EMP_NO = 1234; <br>
            <br>
            <br>
            SELECT NAME <br>
            <br>
            FROM DPT <br>
            <br>
            WHERE DPT_NO = 10 ; <br>
            <br>
            <br>
            SELECT NAME <br>
            <br>
            FROM CAT <br>
            <br>
            WHERE CAT_TYPE = ‘RD'; <br>
            <br>
            <br>
            上面的3个查询可以被合并成一个: <br>
            <br>
            <br>
            SELECT E.NAME , D.NAME , C.NAME <br>
            <br>
            FROM CAT C , DPT D , EMP E,DUAL X <br>
            <br>
            WHERE NVL(‘X',X.DUMMY) = NVL(‘X',E.ROWID(+)) <br>
            <br>
            AND NVL(‘X',X.DUMMY) = NVL(‘X',D.ROWID(+)) <br>
            <br>
            AND NVL(‘X',X.DUMMY) = NVL(‘X',C.ROWID(+)) <br>
            <br>
            AND E.EMP_NO(+) = 1234 <br>
            <br>
            AND D.DEPT_NO(+) = 10 <br>
            <br>
            AND C.CAT_TYPE(+) = ‘RD'; <br>
            <br>
            <br>
            (译者按: 虽然采取这种方法,效率得到提高,但是程序的可读性大大降低,所以读者 还是要权衡之间的利弊) <br>
            <br>
            <br>
            10. 删除重复记录 <br>
            <br>
            最高效的删除重复记录方法 ( 因为使用了ROWID) <br>
            <br>
            <br>
            DELETE FROM EMP E <br>
            <br>
            WHERE E.ROWID &gt; (SELECT MIN(X.ROWID) <br>
            <br>
            FROM EMP X <br>
            <br>
            WHERE X.EMP_NO = E.EMP_NO); <br>
            <br>
            <br>
            11. 用TRUNCATE替代DELETE <br>
            <br>
            当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息. 如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是 <br>
            <br>
            恢复到执行删除命令之前的状况) <br>
            <br>
            <br>
            而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短. <br>
            <br>
            <br>
            (译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML) <br>
            <br>
            <br>
            <br>
            12. 尽量多使用COMMIT <br>
            <br>
            <br>
            只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少: <br>
            <br>
            COMMIT所释放的资源: <br>
            <br>
            a. 回滚段上用于恢复数据的信息. <br>
            <br>
            b. 被程序语句获得的锁 <br>
            <br>
            c. redo log buffer 中的空间 <br>
            <br>
            d. ORACLE为管理上述3种资源中的内部花费 <br>
            <br>
            <br>
            (译者按: 在使用COMMIT时必须要注意到事务的完整性,现实中效率和事务完整性往往是鱼和熊掌不可得兼) <br>
            <br>
            <br>
            <br>
            对该文的评论 人气：4369 <br>
            black_snail (2003-9-7 19:16:56) <br>
            <br>
            如果DECODE取值为NULL，SUM（NULL）的值是NULL --&gt;如果所有的值都是NULL , SUM(NULL) =
            NULL 但是只要有一个值不是NULL,SUM() &lt;&gt; NULL 所以原SQL应该没有什么逻辑上的问题 <br>
                    <br>
            menlion (2003-9-4 12:38:01) <br>
            <br>
            关于第八点的个人看法：如果DECODE取值为NULL，SUM（NULL）的值是NULL，不会正常求和的。可以改成如下所示就好了：
            SELECT COUNT(DECODE(DEPT_NO,0020,'X',NULL)) D0020_COUNT, COUNT(DECODE(DEPT_NO,0030,'X',NULL))
            D0030_COUNT, SUM(DECODE(DEPT_NO,0020,SAL,0)) D0020_SAL, SUM(DECODE(DEPT_NO,0030,SAL,0))
            D0030_SAL FROM EMP WHERE ENAME LIKE ‘SMITH%'; </p></td></tr></tbody></table></td></tr></tbody></table><img src ="http://www.blogjava.net/Vencent/aggbug/32444.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-02-25 22:29 <a href="http://www.blogjava.net/Vencent/articles/32444.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL性能优化系列 (一)</title><link>http://www.blogjava.net/Vencent/articles/32442.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Sat, 25 Feb 2006 14:28:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/32442.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/32442.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/32442.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/32442.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/32442.html</trackback:ping><description><![CDATA[<table cellpadding="0" cellspacing="0"><tbody><tr><td class="font14 style35" align="center"><div class="style34" align="center"><strong>&nbsp;&nbsp; ORACLE SQL性能优化系列 (一) </strong></div></td></tr>
<tr>
<td class="font12" align="center">
<p align="center"><br><span class="style37"><font size="2">&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; 作者: black_snail</font></span></p></td></tr></tbody></table><br><br>关键字 ORACEL SQL Performance tuning <br><br>出处 http://www.dbasupport.com <br><br><br>1. 选用适合的ORACLE优化器 <br><br><br><br>ORACLE的优化器共有3种: <br><br>a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) <br><br><br><br>设置缺省的优化器,可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明,如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . 你当然也在SQL句级或是会话(session)级对其进行覆盖. <br><br>为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,以增加数据库中的对象统计信息(object statistics)的准确性. <br><br>如果数据库的优化器模式设置为选择性(CHOOSE),那么实际的优化器模式将和是否运行过analyze命令有关. 如果table已经被analyze过, 优化器模式将自动成为CBO , 反之,数据库将采用RULE形式的优化器. <br><br><br><br>在缺省情况下,ORACLE采用CHOOSE优化器, 为了避免那些不必要的全表扫描(full table scan) , 你必须尽量避免使用CHOOSE优化器,而直接采用基于规则或者基于成本的优化器. <br><br><br><br>2. 访问Table的方式 <br><br><br><br>ORACLE 采用两种访问表中记录的方式: <br><br><br><br>a. 全表扫描 <br><br>全表扫描就是顺序地访问表中每条记录. ORACLE采用一次读入多个数据块(database block)的方式优化全表扫描. <br><br><br><br>b. 通过ROWID访问表 <br><br>你
可以采用基于ROWID的访问方式情况,提高访问表的效率, ,
ROWID包含了表中记录的物理位置信息..ORACLE采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系.
通常索引提供了快速访问ROWID的方法,因此那些基于索引列的查询就可以得到性能上的提高. <br><br><br><br>3. 共享SQL语句 <br><br><br><br>为
了不重复解析相同的SQL语句,在第一次解析之后, ORACLE将SQL语句存放在内存中.这块位于系统全局区域SGA(system global
area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享.
因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它 <br><br>和之前的执行过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的 <br><br>执行路径. ORACLE的这个功能大大地提高了SQL的执行性能并节省了内存的使用. <br><br>可惜的是ORACLE只对简单的表提供高速缓冲(cache buffering) ,这个功能并不适用于多表连接查询. <br><br>数据库管理员必须在init.ora中为这个区域设置合适的参数,当这个内存区域越大,就可以保留更多的语句,当然被共享的可能性也就越大了. <br><br>当你向ORACLE 提交一个SQL语句,ORACLE会首先在这块内存中查找相同的语句. <br><br>这里需要注明的是,ORACLE对两者采取的是一种严格匹配,要达成共享,SQL语句必须 <br><br>完全相同(包括空格,换行等). <br><br>共享的语句必须满足三个条件: <br><br><br><br>A. 字符级的比较: <br><br>当前被执行的语句和共享池中的语句必须完全相同. <br><br>例如: <br><br>SELECT * FROM EMP; <br><br>和下列每一个都不同 <br><br>SELECT * from EMP; <br><br>Select * From Emp; <br><br>SELECT * FROM EMP; <br><br><br><br><br><br>B. 两个语句所指的对象必须完全相同: <br><br>例如: <br><br>用户 对象名 如何访问 <br><br>Jack sal_limit private synonym <br><br>Work_city public synonym <br><br>Plant_detail public synonym <br><br><br><br>Jill sal_limit private synonym <br><br>Work_city public synonym <br><br>Plant_detail table owner <br><br><br>考虑一下下列SQL语句能否在这两个用户之间共享. <br><br><br><br>SQL <br>能否共享 <br>原因 <br><br>select max(sal_cap) from sal_limit; <br>不能 <br>每个用户都有一个private synonym - sal_limit , 它们是不同的对象 <br><br>select count(*0 from work_city where sdesc like 'NEW%'; <br>能 <br>两个用户访问相同的对象public synonym - work_city <br><br>select a.sdesc,b.location from work_city a , plant_detail b where a.city_id = b.city_id <br>不能 <br>用户jack 通过private synonym访问plant_detail 而jill 是表的所有者,对象不同. <br><br><br><br><br><br>C. 两个SQL语句中必须使用相同的名字的绑定变量(bind variables) <br><br><br>例如： <br><br><br>第一组的两个SQL语句是相同的(可以共享),而第二组中的两个语句是不同的(即使在运行时,赋于不同的绑定变量相同的值) <br><br>a. <br><br>select pin , name from people where pin = :blk1.pin; <br><br>select pin , name from people where pin = :blk1.pin; <br><br><br>b. <br><br>select pin , name from people where pin = :blk1.ot_ind; <br><br>select pin , name from people where pin = :blk1.ov_ind; <br><img src ="http://www.blogjava.net/Vencent/aggbug/32442.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-02-25 22:28 <a href="http://www.blogjava.net/Vencent/articles/32442.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE SQL性能优化系列 (二)</title><link>http://www.blogjava.net/Vencent/articles/32443.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Sat, 25 Feb 2006 14:28:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/32443.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/32443.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/32443.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/32443.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/32443.html</trackback:ping><description><![CDATA[<table cellpadding="0" cellspacing="0"><tbody><tr><td class="font14 style35" align="center"><div class="style34" align="center"><strong>ORACLE 
              SQL性能优化系列 (二) </strong></div></td>
        </tr>
        <tr>
          <td class="font12" align="center"><div align="center"><br>
              <span class="style37">作者: black_snail</span></div></td>
        </tr>
        <tr>
          <td class="font12"><br></td>
        </tr>
        <tr>
          <td class="font12" align="center"><table cellpadding="0" cellspacing="0">
              <tbody><tr>
                <td><p class="style35">&nbsp;</p>
                  <p class="style35">关键字 ORACLE SQL PERFORMANCE TUNING <br>
                    <br>
            出处 www.dbasupport.com <br>
            <br>
            <br>
            <br>
            4. 选择最有效率的表名顺序(只在基于规则的优化器中有效) <br>
            <br>
            <br>
ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表 driving
table)将被最先处理. 在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.当ORACLE处理多个表时,
会运用排序及合并的方式连接它们.首先,扫描第一个表(FROM子句中最后的那个表)并对记录进行派序,然后扫描第二个表(FROM子句中最后第二个
表),最后将所有从第二个表中检索出的记录与第一个表中合适记录进行合并. <br>
                  <br>
                  <br>
                  例如: <br>
                  <br>
            表 TAB1 16,384 条记录 <br>
            <br>
            表 TAB2 1 条记录 <br>
            <br>
            <br>
            选择TAB2作为基础表 (最好的方法) <br>
            <br>
            select count(*) from tab1,tab2 执行时间0.96秒 <br>
            <br>
            <br>
            选择TAB2作为基础表 (不佳的方法) <br>
            <br>
            select count(*) from tab2,tab1 执行时间26.09秒 <br>
            <br>
            <br>
            如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. <br>
            <br>
            <br>
            例如: <br>
            <br>
            EMP表描述了LOCATION表和CATEGORY表的交集. <br>
            <br>
            SELECT * <br>
            <br>
            FROM LOCATION L , <br>
            <br>
            CATEGORY C, <br>
            <br>
            EMP E <br>
            <br>
            WHERE E.EMP_NO BETWEEN 1000 AND 2000 <br>
            <br>
            AND E.CAT_NO = C.CAT_NO <br>
            <br>
            AND E.LOCN = L.LOCN <br>
            <br>
            <br>
            将比下列SQL更有效率 <br>
            <br>
            <br>
            SELECT * <br>
            <br>
            FROM EMP E , <br>
            <br>
            LOCATION L , <br>
            <br>
            CATEGORY C <br>
            <br>
            WHERE E.CAT_NO = C.CAT_NO <br>
            <br>
            AND E.LOCN = L.LOCN <br>
            <br>
            AND E.EMP_NO BETWEEN 1000 AND 2000 <br>
            <br>
            <br>
            <br>
            5. WHERE子句中的连接顺序． <br>
            <br>
            <br>
            ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾. <br>
            <br>
            <br>
            例如: <br>
            <br>
            (低效,执行时间156.3秒) <br>
            <br>
            SELECT … <br>
            <br>
            FROM EMP E <br>
            <br>
            WHERE SAL &gt; 50000 <br>
            <br>
            AND JOB = ‘MANAGER' <br>
            <br>
            AND 25 &lt; (SELECT COUNT(*) FROM EMP <br>
            <br>
            WHERE MGR=E.EMPNO); <br>
            <br>
            <br>
            (高效,执行时间10.6秒) <br>
            <br>
            SELECT … <br>
            <br>
            FROM EMP E <br>
            <br>
            WHERE 25 &lt; (SELECT COUNT(*) FROM EMP <br>
            <br>
            WHERE MGR=E.EMPNO) <br>
            <br>
            AND SAL &gt; 50000 <br>
            <br>
            AND JOB = ‘MANAGER'; <br>
            <br>
            <br>
            <br>
            6. SELECT子句中避免使用 ‘ * ‘ <br>
            <br>
            当你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*' 是一个方便的方法.不幸的是,这是一个非常低效的方法.
            实际上,ORACLE在解析的过程中, 会将'*' 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间. <br>
                  <br>
                  <br>
                  <br>
                  7. 减少访问数据库的次数 <br>
                  <br>
            当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等等.
            由此可见, 减少访问数据库的次数 , 就能实际上减少ORACLE的工作量. <br>
                  <br>
                  <br>
                  例如, <br>
                  <br>
            以下有三种方法可以检索出雇员号等于0342或0291的职员. <br>
            <br>
            <br>
            方法1 (最低效) <br>
            <br>
            SELECT EMP_NAME , SALARY , GRADE <br>
            <br>
            FROM EMP <br>
            <br>
            WHERE EMP_NO = 342; <br>
            <br>
            <br>
            SELECT EMP_NAME , SALARY , GRADE <br>
            <br>
            FROM EMP <br>
            <br>
            WHERE EMP_NO = 291; <br>
            <br>
            <br>
            方法2 (次低效) <br>
            <br>
            DECLARE <br>
            <br>
            CURSOR C1 (E_NO NUMBER) IS <br>
            <br>
            SELECT EMP_NAME,SALARY,GRADE <br>
            <br>
            FROM EMP <br>
            <br>
            WHERE EMP_NO = E_NO; <br>
            <br>
            BEGIN <br>
            <br>
            OPEN C1(342); <br>
            <br>
            FETCH C1 INTO …,..,.. ; <br>
            <br>
            ….. <br>
            <br>
            OPEN C1(291); <br>
            <br>
            FETCH C1 INTO …,..,.. ; <br>
            <br>
            CLOSE C1; <br>
            <br>
            END; <br>
            <br>
            <br>
            方法3 (高效) <br>
            <br>
            SELECT A.EMP_NAME , A.SALARY , A.GRADE, <br>
            <br>
            B.EMP_NAME , B.SALARY , B.GRADE <br>
            <br>
            FROM EMP A,EMP B <br>
            <br>
            WHERE A.EMP_NO = 342 <br>
            <br>
            AND B.EMP_NO = 291; <br>
            <br>
            <br>
            注意: <br>
            <br>
            在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量 ,建议值为200 </p></td></tr></tbody></table></td></tr></tbody></table><img src ="http://www.blogjava.net/Vencent/aggbug/32443.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-02-25 22:28 <a href="http://www.blogjava.net/Vencent/articles/32443.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>exp/imp导出导入工具的使用 (转)</title><link>http://www.blogjava.net/Vencent/articles/31944.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Wed, 22 Feb 2006 05:04:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/31944.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/31944.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/31944.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/31944.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/31944.html</trackback:ping><description><![CDATA[<pre>一. 导出工具 exp<br><br>1. 它是操作系统下一个可执行的文件 存放目录/ORACLE_HOME/bin<br><br>   exp导出工具将数据库中数据备份压缩成一个二进制系统文件.可以在不同OS间迁移<br>   <br>   它有三种模式：<br>       a.  用户模式：	导出用户所有对象以及对象中的数据；<br>       b.  表模式：	导出用户所有表或者指定的表；<br>       c.  整个数据库：	导出数据库中所有对象。<br><br>2. 导出工具exp交互式命令行方式的使用的例子<br><br>$exp test/test123@appdb<br>Enter array fetch buffer size: 4096 &gt; 回车<br>Export file: expdat.dmp &gt; m.dmp  生成导出的文件名 <br>(1)E(ntire database), (2)U(sers), or (3)T(ables): (2)U &gt; 3<br>Export table data (yes/no): yes &gt; 回车<br>Compress extents (yes/no): yes &gt; 回车<br>Export done in ZHS16GBK character set and ZHS16GBK NCHAR character set<br>About to export specified tables via Conventional Path ...<br>Table(T) or Partition(T:P) to be exported: (RETURN to quit) &gt; cmamenu  							要导出的表名<br>. . exporting table                        CMAMENU       4336 rows exported<br>Table(T) or Partition(T:P) to be exported: (RETURN to quit) &gt;要导出的表名n<br>Table(T) or Partition(T:P) to be exported: (RETURN to quit) &gt; 回车<br>Export terminated successfully without warnings. <br><br>3. 导出工具exp非交互式命令行方式的例子<br><br>$exp scott/tiger tables=(emp,dept) file=/directory/scott.dmp grants=y <br><br>说明:把scott用户里两个表emp,dept导出到文件/directory/scott.dmp<br><br>$exp scott/tiger tables=emp query=\"where job=\'salesman\' and sal\&lt;1600\" file=/directory/scott2.dmp <br><br>说明:在exp里面加上导出emp的查询条件job='salesman' and sal&lt;1600<br>    <br>    (但我个人很少这样用,还是把满足条件的记录生成临时表后,再exp会方便一些)<br><br>$exp parfile=username.par file=/directory1/username_1.dmp,/directory1/username_2.dmp filesize=2000M log=/directory2/username_exp.log<br><br>参数文件username.par内容<br>	userid=username/userpassword<br>	buffer=8192000<br>	compress=n<br>	grants=y<br><br>说明:username.par为导出工具exp用的参数文件,里面具体参数可以根据需要去修改<br><br>     filesize指定生成的二进制备份文件的最大字节数<br>     <br>     (可用来解决某些OS下2G物理文件的限制及加快压缩速度和方便刻历史数据光盘等)<br><br>二.导入工具 imp<br><br>1. 它是操作系统下一个可执行的文件 存放目录/ORACLE_HOME/bin<br><br>	imp导入工具将EXP形成的二进制系统文件导入到数据库中.<br>	<br>   它有三种模式：<br>       a.  用户模式：	导出用户所有对象以及对象中的数据；<br>       b.  表模式：	导出用户所有表或者指定的表；<br>       c.  整个数据库：	导出数据库中所有对象。<br>       <br>   只有拥有IMP_FULL_DATABASE和DBA权限的用户才能做整个数据库导入<br>   <br>   imp步骤：<br>   (1) create table  (2) insert data  (3) create index (4) create triggers,constraints<br><br>2.导入工具imp交互式命令行方式的例子<br>$ imp<br>Import: Release 8.1.6.0.0 - Production on 星期五 12月 7 17:01:08 2001<br>(c) Copyright 1999 Oracle Corporation.  All rights reserved.<br>用户名:  test<br>口令:****<br>连接到: Oracle8i Enterprise Edition Release 8.1.6.0.0 - 64bit Production<br>With the Partitioning option<br>JServer Release 8.1.6.0.0 - Production<br>导入文件: expdat.dmp&gt; /tmp/m.dmp<br>输入插入缓冲区大小（最小为 8192 ) 30720&gt;<br>经由常规路径导出由EXPORT:V08.01.06创建的文件<br>警告: 此对象由 TEST 导出, 而不是当前用户<br>已经完成ZHS16GBK字符集和ZHS16GBK NCHAR 字符集中的导入<br>只列出导入文件的内容(yes/no)：no&gt;<br>由于对象已存在, 忽略创建错误(yes/no)：no&gt; yes<br>导入权限(yes/no)：yes&gt;<br>导入表数据(yes/no)：yes&gt;<br>导入整个导出文件(yes/no)：no&gt; yes<br>. 正在将TEST的对象导入到 SCOTT<br>. . 正在导入表                       "CMAMENU"       4336行被导入<br>成功终止导入，但出现警告。 <br><br><br>3.导入工具imp非交互式命令行方式的例子<br><br>$ imp system/manager fromuser=jones tables=(accts) <br>$ imp system/manager fromuser=scott tables=(emp,dept) <br>$ imp system/manager fromuser=scott touser=joe tables=emp <br>$ imp scott/tiger file = expdat.dmp full=y <br>$ imp scott/tiger file = /mnt1/t1.dmp show=n buffer=2048000 ignore=n commit=y grants=y full=y log=/oracle_backup/log/imp_scott.log<br>$ imp system/manager parfile=params.dat <br>params.dat 内容 <br>file=dba.dmp show=n ignore=n grants=y fromuser=scott tables=(dept,emp) <br><br>4.导入工具imp可能出现的问题<br><br>(1) 数据库对象已经存在<br>	一般情况, 导入数据前应该彻底删除目标数据下的表, 序列, 函数/过程,触发器等;  	<br>	数据库对象已经存在, 按缺省的imp参数, 则会导入失败<br>	如果用了参数ignore=y, 会把exp文件内的数据内容导入<br>		如果表有唯一关键字的约束条件, 不合条件将不被导入<br>		如果表没有唯一关键字的约束条件, 将引起记录重复<br>		<br>(2) 数据库对象有主外键约束<br>      不符合主外键约束时, 数据会导入失败	<br>      解决办法: 先导入主表, 再导入依存表<br>		disable目标导入对象的主外键约束, 导入数据后, 再enable它们<br>(3)  权限不够<br>	如果要把A用户的数据导入B用户下, A用户需要有imp_full_database权限<br>	<br>(4)  导入大表( 大于80M ) 时, 存储分配失败<br>      默认的EXP时, compress = Y, 也就是把所有的数据压缩在一个数据块上.<br>      导入时, 如果不存在连续一个大数据块, 则会导入失败.<br>      导出80M以上的大表时, 记得compress= N, 则不会引起这种错误.<br>	<br>(5) imp和exp使用的字符集不同<br>      如果字符集不同, 导入会失败, 可以改变unix环境变量或者NT注册表里NLS_LANG相关信息.<br>      导入完成后再改回来.<br><br>(6) imp和exp版本不能往上兼容<br>	imp可以成功导入低版本exp生成的文件, 不能导入高版本exp生成的文件<br>	根据情况我们可以用<br>	$ imp username/password@connect_string<br> 	说明: connect_string 是在/ORACLE_HOME/network/admin/tnsnames.ora<br>		   定义的本地或者远端数据库的名称<br>	注意事项:<br>	UNIX: /etc/hosts	          要定义本地或者远端数据库服务器的主机名<br>	win98:    windows\hosts             和IP地址的对应关系  <br>	<br>	win2000:  winnt\system32\drivers\etc\hosts</pre><img src ="http://www.blogjava.net/Vencent/aggbug/31944.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-02-22 13:04 <a href="http://www.blogjava.net/Vencent/articles/31944.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle update多表关联</title><link>http://www.blogjava.net/Vencent/articles/31943.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Wed, 22 Feb 2006 05:03:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/31943.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/31943.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/31943.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/31943.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/31943.html</trackback:ping><description><![CDATA[<p class="postTitle" align="left"><font size="2"><span class="bold"><span class="smalltxt"><strong><font face="Comic Sans MS">UPDATE A.A3 = A.A3+B.B3 的问题<br><br></font></strong></span></span>表A 结构 : A1 , A2 ,A3 <br>表B 结构: B1,&nbsp;&nbsp;B2,&nbsp;&nbsp;B3<br>其中 A1 ,B1 为PK ,切值相同 就是可以使用A1 = B1 了.<br><br>请问用SQL 语句或过程该如何实现如下的功能???<br><br>更新A 表的 A3 ,用A.A3 与B.B3之和更新.</font></p>
<p class="postText" align="left"><font size="2">3&gt;update A <br>set A3 = (select A.A3 + B.B3 from B where A.A1 = B.B1) ;</font></p>
<p class="postText" align="left"><font size="2">7&gt;update (select a1,a3,b1,b3 from a,b where a1=b1) set a3=a3+b3</font></p>






<div align="left"><font size="2">开执行计划, 谈论效率是没有太多的意义的^_^..<br><br><br>三楼的写法与7楼的写法得到的结果是不同的.<br><br>三楼的写法会更新所有记录, 而7楼的写法只修改两者相交的相关记录信息.<br><br>7楼的写法可以更加容易的控制这条update语句的执行计划, 不过要求B表必须在对应的字段上有主键索引:) , 在B表在对应字段上有主键索引的时候, 建议使用7楼的写法.<br><br>可以参考一下这个帖子^_^<br><br></font><a href="http://www.cnoug.org/viewthread.php?tid=44070" target="_blank"><font color="#003366" size="2">http://www.cnoug.org/viewthread.php?tid=44070</font></a></div>

<div align="left"><font size="2">(测试没有成功..不知道怎么搞的.)</font></div>

<div align="left"><font size="2">参考了下面的:</font></div>

<div align="left"><font size="2">非常佩服。抱着学习的态度，重写了一下三楼的，在没有主键的情况，请指教：<br>update a<br>set a3=(select a3+b3 from b where a1=b1)<br>where a1=(select b1 from b where a1=b1)</font></div>

<div align="left"><font size="2">如下:</font></div>
<div align="left"><font size="2">update con_eme_on20050309 a set a.con_price=(select a.con_price+(b.annuity-a.annuity)+(b.nojob-a.nojob)<br>+(b.medicare-a.medicare)+(b.birthfee-a.birthfee)+(b.bruisefee-a.bruisefee) from con_eme_on200404 b <br>where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),<br>a.emp_base=(select b.emp_base from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),<br>a.annuity=(select b.annuity from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),<br>a.nojob=(select b.nojob from con_eme_on200404 bwhere a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),<br>a.medicare=(select b.medicare from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),<br>a.birthfee=(select b.birthfee from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),<br>a.bruisefee=(select b.bruisefee from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),<br>a.nojobbase=(select b.nojobbase from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),<br>a.mediabase=(select b.mediabase from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),<br>a.birthbase=(select b.birthbase from con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base),<br>a.bruisebase=(select
b.bruisebase from con_eme_on200404 b where a.emp_cod=b.emp_cod and
a.if_act='1' and a.emp_base!=b.emp_base)where a.emp_cod in(select
b.emp_cod from con_eme_on200404 b <br>where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base)</font></div>

<div align="left"><font size="2">公积金:</font></div>

<font size="2">update con_eme_on20050309 a set a.con_price=(select a.con_price+(b.accumulation-a.accumulation) from con_eme_on200404 b <br>where
a.emp_cod=b.emp_cod and a.if_act='1' and
a.emp_base!=b.emp_base),a.accumulation=(select b.accumulation from
con_eme_on200404 b where a.emp_cod=b.emp_cod and a.if_act='1' and
a.emp_base!=b.emp_base),<br>a.accumulationbase=(select
b.accumulationbase from con_eme_on200404 b where a.emp_cod=b.emp_cod
and a.if_act='1' and
a.emp_base!=b.emp_base),a.accumulationbase1=(select b.accumulationbase1
from con_eme_on200404 b <br>where a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base)<br>where
a.emp_cod in(select b.emp_cod from con_eme_on200404 b where
a.emp_cod=b.emp_cod and a.if_act='1' and a.emp_base!=b.emp_base)</font><img src ="http://www.blogjava.net/Vencent/aggbug/31943.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-02-22 13:03 <a href="http://www.blogjava.net/Vencent/articles/31943.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>改变数据库字符集的方法</title><link>http://www.blogjava.net/Vencent/articles/31336.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Sat, 18 Feb 2006 04:43:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/31336.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/31336.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/31336.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/31336.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/31336.html</trackback:ping><description><![CDATA[oracle 数据库具有国际化的支持能力, 主要通过字符集等 NLS(National Language
Support)&nbsp;&nbsp;参数设置来实现对不同国家语言环境的支持。其中数据库的字符集是在数据库创建的阶段, 即 create database
语句中指定的，数据库一经建立，字符集就没法改变了，除非重建。我们最常用的字符集设置通常为 zhs16cgb231280(国标2312字库) 和
ZHS16GBK(方正 GBK
字库)。GBK是在GB2312-80标准基础上的内码扩展规范，使用了双字节编码方案，其编码范围从8140至FEFE（剔除xx7F），共23940
个码位，共收录了21003个汉字，完全兼容国标GB2312-80标准(只实现了6763个汉字)。 <br><br>在项目开发和维护过程中我们经常会遇见下面的情况, 使用 ZHS16CGB231280 字符集的oracle 系统中，姓名中出现的很多疑难汉字无法正常显示（显示为 ??）。<br><br>&nbsp;
&nbsp; 遇见这种情况以往最常见的处理方法是导出数据(exp), 用 ZHS16GBK
字符集重建数据库，最后再导入(imp)数据。但这个过程对于一个大型数据库来说很漫长和痛苦。这里给大家介绍一个比较快速简单的方法，几分钟就能实现字
符集转换。这里以 oracle9i为例(8i中的操作略有不同)。<br><br>1.&nbsp; &nbsp; &nbsp; &nbsp; 作为 oracle 用户登录数据库服务器<br><br>2.&nbsp; &nbsp; &nbsp; &nbsp; 停止监听程序<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; $lsnrctl stop<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 或<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; $lsnrctl stop&nbsp;&nbsp;listener名称<br><br>3.&nbsp; &nbsp; &nbsp; &nbsp; 作为 sysdba 登录数据库, 并检查目前的数据库字符集设置<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; sqlplus /nolog<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; connect /as sysdba<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; select value$ from props$ where name ='NLS_CHARACTERSET';<br><br>如果上述查询结果为 ZHS16CGB231280, 则进行如下操作:<br><br>4.&nbsp; &nbsp; &nbsp; &nbsp; 保存下列数据库配置参数的原始设置<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; show parameter job_queue_processes<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; show parameter aq_tm_processes<br><br>5.&nbsp; &nbsp; &nbsp; &nbsp; 关闭数据库服务,重新启动后修改数据库字符集, 并关闭数据库<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;shutdown immediate<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;startup mount<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;alter system enable restricted session;<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;alter database open;<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;alter system set job_queue_processes = 0;<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;alter system set aq_tm_processes = 0;<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;alter database character set internal_use zhs16gbk;<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;shutdown immediate<br><br>6.&nbsp; &nbsp; &nbsp; &nbsp; 重新启动数据库服务,恢复 job_queue_processes设置<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; startup<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; alter system set job_queue_processes=原始设置;<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; alter system set aq_tm_processes=原始设置;<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; exit<br><br>7.&nbsp; &nbsp; &nbsp; &nbsp; 启动监听程序<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; $lsnrctl start<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; 或<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; $lsnrctl start&nbsp;&nbsp;listener名称<br><br>8.&nbsp; &nbsp; &nbsp; &nbsp; 修改客户端 NLS_LANG 设置<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; windows 客户端在注册表中修改 NLS_LANG 参数:<br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp; nls_lang=”American_america.zhs16gbk”<br><br>&nbsp;
&nbsp; 注意，这里要指出的是, 字符集间的转换可能会造成数据库信息破坏，如把 ZHS16GBK 的oracle 数据库转换为
zhs16cgb231280, 其中的疑难汉字就会变成同样的??, 有时甚至造成主键重复活违反唯一索引等问题。可能很少有人知道, Oracle
其实提供了一个应用程序 csscan, 可以用来检测字符集转换后数据库的内容是否会被破坏。要使用 csscan 程序必须先以 sysdba
的身份执行 $ORACLE_HOME/rdbms/admin 目录下的 csminst.sql。csscan help=y 可以得到关于
csscan 命令使用方法的帮助。<img src ="http://www.blogjava.net/Vencent/aggbug/31336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-02-18 12:43 <a href="http://www.blogjava.net/Vencent/articles/31336.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle数据库移植时字符集问题的解决</title><link>http://www.blogjava.net/Vencent/articles/31335.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Sat, 18 Feb 2006 04:42:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/31335.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/31335.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/31335.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/31335.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/31335.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>

<font size="2">对于oracle数据库之间的移植采用oracle的导入导出工具(import/export)是一个比较好的
策略。虽也可以利用第三方软件如sybase 的power designer中的reverse engineering
进行数据库结构重建，然后在进行较复杂的数据导入过程，但对于作业队列、快照等则不得不用手工来创建。而export能将整个数据库、指定用户、指定表和
相关的数据字典进行输出，export输出的输出转存二进制文件包括了完全重建所有被选对象所需的命令。 </font>
<p><font size="2">本人在为某电厂mis(oracle数据库)数据采用oracle的导入导出工具从windows nt平台移植到digital unix平台时遇到的关于字符集的问题和总结出的经验与大家来分享。 </font></p>
<p><font size="2">1. 移植环境 <br>原操作系统平台： windows nt <br>数据库： oracle 8.0.5 for windows nt <br>服务器：hp netserver lh3 <br>目标操作系统平台：digital unix alpha v4.0 <br>数据库：oracle 8.0.4 for digital unix <br>服务器：alphaserver es40 小型机 </font></p>
<p><font size="2">2. 数据导出 <br>在nt服务器上用oracle导出工具进行数据导出,oracle导出工具有命令行和图形界面两种方式。 <br>本人直接用命令行方式进行数据导出： <br>c:&gt; exp80 gxmisdba/manager file=c:expdat.dmp log=c:export.log <br>即将导出指定的用户... <br>. 正在导出用户gxmisdba的外部函数程序库名称 <br>. 正在导出用户gxmisdba的对象类型定义 <br>即将导出gxmisdba的对象 ... <br>. 正在导出数据库链接 <br>. 正在导出序号 <br>. 正在导出群集定义 <br>. 即将导出gxmisdba的表通过常规路径 ... <br>. . 正在导出表 　　　　aaaaa 　　　　　　　　　0 行被导出 <br>. . 正在导出表 　evt_carrier_configuration 　　0 行被导出 <br>. . 正在导出表 　　　tbl_aj_agks 　　　　　　331 行被导出 <br>　　. <br>　　. <br>　　. <br>. 正在导出同义词 <br>. 正在导出视图 <br>. 正在导出存储的过程 <br>. 正在导出参考资料一致性约束条件 <br>. 正在导出触发器 <br>. 正在导出后期表活动 <br>. 正在导出快照 <br>. 正在导出快照日志 <br>. 正在导出作业队列 <br>. 正在导出刷新组和子组 <br>在没有警告的情况下成功终止导出。 </font></p>
<p><font size="2">3.数据导入 <br>在nt服务器上通过ftp命令将导出的输出转存二进制文件expdat.dmp(使用binary传输模式)传输至digital unix服务器上。 <br>用oracle for digital unix 数据导入工具命令行方式进行数据导入 <br>$imp gxmisdba/manager file=/expdat.dmp full=y log=u01import.log <br>connected to: oracle8 enterprise edition release 8.0.4.0.0 - production <br>pl/sql release 8.0.4.0.0 - production <br>export file created by export:v08.00.05 via conventional path <br>. importing gxmisdbas objects into gxmisdba <br>. . importing table 　　"aaaaa" 　　　　　　　　　　　0 rows imported <br>. . importing table 　"evt_carrier_configuration" 　　0 rows imported <br>. . importing table 　　"tbl_aj_stk" 　　　　　　　 331 rows imported <br>imp-00017: following statement failed with oracle error 2437: <br>"alter
table "tbl_kj_jlry" add constraint "pk_tbl_kj_jlry" primary key
("fld_kj_jlry_bh","fld_kj_jlry_xm") using index pctfree 10 initrans 2
maxtrans 255 storage (initial 10240 next 10240 minextents 1 maxextents
2147483645 pctincrease 50 freelists 1 freelist groups 1 buffer_pool
default)" <br>"　　　　　　enable novalidate" <br>imp-00003: oracle error 2437 encountered <br>ora-02437: cannot enable (gxmisdba.pk_tbl_kj_jlry) - primary key violated <br>. <br>. <br>. <br>import terminated successfully with warnings. <br>数
据导入出现20多个以上类似错误，后分析其中报错的"tbl_aj_stk"表，发现"fld_kj_jlry_xm"字段值(关键字组成之一)为中文字
符而在digital unix服务器oracle数据库中"fld_kj_jlry_xm"字段值显示的为"????"(在客户端用oracle
sql plus查看)，从而造成关键字冲突。 <br>在客户端oracle sql
plus对某行显示"????"的字段值进行修改，如改成中文值”测试”,提交后，用sql语句查看，刚修改的行中显示"????"的字段值变成了”测
试”，这说明了digital unin服务器上的oracle数据集可以存储中文字符，但oracle 8.0.4 for digital
unin的导入工具imp未能将oracle 8.0.5 for windows nt imp80导出的中文数据进行转换。 </font></p>
<p><font size="2">4.查看字符集参数 <br>4.1查看oracle 8.0.5 for windows nt props$内容 <br>sql&gt; connect sys/change_on_install <br>sql&gt; col value$ format a40 <br>sql&gt; select name,value$ from props$; <br>name　　　　　　　　　　　　　　value$ <br>--------------------------------------- <br>dict.base　　　　　　　　　　　 2 <br>nls_language 　　　　　　　　　 american <br>nls_territory　　　　　　　　　 america <br>nls_currency 　　　　　　　　　 $ <br>nls_iso_currency 　　　　　　　 america <br>nls_numeric_characters　　　　　., <br>nls_calendar 　　　　　　　　　 gregorian <br>nls_date_format 　　　　　　　　dd-mon-yy <br>nls_date_language 　　　　　　　american <br>nls_characterset 　　　　　　　 zhs16gbk <br>nls_sort　　　　　　　　　　　　binary <br>nls_nchar_characterset　　　　　zhs16gbk <br>nls_rdbms_version　　　　　　　 8.0.5.0.0 <br>global_db_name　　　　　　　　　oracle.world <br>export_views_version　　　　　　7 <br>已选择15行。 </font></p>
<p><font size="2">4.2查看oracle 8.0.4 for digital unin 的props$内容 <br>sql&gt; connect sys/change_on_install <br>sql&gt; col value$ format a40 <br>sql&gt; select name,value$ from props$; <br>name　　　　　　　　　　　　　　value$ <br>--------------------------------------- <br>dict.base 　　　　　　　　　　　2 <br>nls_language 　　　　　　　　　 american <br>nls_territory 　　　　　　　　　america <br>nls_currency 　　　　　　　　　 $ <br>nls_iso_currency 　　　　　　　 america <br>nls_numeric_characters 　　　　 ., <br>nls_calendar 　　　　　　　　　 gregorian <br>nls_date_format 　　　　　　　　dd-mon-yy <br>nls_date_language 　　　　　　　american <br>nls_characterset 　　　　　　　 zhs16cgb231280 <br>nls_sort 　　　　　　　　　　　 binary <br>nls_nchar_characterset 　　　　 zhs16cgb231280 <br>nls_rdbms_version 　　　　　　　8.0.4.0.0 <br>global_db_name 　　　　　　　　 orcl.world <br>export_views_version　　　　　　7 <br>15 rows selected. <br>发
现oracle 8.0.4 for digital unin 采用了oracle在digital
unix环境下建议的中文字符集zhs16cgb231280,两者的字符集不同，于是本人就在digital
unin服务器上重新安装oracle，选择了与nt上同样的字符集zhs16gbk(中国简体汉字16位国标库)。安装完成后，通过查看props$的
内容，确认了oracle 8.0.4 for digital unin和oracle 8.0.5 for windows
nt的字符集一致。于是用oracle 8.0.4 for digital
unin的导入工具imp重新进行数据导入，但还是报同样的错误，问题还未得到解决。 </font></p>
<p><font size="2">5.问题解决办法 <br>后来本人发现在oracle 8.0.5 for windows
nt的服务器(或装有oracle 8.0.5 for windows 95/98的工作站)上直接用oracle 8.0.5 for
windows nt的导入工具imp80远程对oracle 8.0.4 for digital unin数据库进行数据导入，问题竟得到解决。 <br>5.1在nt的服务器上，修改tnsnames.ora(或通过oracle net8 easy config)设置数据库连接字符串gxmis(可自行设定)指向oracle 8.0.4 for digital unin服务器。 </font></p>
<p><font size="2">5.2在nt的服务器上进行数据远程导入 <br>c:&gt;imp80 gxmisdba/manager@gxmis file=c:expdat.dmpfull=y log=c:import.log </font></p>
<p><font size="2">已连接到：oracle8 enterprise edition release 8.0.4.0.0 - production <br>pl/sql release 8.0.4.0.0 - production <br>经由常规路径导出由export:v08.00.05创建的文件 <br>. 正在将gxmisdba的对象导入到 gxmisdba <br>. . 正在导入表 "aaaaa" 0行被导入 <br>. . 正在导入表 "evt_carrier_configuration" 0行被导入 <br>. . 正在导入表 "tbl_aj_agks" 331行被导入 <br>. <br>. <br>. <br>准备启用约束条件... <br>成功终止导入 </font></p>
<p><font size="2">5.3把oracle 8.0.4 for digital unin字符集重新又改成zhs16cgb231280,进行数据远程导入测试，数据也同样地导入成功。说明zhs16cgb231280字符集可以兼容zhs16gbk字符集。 </font></p>
<p><font size="2">6.经验总结 <br>6.1在oracle 8.0.4 for digital unin服务器上(字符集zhs16gbk)用8.0.4 for digital unin的导出工具exp将已正常(即可存储和显示中文)的数据库导出。 <br>$ exp gxmisdba/manager file=/u01/expdat.dmp log=/u01/export.log <br>显示成功导出。 <br>在用oracle 8.0.4 for digital unin的导入工具imp进行导入 <br>$imp gxmisdba/manager file=/u01/expdat.dmp full=y log=u01import.log <br>错误又重现。 </font></p>
<p><font size="2">6.2在nt服务器上通过ftp命令将在oracle 8.0.4 for digital unin服务器上刚导出的输出转存二进制文件expdat.dmp下载至nt服务器上，用imp80进行远程导入。 <br>c:&gt;imp80 gxmisdba/manager@gxmis file=c:expdat.dmp full=y log=c:import.log <br>已连接到：oracle8 enterprise edition release 8.0.4.0.0 – production <br>pl/sql release 8.0.4.0.0 – production <br>imp-00016: 不支持要求的字符集转换（从类型1到852） <br>imp-00000: 未成功终止导入 </font></p>
<p><font size="2">6.3在nt服务器上对digital unin服务器上的数据进行远程导出(备份) <br>c:&gt;exp80 gxmisdba/manager@gxmis file=c:expdat.dmp log=c:export.log <br>显示成功导出。再进行远程导入 <br>c:&gt;imp80 gxmisdba/manager@gxmis file=c:expdat.dmp full=y log=c:import.log <br>显示成功导入。通过客户端oracle sql plus查看中文显示正常。 <br>从
而说明在oracle 8.0.4 for digital unin服务器上对含有中文的数据库的数据移植、备份、数据恢复不要用oracle
8.0.4 for digital unin本身自带的导入导出工具imp,exp，应使用能进行中文导入导出的工具，如imp80,exp80。 </font></p><img src ="http://www.blogjava.net/Vencent/aggbug/31335.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-02-18 12:42 <a href="http://www.blogjava.net/Vencent/articles/31335.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle 9.2.0.4 在 Redhat AS3 上安装全过程</title><link>http://www.blogjava.net/Vencent/articles/31184.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Fri, 17 Feb 2006 04:42:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/31184.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/31184.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/31184.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/31184.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/31184.html</trackback:ping><description><![CDATA[<p>Oracle 9.2.0.4 在 Redhat AS3 上安装全过程</p>
<p>折腾我3天&nbsp; 总算是搞定了 同一版本的Oracle 装在不同版本Redhat上 装法都不同 真是麻烦 难怪微软称霸世界
他的产品毕竟好装又好用上网看了别人的装配经历若干 但即使是同一版本的Redhat 每人的配置又都不一样 装法也有差别
Linux的可配置性太高这点不象windows 每个人的windows都差不多 微软没留太多的配置余地给用户 好了说正经的</p>
<p>基本参数&nbsp;&nbsp; <br>操作系统: Redhat Enterprise Linux as3&nbsp; 默认配置外加所有开发软件包 内存至少512兆
swap分区设置为内存的二倍。不要采用DHCP设置主机名和IP地址，而是“手工设置”。否则会在安装oracle的时候出现如下错误：Thrown
when the IP address of a host cannot be determined&nbsp; </p>
<p>Oracle: 9.2.0.4&nbsp; （注意不是9.2.0.1 这个版本安装后要打补丁升级到 9.2.0.4）</p>
<p>所需的软件<br>Oracle: 9.2.0.4 安装文件<br>ship_9204_linux_disk1.cpio.gz<br>ship_9204_linux_disk2.cpio.gz<br>ship_9204_linux_disk3.cpio.gz</p>
<p>从网上下载升级补丁包,&nbsp; <br>所有的补丁说明如下：&nbsp;&nbsp; <br>p3006854_9204_LINUX.zip 在运行 runInstaller 之前打.<br>p2617419_210_GENERIC.zip 打其他补丁所需要的工具.&nbsp; <br>p3119415_9204_LINUX.zip 在升级到9.2.0.4.0之后打.&nbsp; <br>p3238244_9204_LINUX.zip 用来修agent服务不能启动的错误</p>
<p>安装需要在2个帐户下进行 分别是 root 和 oracle帐户 管理员帐户负责基础设施创建 oracle帐户则负责Oracle软件的安装 帐户切换可用 su<br>每步安装操作一定要看清楚在那个帐户进行&nbsp; 注意我下面的帐户提示</p>
<p>现在开始</p>
<p>1）先以root登录&nbsp; 在root帐户下进行下面操作</p>
<p>首先准备安装需要的软件包和补丁包 先看安装所需要的软件包是否都装了<br>a&nbsp; 检察开发软件包 用下面的命令<br>rpm -q gcc cpp compat-libstdc++ glibc-devel glibc-headers glibc-kernheaders binutils</p>
<p>b&nbsp; 检察安装依赖软件包 查看系统中是否安有以下几个软件包<br>compat-libstdc++-7.3-2.96.122&nbsp; <br>compat-gcc-c++-7.3-2.96.122&nbsp; <br>compat-libstdc++-devel-7.3-2.96.122&nbsp; <br>compat-db-4.0.14-5&nbsp; <br>compat-gcc-7.3-2.96.122&nbsp; <br>setarch-1.3-1.i386.rpm<br>tcl-8.3.5-92.i386.rpm<br>nss_db-compat-2.2-20.i386.rpm&nbsp; </p>
<p>如果还没装 它们都在第2和第3张盘上 把它们都装上 保险的做法是把他们都拷到你当前目录下用下面的命令<br>装过的它会自动跳过<br>rpm -ivh \<br>compat-db-4.0.14-5.i386.rpm \<br>compat-gcc-7.3-2.96.122.i386.rpm \<br>compat-gcc-c++-7.3-2.96.122.i386.rpm \<br>compat-libstdc++-7.3-2.96.122.i386.rpm \<br>compat-libstdc++-devel-7.3-2.96.122.i386.rpm \<br>openmotif21-2.1.30-8.i386.rpm \<br>setarch-1.3-1.i386.rpm \<br>tcl-8.3.5-92.i386.rpm\<br>nss_db-compat-2.2-20.i386.rpm&nbsp; </p>
<p>注意：在装Redhat时一定要选上 gnome开发软件包 否则将来配置 Oracle http是会出错 没装的话现在装上还来的及</p>
<p>2）还是在root帐户下 准备安装过程中需要的用户和用户组&nbsp; 对就是那个oracle帐户<br># groupadd oinstall&nbsp; <br># groupadd dba&nbsp; <br># useradd -g oinstall -G dba oracle&nbsp; <br># passwd oracle&nbsp; </p>
<p>3）还是在root帐户下 准备文件目录：&nbsp; <br># mkdir -p /usr/oracle/product/9.2&nbsp; <br># mkdir /var/opt/oracle&nbsp; <br># chown oracle.dba /var/opt/oracle&nbsp; <br># chown -R oracle.dba /usr/oracle&nbsp; <br># chmod 777 /var/opt/oracle</p>
<p>3）还是在root帐户下 设置内核参数，调节信号灯及共享内存：&nbsp; <br># echo 250 32000 100 128 &gt; /proc/sys/kernel/sem&nbsp; <br># echo 1073741824 &gt; /proc/sys/kernel/shmmax&nbsp; <br># echo 4096 &gt; /proc/sys/kernel/shmmni&nbsp; <br># echo 2097152 &gt; /proc/sys/kernel/shmall&nbsp; <br># echo 65536 &gt; /proc/sys/fs/file-max&nbsp; <br># echo 1024 65000 &gt; /proc/sys/net/ipv4/ip_local_port_range&nbsp; <br>&nbsp; <br>当然为了一开机系统就能自动帮你设好这些参数，也可改动 /etc/sysctl.conf 这个文件，加入以下的语句：&nbsp; <br>kernel.shmmax = 1073741824&nbsp; <br>kernel.shmmni = 4096&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>kernel.shmall = 2097152&nbsp; <br>kernel.sem = 250 32000 100 128&nbsp; <br>fs.file-max = 65536&nbsp; <br>net.ipv4.ip_local_port_range = 1024 65000&nbsp; <br>保存</p>
<p>设置完成后用命令 more /etc/sysctl.conf |grep kernel.s 检查.<br>Shmmax： 最大共享内存1GB 物理内存如果小的话可以设置成 536870912<br>Shmmni： 最小共享内存 4096KB）</p>
<p>4）还是在root帐户下 设置oracle对文件的要求：&nbsp; <br>编辑文件：/etc/security/limits.conf 加入以下语句：&nbsp; <br>oracle 　　　soft 　　　nofile 　　　65536&nbsp; <br>oracle 　　　hard 　　　nofile　　　65536&nbsp; <br>oracle 　　　soft 　　　nproc 　　　16384&nbsp; <br>oracle 　　　hard 　　　nproc 　　　16384&nbsp; <br>保存</p>
<p>&nbsp;</p>
<p>现在退出root帐户 以oracle帐户登陆<br>4）在oracle帐户下 设该置帐户环境<br>打开.bash.profile文件，将如下内容加入：&nbsp; <br>&nbsp; <br>#oracle 9i&nbsp; <br>export ORACLE_BASE=/usr/oracle&nbsp; <br>export ORACLE_HOME=/usr/oracle/product/9.2&nbsp; <br>export PATH=$ORACLE_HOME/bin:$ORACLE_HOME/Apache/Apache/bin:$PATH&nbsp; <br>export ORACLE_OWNER=oracle&nbsp; <br>export ORACLE_SID=db01&nbsp; <br>export ORACLE_TERM=vt100&nbsp; <br>export LD_ASSUME_KERNEL=2.4.1&nbsp; <br>export THREADS_FLAG=native&nbsp; <br>export LD_LIBRARY_PATH=/usr/oracle/product/9.2/lib:$LD_LIBRARY_PATH&nbsp; <br>export PATH=/opt/ora9/product/9.2/bin:$PATH&nbsp; <br>#&nbsp; <br># change this NLS settings to suit your country:&nbsp; <br># example:&nbsp; <br># german_germany.we8iso8859p15, american_america.we8iso8859p2 etc.&nbsp; <br>#&nbsp; <br>export LANG=en_US&nbsp; </p>
<p>保存后退出。&nbsp; <br>然后。退出登录，再次进入，这时候oracle的环境就已经生效了。</p>
<p>4）转到root帐户下 （可用 su&nbsp; root）<br>随便建立个安装目录把oracle安装文件和补丁都拷进去<br>解压oracle安装文件<br>zcat ship_9204_linux_disk1.cpio.gz | cpio -idmv<br>zcat ship_9204_linux_disk2.cpio.gz | cpio -idmv<br>zcat ship_9204_linux_disk3.cpio.gz | cpio -idmv<br>解压完后看见Disk1,Disk2,Disk3这3个目录</p>
<p>打安装前补丁 p3006854_9204_LINUX.zip 用下面的命令<br># unzip p3006854_9204_LINUX.zip&nbsp; <br>Archive: p3006854_9204_LINUX.zip&nbsp; <br>creating: 3006854/&nbsp; <br>inflating: 3006854/rhel3_pre_install.sh&nbsp; <br>inflating: 3006854/README.txt&nbsp; <br>...&nbsp; <br># cd 3006854&nbsp; <br># sh rhel3_pre_install.sh&nbsp; <br>退出root帐户</p>
<p>5）回到oracle帐户下<br>进到Disk1目录运行<br>./runInstaller&nbsp; <br>启动安装界面</p>
<p>- Welcome Screen:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Click Next<br>- Inventory Location:&nbsp;&nbsp; Click Next<br>- Unix Group Name:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Use "oinstall" and click Next<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; 会提示运行 /tmp/orainstRoot.sh, 运行它然后继续<br>- File Locations:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Use default values<br>- Available Products:&nbsp;&nbsp; Select "Oracle9i Database 9.2.0.4"<br>- Installation Types:&nbsp;&nbsp; 选择安装类型是“通用”除非你有特别要求 如数据仓库 或不想要产生默认数据库<br>- 输入全局数据库名：&nbsp;&nbsp;&nbsp;&nbsp; 我一般设为和下面SID一样<br>- 数据文件的存放位置:&nbsp;&nbsp;&nbsp; 我采用的是默认位置，点“Next”；<br>出现安装组件的选择结果，这时点“Install”，开始安装，复制文件，进度条在一点一点的增加，当安装并link完后，会提示运行root.sh 运行它然后继续<br>出现配置工具界面，默认数据库正确配置完毕后会自动产生2个数据库管理员帐户 SYS 和 SYSTEM 分别设置密码然后继续<br>agent服务不能配置成功，忽略不用管，在下面修复。DBCA，NETCA，HTTP都正确配置完毕哦。下面开始修复错误。</p>
<p>6）转到root帐户下 （可用 su&nbsp; root）<br>先加入下面2个环境变量<br>#export ORACLE_BASE=/usr/oracle&nbsp; <br>#export ORACLE_HOME=/usr/oracle/product/9.2</p>
<p>先解压补丁工具 p2617419_210_GENERIC.zip 这是打其他补丁所需要的工具opatch.<br># unzip p2617419_210_GENERIC.zip&nbsp; <br>Archive: p2617419_210_GENERIC.zip&nbsp; <br>creating: OPatch/&nbsp; <br>creating: OPatch/docs/&nbsp; <br>inflating: Opatch/docs/FAQ&nbsp; <br>......&nbsp; <br>inflating: README.txt&nbsp;&nbsp; <br># pwd&nbsp; <br>解压所在目录&nbsp; <br># export PATH=$PATH:解压所在目录/OPatch:/sbin</p>
<p>安装p3119415_9204_LINUX.zip 补丁<br># unzip p3119415_9204_LINUX.zip&nbsp; <br>Archive: p3119415_9204_LINUX.zip&nbsp; <br>creating: 3119415/&nbsp; <br>......&nbsp; <br>inflating: 3119415/README.txt&nbsp; <br># cd 3119415&nbsp; <br># opatch apply&nbsp; </p>
<p>安装p3238244_9204_LINUX.zip补丁<br>unzip p3238244_9204_LINUX.zip<br># cd 3238244<br>...<br># opatch apply</p>
<p>补丁修复完成，需要relinked一个.mk文件。<br>回到oracle帐户下<br>$ cd $ORACLE_HOME/network/lib<br>$ make -f ins_oemagent.mk install<br>现在在运行agentctl start，看是不是可以成功运行agent服务了啊，可以用stop、status来停止此服务或者检查服务的状态</p>
<p>好了全部的安装就算成功了.&nbsp; <br>祝贺你,恶梦结束了&nbsp; </p>
<p>要配置数据库用<br>$dbca</p>
<p>要启动企业管理器<br>$oemapp console<br>看看能不能连上刚才创建的数据库</p>
<p>注意：下次从新开机后企业管理器中打开数据库报ORA-12541:TNS:no listener错误<br>这是因为监听服务（listener）第一次是安装程序为你启动的 以后你得自己启动 用下面的命令<br>$lsnrctl start</p><img src ="http://www.blogjava.net/Vencent/aggbug/31184.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-02-17 12:42 <a href="http://www.blogjava.net/Vencent/articles/31184.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle性能调优实践中的几点心得</title><link>http://www.blogjava.net/Vencent/articles/31182.html</link><dc:creator>Vincent Chen</dc:creator><author>Vincent Chen</author><pubDate>Fri, 17 Feb 2006 04:41:00 GMT</pubDate><guid>http://www.blogjava.net/Vencent/articles/31182.html</guid><wfw:comment>http://www.blogjava.net/Vencent/comments/31182.html</wfw:comment><comments>http://www.blogjava.net/Vencent/articles/31182.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Vencent/comments/commentRss/31182.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Vencent/services/trackbacks/31182.html</trackback:ping><description><![CDATA[很多的时侯，做Oracle
DBA的我们，当应用管理员向我们通告现在应用很慢、数据库很慢的时侯，我们到数据库时做几个示例的Select也发现同样的问题时，有些时侯我们会无从
下手，因为我们认为数据库的各种命种率都是满足Oracle文档的建议。实际上如今的优化己经向优化等待(waits)转型了，实际中性能优化最根本的出
现点也都集中在IO，这是影响性能最主要的方面，由系统中的等待去发现Oracle库中的不足、操作系统某些资源利用的不合理是一个比较好的办法，下面把
我的一点实践经验与大家分享一下，本文测重于Unix环境。 <br><br>一、
通过操作系统的一些工具检查系统的状态，比如CPU、内存、交换、磁盘的利用率，根据经验或与系统正常时的状态相比对，有时系统表面上看起来看空闲这也可
能不是一个正常的状态，因为cpu可能正等待IO的完成。除此之外我们还应观注那些占用系统资源(cpu、内存)的进程。 <br><br>　　 1、如何检查操作系统是否存在IO的问题？使用的工具有sar,这是一个比较通用的工具。 <br><br>　　 Rp1#Sar -u 2 10 <br><br>　　 即每隔2秒检察一次，共执行20次，当然这些都由你决定了。 <br><br>　　 示例返回： <br><br>　　 HP-UX hpn2 B.11.00 U 9000/800 08/05/03 <br><br>　　 18:26:32 %usr %sys %wio %idle <br><br>　　 18:26:34 80 9 12 0 <br><br>　　 18:26:36 78 11 11 0 <br><br>　　 18:26:38 78 9 13 1 <br><br>　　 18:26:40 81 10 9 1 <br><br>　　 18:26:42 75 10 14 0 <br><br>　　 18:26:44 76 8 15 0 <br><br>　　 18:26:46 80 9 10 1 <br><br>　　 18:26:48 78 11 11 0 <br><br>　　 18:26:50 79 10 10 0 <br><br>　　 18:26:52 81 10 9 0 <br><br>　　 Average 79 10 11 0 <br><br>　
　
其中的%usr指的是用户进程使用的cpu资源的百分比，%sys指的是系统资源使用cpu资源的百分比，%wio指的是等待io完成的百分比，这是值得
我们观注的一项，%idle即空闲的百分比。如果wio列的值很大，如在35%以上，说明你的系统的IO存在瓶颈，你的CPU花费了很大的时间去等待IO
的完成。Idle很小说明系统CPU很忙。像我的这个示例，可以看到wio平均值为11说明io没什么特别的问题，而我的idle值为零，说明我的cpu
已经满负荷运行了。 <br><br>　　 当你的系统存在IO的问题，可以从以下几个方面解决 <br><br>　　 ＊联系相应的操作系统的技术支持对这方面进行优化，比如hp-ux在划定卷组时的条带化等方面。 <br><br>　　 ＊查找Oracle中不合理的sql语句，对其进行优化 <br><br>　　 ＊对Oracle中访问量频繁的表除合理建索引外，再就是把这些表分表空间存放以免访问上产生热点，再有就是对表合理分区。 
　　 2、关注一下内存。 <br><br>　　
常用的工具便是vmstat，对于hp-unix来说可以用glance,Aix来说可以用topas,当你发现vmstat中pi列非零，memory
中的free列的值很小，glance,topas中内存的利用率多于80%时，这时说明你的内存方面应该调节一下了，方法大体有以下几项。 <br><br>　　 ＊划给Oracle使用的内存不要超过系统内存的1/2,一般保在系统内存的40%为益。 <br><br>　　 为系统增加内存 <br><br>　　 ＊如果你的连接特别多，可以使用MTS的方式 <br><br>　　 ＊打全补丁，防止内存漏洞。 <br><br>　　 3、如何找到点用系用资源特别大的Oracle的session及其执行的语句。 <br><br>　　 Hp-unix可以用glance,top <br><br>　　 IBM AIX可以用topas <br><br>　　 此外可以使用ps的命令。 <br><br>　
　
通过这些程序我们可以找到点用系统资源特别大的这些进程的进程号，我们就可以通过以下的sql语句发现这个pid正在执行哪个sql，这个sql最好在
pl/sql developer,toad等软件中执行, 把&lt;&gt;中的spid换成你的spid就可以了。 <br><br>　　 SELECT a.username, <br><br>　　 a.machine, <br><br>　　 a.program, <br><br>　　 a.sid, <br><br>　　 a.serial#, <br><br>　　 a.status, <br><br>　　 c.piece, <br><br>　　 c.sql_text <br><br>　　 FROM v$session a, <br><br>　　 v$process b, <br><br>　　 v$sqltext c <br><br>　　 WHERE b.spid= <br><br>　　 AND b.addr=a.paddr <br><br>　　 AND a.sql_address=c.address(+) <br><br>　　 ORDER BY c.piece <br><br>　　 我们就可以把得到的这个sql分析一下，看一下它的执行计划是否走索引，对其优化避免全表扫描，以减少IO等待，从而加快语句的执行速度。 <br><br>　　 提示：我在做优化sql时，经常碰到使用in的语句，这时我们一定要用exists把它给换掉，因为Oracle在处理In时是按Or的方式做的，即使使用了索引也会很慢。 <br><br>　　 比如： <br><br>　　 SELECT col1,col2,col3 FROM table1 a <br><br>　　 WHERE a.col1 not in (SELECT col1 FROM table2) <br><br>　　 可以换成： <br><br>　　 SELECT col1,col2,col3 FROM table1 a <br><br>　　 WHERE not exists <br><br>　　 (SELECT 'x' FROM table2 b <br><br>　　 WHERE a.col1=b.col1) <br><br>　　 4、另一个有用的脚本：查找前十条性能差的sql. <br><br>　　 SELECT * FROM <br><br>　　 ( <br>　　 SELECT PARSING_USER_ID <br><br>　　　　 EXECUTIONS, <br><br>　　　　 SORTS, <br><br>　　　　 COMMAND_TYPE, <br><br>　　　　 DISK_READS, <br><br>　　　　 sql_text <br><br>　　 FROM v$sqlarea <br><br>　　 ORDER BY disk_reads DESC <br><br>　　 ) <br><br>　　 WHERE ROWNUM&lt;10 ; <br>　　 二、迅速发现Oracle Server的性能问题的成因，我们可以求助于v$session_wait这个视图，看系统的这些session在等什么，使用了多少的IO。以下是我提供的参考脚本： <br><br>　　 脚本说明：查看占io较大的正在运行的session <br><br>　　 SELECT se.sid, <br><br>　　　　 se.serial#, <br><br>　　　　 pr.SPID, <br><br>　　　　 se.username, <br><br>　　　　 se.status, <br><br>　　　　 se.terminal, <br><br>　　　　 se.program, <br><br>　　　　 se.MODULE, <br><br>　　　　 se.sql_address, <br><br>　　　　 st.event, <br><br>　　　　 st.p1text, <br><br>　　　　 si.physical_reads, <br><br>　　　　 si.block_changes <br><br>　　 FROM v$session se, <br><br>　　　　 v$session_wait st, <br><br>　　　　 v$sess_io si, <br><br>　　　　 v$process pr <br><br>　　 WHERE st.sid=se.sid <br><br>　　　　 AND st.sid=si.sid <br><br>　　　　 AND se.PADDR=pr.ADDR <br><br>　　　　 AND se.sid&gt;6 <br><br>　　　　 AND st.wait_time=0 <br><br>　　　　 AND st.event NOT LIKE '%SQL%' <br><br>　　 ORDER BY physical_reads DESC <br>　　 对检索出的结果的几点说明： <br><br>　　 1、我是按每个正在等待的session已经发生的物理读排的序，因为它与实际的IO相关。 <br><br>　　 2、你可以看一下这些等待的进程都在忙什么，语句是否合理？ <br><br>　　 Select sql_address from v$session where sid= ; <br><br>　　 Select * from v$sqltext where address= ; <br><br>　　 执行以上两个语句便可以得到这个session的语句。 <br><br>　　 你也以用alter system kill session 'sid,serial#';把这个session杀掉。 <br><br><br>　　 3、应观注一下event这列，这是我们调优的关键一列，下面对常出现的event做以简要的说明： <br>a、
buffer busy waits，free buffer
waits这两个参数所标识是dbwr是否够用的问题，与IO很大相关的，当v$session_wait中的free buffer
wait的条目很小或没有的时侯，说明你的系统的dbwr进程决对够用，不用调整；free buffer
wait的条目很多，你的系统感觉起来一定很慢，这时说明你的dbwr已经不够用了，它产生的wio已经成为你的数据库性能的瓶颈，这时的解决办法如下：
<br><br>　　 a.1增加写进程，同时要调整db_block_lru_latches参数 <br><br>　　 示例：修改或添加如下两个参数 <br>　　 db_writer_processes=4 <br><br>　　 db_block_lru_latches=8 <br><br>　　 a、2开异步IO，IBM这方面简单得多，hp则麻烦一些，可以与Hp工程师联系。 <br><br>　　 b、db file sequential read，指的是顺序读，即全表扫描，这也是我们应该尽量减少的部分，解决方法就是使用索引、sql调优，同时可以增大db_file_multiblock_read_count这个参数。 <br><br>　　 c、db file scattered read,这个参数指的是通过索引来读取，同样可以通过增加db_file_multiblock_read_count这个参数来提高性能。 <br><br>　　 d、latch free,与栓相关的了，需要专门调节。 <br><br>　　 e、其他参数可以不特别观注。 <br><br>　　 结篇：匆忙之中写下了这篇文章，希望能抛砖引玉，能为你的Oracle调优实践带来帮助。 <img src ="http://www.blogjava.net/Vencent/aggbug/31182.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Vencent/" target="_blank">Vincent Chen</a> 2006-02-17 12:41 <a href="http://www.blogjava.net/Vencent/articles/31182.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>