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

<channel>
	<title>我的技术生活-王炜 &#187; DB</title>
	<atom:link href="http://www.aaronw.cn/cache/db/feed" rel="self" type="application/rss+xml" />
	<link>http://www.aaronw.cn</link>
	<description>只为成功找方法，不为失败找借口</description>
	<lastBuildDate>Wed, 01 Sep 2010 13:51:26 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>命令行方式管理MySQL数据库实例</title>
		<link>http://www.aaronw.cn/static/378.html</link>
		<comments>http://www.aaronw.cn/static/378.html#comments</comments>
		<pubDate>Sun, 07 Jun 2009 16:15:23 +0000</pubDate>
		<dc:creator>Aaron.wang</dc:creator>
				<category><![CDATA[DB]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.aaronw.cn/?p=378</guid>
		<description><![CDATA[一、从命令行登录MySQL数据库服务器
1、登录使用默认3306端口的MySQL
/usr/local/mysql/bin/mysql -u root -p
2、通过TCP连接管理不同端口的多个MySQL（注意：MySQL4.1以上版本才有此项功能）
/usr/local/mysql/bin/mysql -u root -p &#8211;protocol=tcp &#8211;host=localhost &#8211;port=3307
3、通过socket套接字管理不同端口的多个MySQL
/usr/local/mysql/bin/mysql -u root -p &#8211;socket=/tmp/mysql3307.sock
4、通过端口和IP管理不同端口的多个MySQL
/usr/local/mysql/bin/mysql -u root -p -P 3306 -h 127.0.0.1

二、数据库操作SQL语句
1、显示服务器上当前存在什么数据库
SHOW DATABASES;
2、创建名称为rewin的数据库
CREATE DATABASE rewin;
3、删除名称为rewin的数据库
DROP DATABASE rewin;
4、选择rewin数据库
USE rewin;
三、表操作SQL语句（登录之后必须用以上的USE命令选择一个数据库，再进行表操作）
1、显示当前数据库中存在什么表
SHOW TABLES;
2、创建数据库表zhangyan：在mysql&#62;后粘贴以下SQL语句，存储引擎为MYISAM，字段id为主键、唯一索引。
CREATE TABLE `zhangyan` (
`id` INT( 5 ) UNSIGNED NOT NULL AUTO_INCREMENT ,
`username` VARCHAR( 20 ) NOT NULL ,
`password` CHAR( 32 ) NOT NULL ,
`time` DATETIME NOT NULL ,
`number` [...]]]></description>
			<content:encoded><![CDATA[<p>一、从命令行登录MySQL数据库服务器<br />
1、登录使用默认3306端口的MySQL</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">/usr/local/mysql/bin/mysql -u root -p</div>
<p>2、通过TCP连接管理不同端口的多个MySQL（注意：MySQL4.1以上版本才有此项功能）</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">/usr/local/mysql/bin/mysql -u root -p &#8211;protocol=tcp &#8211;host=localhost &#8211;port=3307</div>
<p>3、通过socket套接字管理不同端口的多个MySQL</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">/usr/local/mysql/bin/mysql -u root -p &#8211;socket=/tmp/mysql3307.sock</div>
<p>4、通过端口和IP管理不同端口的多个MySQL</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">/usr/local/mysql/bin/mysql -u root -p -P 3306 -h 127.0.0.1</div>
<p><span id="more-378"></span></p>
<p>二、数据库操作SQL语句<br />
1、显示服务器上当前存在什么数据库</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">SHOW DATABASES;</div>
<p>2、创建名称为rewin的数据库</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">CREATE DATABASE rewin;</div>
<p>3、删除名称为rewin的数据库</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">DROP DATABASE rewin;</div>
<p>4、选择rewin数据库</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">USE rewin;</div>
<p>三、表操作SQL语句（登录之后必须用以上的USE命令选择一个数据库，再进行表操作）<br />
1、显示当前数据库中存在什么表</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">SHOW TABLES;</div>
<p>2、创建数据库表zhangyan：在mysql&gt;后粘贴以下SQL语句，存储引擎为MYISAM，字段id为主键、唯一索引。</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">CREATE TABLE `zhangyan` (<br />
`id` INT( 5 ) UNSIGNED NOT NULL AUTO_INCREMENT ,<br />
`username` VARCHAR( 20 ) NOT NULL ,<br />
`password` CHAR( 32 ) NOT NULL ,<br />
`time` DATETIME NOT NULL ,<br />
`number` FLOAT( 10 ) NOT NULL ,<br />
`content` TEXT NOT NULL ,<br />
PRIMARY KEY ( `id` )<br />
) ENGINE = MYISAM ;</div>
<p>3、查看zhangyan表结构</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">DESCRIBE zhangyan;</div>
<p>4、从表中检索信息<br />
4.1、从zhangyan表中检索所有记录</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">SELECT * FROM zhangyan;</div>
<p>4.2、从zhangyan表中检索特定的行：字段username等于abc，字段number等于1，按字段id降序排列</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">SELECT * FROM zhangyan WHERE username = &#8216;abc&#8217; AND number=&#8217;1&#8242; ORDER BY id DESC;</div>
<p>4.3、从zhangyan表中检索指定的字段：username和password</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">SELECT username, password FROM zhangyan;</div>
<p>4.4、从zhangyan表中检索出唯一的不重复记录：</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">SELECT DISTINCT username FROM zhangyan;</div>
<p>5、插入信息到zhangyan表</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">INSERT INTO zhangyan (id, username, password, time, number, content) VALUES (&#8221;, &#8216;abc&#8217;, &#8216;123456&#8242;, &#8216;2007-08-06 14:32:12&#8242;, &#8216;23.41&#8242;, &#8216;hello world&#8217;);</div>
<p>6、更新zhangyan表中的指定信息</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">UPDATE zhangyan SET content = &#8216;hello china&#8217; WHERE username = &#8216;abc&#8217;;</div>
<p>7、删除zhangyan表中的指定信息</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">DELETE FROM zhangyan WHERE id = 1;</div>
<p>8、清空zhangyan表</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">DELETE FROM zhangyan;</div>
<p>9、删除zhangyan表</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">DROP TABLE zhangyan;</div>
<p>10、更改表结构，将zhangyan表username字段的字段类型改为CHAR(25)</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">ALTER TABLE zhangyan CHANGE username username CHAR(25);</div>
<p>11、将当前目录下的mysql.sql导入数据库</p>
<div style="border: 1px dashed #00a0c6; margin: 5px; padding: 3px; background-color: #ffffff;">SOURCE ./mysql.sql;</div>
<p>四、数据库权限操作SQL语句<br />
1、创建一个具有root权限，可从任何IP登录的用户sina，密码为zhangyan</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">GRANT ALL PRIVILEGES ON *.* TO &#8217;sina&#8217;@'%&#8217; IDENTIFIED BY &#8216;zhangyan&#8217;;</div>
<p>2、创建一个具有“数据操作”、“结构操作”权限，只能从192.168.1.***登录的用户sina，密码为zhangyan</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">GRANT SELECT , INSERT , UPDATE , DELETE , FILE , CREATE , DROP , INDEX , ALTER , CREATE TEMPORARY TABLES , CREATE VIEW , SHOW VIEW , CREATE ROUTINE, ALTER ROUTINE, EXECUTE ON *.* TO &#8217;sina&#8217;@'192.168.1.%&#8217; IDENTIFIED BY &#8216;zhangyan&#8217;;</div>
<p>3、创建一个只拥有“数据操作”权限，只能从192.168.1.24登录，只能操作rewin数据库的zhangyan表的用户sina，密码为zhangyan</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">GRANT SELECT , INSERT , UPDATE , DELETE ON  rewin.zhangyan TO &#8217;sina&#8217;@'192.168.1.24&#8242; IDENTIFIED BY &#8216;zhangyan&#8217;;</div>
<p>4、创建一个拥有“数据操作”、“结构操作”权限，可从任何IP登录，只能操作rewin数据库的用户sina，密码为zhangyan</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">GRANT SELECT , INSERT , UPDATE , DELETE , CREATE , DROP , INDEX , ALTER , CREATE TEMPORARY TABLES , CREATE VIEW , SHOW VIEW , CREATE ROUTINE, ALTER ROUTINE, EXECUTE ON rewin.* TO &#8217;sina&#8217;@'%&#8217; IDENTIFIED BY &#8216;zhangyan&#8217;;</div>
<p>5、删除用户</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">DROP USER &#8217;sina&#8217;@'%&#8217;;</div>
<p>PS：如果想了解更多的MySQL操作资料，请参考<a href="http://dev.mysql.com/doc/refman/5.1/zh/" target="_blank">MySQL官方的中文参考手册</a></p>
<p>文章转载自<a href="http://blog.s135.com/" target="_blank">http://blog.s135.com</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronw.cn/static/378.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql安装和优化[原创]</title>
		<link>http://www.aaronw.cn/static/357.html</link>
		<comments>http://www.aaronw.cn/static/357.html#comments</comments>
		<pubDate>Thu, 14 May 2009 15:42:33 +0000</pubDate>
		<dc:creator>Aaron.wang</dc:creator>
				<category><![CDATA[DB]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[mysql优化]]></category>
		<category><![CDATA[mysql配置]]></category>

		<guid isPermaLink="false">http://www.aaronw.cn/?p=357</guid>
		<description><![CDATA[在日常生活中,我们使用mysql的地方很多,尤其是使用开源软件.下面介绍一下mysql的安装和优化,以安装源码为例!
1 安装
tar xzf mysql-5.1.33.tar.gz
cd mysql-5.1.33
./BUILD/autorun.sh  #安装第三方引擎或修改源码时候运行
./configure  &#8211;prefix=/usr/local/mysql &#8211;enable-shared &#8211;disable-thread-safe-client &#8211;enable-assembler &#8211;enable-local-infile &#8211;with-charset=utf8 &#8211;with-extra-charsets=all &#8211;with-big-tables &#8211;with-ssl &#8211;with-embedded-server
make &#038;&#038; make install
cp  support-files/my-huge.cnf /etc/my.cnf
mysql_install_db &#8211;user=mysql
mysqladmin -u root password &#8220;xxxx&#8221;

2 优化
优化从这几个方面入手(mysql各个版本通用,注意名字不一定一样,可通过show variables查看)
* Slow Query Log
* Max Connections
* Worker Threads
* Key Buffer
* Query Cache
* Sort Buffer
* Joins
* Temp Tables
* Table (Open &#38; Definition) Cache
* Table Locking
* Table [...]]]></description>
			<content:encoded><![CDATA[<p>在日常生活中,我们使用mysql的地方很多,尤其是使用开源软件.下面介绍一下mysql的安装和优化,以安装源码为例!</p>
<p>1 安装</p>
<div style="border: 1px dashed #00a0c6; margin: 5px 5px 0px; padding: 3px; background-color: #ffffff;">tar xzf mysql-5.1.33.tar.gz<br />
cd mysql-5.1.33<br />
./BUILD/autorun.sh  #安装第三方引擎或修改源码时候运行<br />
./configure  &#8211;prefix=/usr/local/mysql &#8211;enable-shared &#8211;disable-thread-safe-client &#8211;enable-assembler &#8211;enable-local-infile &#8211;with-charset=utf8 &#8211;with-extra-charsets=all &#8211;with-big-tables &#8211;with-ssl &#8211;with-embedded-server<br />
make &#038;&#038; make install<br />
cp  support-files/my-huge.cnf /etc/my.cnf<br />
mysql_install_db &#8211;user=mysql<br />
mysqladmin -u root password &#8220;xxxx&#8221;</div>
<p><span id="more-357"></span><br />
2 优化<br />
优化从这几个方面入手(mysql各个版本通用,注意名字不一定一样,可通过show variables查看)<br />
* Slow Query Log<br />
* Max Connections<br />
* Worker Threads<br />
* Key Buffer<br />
* Query Cache<br />
* Sort Buffer<br />
* Joins<br />
* Temp Tables<br />
* Table (Open &amp; Definition) Cache<br />
* Table Locking<br />
* Table Scans (read_buffer)<br />
修改/etc/my.cnf的相应的参数如下:<br />
skip-locking<br />
key_buffer_size = 16M<br />
max_allowed_packet = 10M<br />
table_cache = 64<br />
sort_buffer_size = 512K<br />
net_buffer_length = 8K<br />
read_buffer_size = 1M<br />
read_rnd_buffer_size = 2M<br />
open_files_limit    = 1000<br />
max_connections = 300<br />
max_connect_errors = 200<br />
join_buffer_size = 128K<br />
thread_cache_size = 10<br />
thread_concurrency = 8<br />
query_cache_size = 0M<br />
query_cache_limit = 2M<br />
query_cache_min_res_unit = 2k<br />
thread_stack = 192K<br />
tmp_table_size = 512K<br />
long_query_time = 1<br />
bulk_insert_buffer_size = 2M<br />
myisam_sort_buffer_size = 8M<br />
myisam_max_sort_file_size = 8G<br />
myisam_max_extra_sort_file_size = 10G<br />
myisam_repair_threads = 1</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronw.cn/static/357.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle维护常用SQL语句</title>
		<link>http://www.aaronw.cn/static/199.html</link>
		<comments>http://www.aaronw.cn/static/199.html#comments</comments>
		<pubDate>Wed, 14 Jan 2009 10:00:40 +0000</pubDate>
		<dc:creator>Aaron.wang</dc:creator>
				<category><![CDATA[DB]]></category>
		<category><![CDATA[dba]]></category>
		<category><![CDATA[oralce]]></category>

		<guid isPermaLink="false">http://www.aaronw.cn/?p=199</guid>
		<description><![CDATA[1、查看表空间的名称及大小
　　select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size
　　from dba_tablespaces t, dba_data_files d
　　where t.tablespace_name = d.tablespace_name
　　group by t.tablespace_name;
2、查看表空间物理文件的名称及大小
　　select tablespace_name, file_id, file_name,
　　round(bytes/(1024*1024),0) total_space
　　from dba_data_files
　　order by tablespace_name;
3、查看回滚段名称及大小
　　select segment_name, tablespace_name, r.status,
　　(initial_extent/1024) InitialExtent,(next_extent/1024) NextExtent,
　　max_extents, v.curext CurExtent
　　From dba_rollback_segs r, v$rollstat v
　　Where r.segment_id = v.usn(+)
　　order by segment_name ;
4、查看控制文件
　　select name from v$controlfile;
5、查看日志文件
　　select member from v$logfile;

6、查看表空间的使用情况
　　select sum(bytes)/(1024*1024) as free_space,tablespace_name
　　from dba_free_space
　　group by tablespace_name;
　　SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE,
　　(B.BYTES*100)/A.BYTES &#8220;% [...]]]></description>
			<content:encoded><![CDATA[<p>1、查看表空间的名称及大小<br />
　　select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size<br />
　　from dba_tablespaces t, dba_data_files d<br />
　　where t.tablespace_name = d.tablespace_name<br />
　　group by t.tablespace_name;<br />
2、查看表空间物理文件的名称及大小<br />
　　select tablespace_name, file_id, file_name,<br />
　　round(bytes/(1024*1024),0) total_space<br />
　　from dba_data_files<br />
　　order by tablespace_name;<br />
3、查看回滚段名称及大小<br />
　　select segment_name, tablespace_name, r.status,<br />
　　(initial_extent/1024) InitialExtent,(next_extent/1024) NextExtent,<br />
　　max_extents, v.curext CurExtent<br />
　　From dba_rollback_segs r, v$rollstat v<br />
　　Where r.segment_id = v.usn(+)<br />
　　order by segment_name ;<br />
4、查看控制文件<br />
　　select name from v$controlfile;<br />
5、查看日志文件<br />
　　select member from v$logfile;</p>
<p><span id="more-199"></span><br />
6、查看表空间的使用情况<br />
　　select sum(bytes)/(1024*1024) as free_space,tablespace_name<br />
　　from dba_free_space<br />
　　group by tablespace_name;<br />
　　SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE,<br />
　　(B.BYTES*100)/A.BYTES &#8220;% USED&#8221;,(C.BYTES*100)/A.BYTES &#8220;% FREE&#8221;<br />
　　FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C<br />
　　WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND A.TABLESPACE_NAME=C.TABLESPACE_NAME;<br />
7、查看数据库库对象<br />
　　select owner, object_type, status, count(*) count# from all_objects group by owner, object_type, status;<br />
8、查看数据库的版本<br />
　　Select version FROM Product_component_version<br />
　　Where SUBSTR(PRODUCT,1,6)=’Oracle’;<br />
9、查看数据库的创建日期和归档方式<br />
　　Select Created, Log_Mode, Log_Mode From V$Database;<br />
10、捕捉运行很久的SQL<br />
　　column username format a12<br />
　　column opname format a16<br />
　　column progress format a8<br />
　　select username,sid,opname,<br />
　　round(sofar*100 / totalwork,0) || ’%’ as progress,<br />
　　time_remaining,sql_text<br />
　　from v$session_longops , v$sql<br />
　　where time_remaining &lt;&gt; 0<br />
　　and sql_address = address<br />
　　and sql_hash_value = hash_value<br />
11、查看数据表的参数信息<br />
　　SELECT partition_name, high_value, high_value_length, tablespace_name,<br />
　　pct_free, pct_used, ini_trans, max_trans, initial_extent,<br />
　　next_extent, min_extent, max_extent, pct_increase, FREELISTS,<br />
　　freelist_groups, LOGGING, BUFFER_POOL, num_rows, blocks,<br />
　　empty_blocks, avg_space, chain_cnt, avg_row_len, sample_size,<br />
　　last_analyzed<br />
　　FROM dba_tab_partitions<br />
　　&#8211;WHERE table_name = :tname AND table_owner = :towner<br />
　　ORDER BY partition_position<br />
12、查看还没提交的事务<br />
　　select * from v$locked_object;<br />
　　select * from v$transaction;<br />
13、查找object为哪些进程所用<br />
　　select<br />
　　p.spid,<br />
　　s.sid,<br />
　　s.serial# serial_num,<br />
　　s.username user_name,<br />
　　a.type object_type,<br />
　　s.osuser os_user_name,<br />
　　a.owner,<br />
　　a.object object_name,<br />
　　decode(sign(48 &#8211; command),<br />
　　1,<br />
　　to_char(command), ’Action Code #’ || to_char(command) ) action,<br />
　　p.program oracle_process,<br />
　　s.terminal terminal,<br />
　　s.program program,<br />
　　s.status session_status<br />
　　from v$session s, v$access a, v$process p<br />
　　where s.paddr = p.addr and<br />
　　s.type = ’USER’ and<br />
　　a.sid = s.sid and<br />
　　a.object=’SUBSCRIBER_ATTR’<br />
　　order by s.username, s.osuser</p>
<p>14、回滚段查看<br />
　　select rownum, sys.dba_rollback_segs.segment_name Name, v$rollstat.extents<br />
　　Extents, v$rollstat.rssize Size_in_Bytes, v$rollstat.xacts XActs,<br />
　　v$rollstat.gets Gets, v$rollstat.waits Waits, v$rollstat.writes Writes,<br />
　　sys.dba_rollback_segs.status status from v$rollstat, sys.dba_rollback_segs,<br />
　　v$rollname where v$rollname.name(+) = sys.dba_rollback_segs.segment_name and<br />
　　v$rollstat.usn (+) = v$rollname.usn order by rownum<br />
15、耗资源的进程(top session)<br />
　　select s.schemaname schema_name, decode(sign(48 &#8211; command), 1,<br />
　　to_char(command), ’Action Code #’ || to_char(command) ) action, status<br />
　　session_status, s.osuser os_user_name, s.sid, p.spid , s.serial# serial_num,<br />
　　nvl(s.username, ’[Oracle process]’) user_name, s.terminal terminal,<br />
　　s.program program, st.value criteria_value from v$sesstat st, v$session s , v$process p<br />
　　where st.sid = s.sid and st.statistic# = to_number(’38’) and (’ALL’ = ’ALL’<br />
　　or s.status = ’ALL’) and p.addr = s.paddr order by st.value desc, p.spid asc, s.username asc, s.osuser asc<br />
16、查看锁(lock)情况<br />
　　select /*+ RULE */ ls.osuser os_user_name, ls.username user_name,<br />
　　decode(ls.type, ’RW’, ’Row wait enqueue lock’, ’TM’, ’DML enqueue lock’, ’TX’,<br />
　　’Transaction enqueue lock’, ’UL’, ’User supplied lock’) lock_type,<br />
　　o.object_name object, decode(ls.lmode, 1, null, 2, ’Row Share’, 3,<br />
　　’Row Exclusive’, 4, ’Share’, 5, ’Share Row Exclusive’, 6, ’Exclusive’, null)<br />
　　lock_mode, o.owner, ls.sid, ls.serial# serial_num, ls.id1, ls.id2<br />
　　from sys.dba_objects o, ( select s.osuser, s.username, l.type,<br />
　　l.lmode, s.sid, s.serial#, l.id1, l.id2 from v$session s,<br />
　　v$lock l where s.sid = l.sid ) ls where o.object_id = ls.id1 and o.owner<br />
　　&lt;&gt; ’SYS’ order by o.owner, o.object_name<br />
17、查看等待(wait)情况<br />
　　SELECT v$waitstat.class, v$waitstat.count count, SUM(v$sysstat.value) sum_value<br />
　　FROM v$waitstat, v$sysstat WHERE v$sysstat.name IN (’db block gets’,<br />
　　’consistent gets’) group by v$waitstat.class, v$waitstat.count<br />
18、查看sga情况<br />
　　SELECT NAME, BYTES FROM SYS.V_$SGASTAT ORDER BY NAME ASC<br />
19、查看catched object<br />
　　SELECT owner, name, db_link, namespace,<br />
　　type, sharable_mem, loads, executions,<br />
　　locks, pins, kept FROM v$db_object_cache<br />
20、查看V$SQLAREA<br />
　　SELECT SQL_TEXT, SHARABLE_MEM, PERSISTENT_MEM, RUNTIME_MEM, SORTS,<br />
　　VERSION_COUNT, LOADED_VERSIONS, OPEN_VERSIONS, USERS_OPENING, EXECUTIONS,<br />
　　USERS_EXECUTING, LOADS, FIRST_LOAD_TIME, INVALIDATIONS, PARSE_CALLS, DISK_READS,<br />
　　BUFFER_GETS, ROWS_PROCESSED FROM V$SQLAREA<br />
21、查看object分类数量<br />
　　select decode (o.type#,1,’INDEX’ , 2,’TABLE’ , 3 , ’CLUSTER’ , 4, ’VIEW’ , 5 ,<br />
　　’SYNONYM’ , 6 , ’SEQUENCE’ , ’OTHER’ ) object_type , count(*) quantity from<br />
　　sys.obj$ o where o.type# &gt; 1 group by decode (o.type#,1,’INDEX’ , 2,’TABLE’ , 3<br />
　　, ’CLUSTER’ , 4, ’VIEW’ , 5 , ’SYNONYM’ , 6 , ’SEQUENCE’ , ’OTHER’ ) union select<br />
　　’COLUMN’ , count(*) from sys.col$ union select ’DB LINK’ , count(*) from<br />
22、按用户查看object种类<br />
　　select u.name schema, sum(decode(o.type#, 1, 1, NULL)) indexes,<br />
　　sum(decode(o.type#, 2, 1, NULL)) tables, sum(decode(o.type#, 3, 1, NULL))<br />
　　clusters, sum(decode(o.type#, 4, 1, NULL)) views, sum(decode(o.type#, 5, 1,<br />
　　NULL)) synonyms, sum(decode(o.type#, 6, 1, NULL)) sequences,<br />
　　sum(decode(o.type#, 1, NULL, 2, NULL, 3, NULL, 4, NULL, 5, NULL, 6, NULL, 1))<br />
　　others from sys.obj$ o, sys.user$ u where o.type# &gt;= 1 and u.user# =<br />
　　o.owner# and u.name &lt;&gt; ’PUBLIC’ group by u.name order by<br />
　　sys.link$ union select ’CONSTRAINT’ , count(*) from sys.con$</p>
<p>23、有关connection的相关信息<br />
　　1)查看有哪些用户连接<br />
　　select s.osuser os_user_name, decode(sign(48 &#8211; command), 1, to_char(command),<br />
　　’Action Code #’ || to_char(command) ) action, p.program oracle_process,<br />
　　status session_status, s.terminal terminal, s.program program,<br />
　　s.username user_name, s.fixed_table_sequence activity_meter, ’’ query,<br />
　　0 memory, 0 max_memory, 0 cpu_usage, s.sid, s.serial# serial_num<br />
　　from v$session s, v$process p where s.paddr=p.addr and s.type = ’USER’<br />
　　order by s.username, s.osuser<br />
　　2)根据v.sid查看对应连接的资源占用等情况<br />
　　select n.name,<br />
　　v.value,<br />
　　n.class,<br />
　　n.statistic#<br />
　　from v$statname n,<br />
　　v$sesstat v<br />
　　where v.sid = 71 and<br />
　　v.statistic# = n.statistic#<br />
　　order by n.class, n.statistic#<br />
　　3)根据sid查看对应连接正在运行的sql<br />
　　select /*+ PUSH_SUBQ */<br />
　　command_type,<br />
　　sql_text,<br />
　　sharable_mem,<br />
　　persistent_mem,<br />
　　runtime_mem,<br />
　　sorts,<br />
　　version_count,<br />
　　loaded_versions,<br />
　　open_versions,<br />
　　users_opening,<br />
　　executions,<br />
　　users_executing,<br />
　　loads,<br />
　　first_load_time,<br />
　　invalidations,<br />
　　parse_calls,<br />
　　disk_reads,<br />
　　buffer_gets,<br />
　　rows_processed,<br />
　　sysdate start_time,<br />
　　sysdate finish_time,<br />
　　’&gt;’ || address sql_address,<br />
　　’N’ status<br />
　　from v$sqlarea<br />
　　where address = (select sql_address from v$session where sid = 71)<br />
24、查询表空间使用情况select a.tablespace_name &#8220;表空间名称&#8221;,<br />
　　100-round((nvl(b.bytes_free,0)/a.bytes_alloc)*100,2) &#8220;占用率(%)&#8221;,<br />
　　round(a.bytes_alloc/1024/1024,2) &#8220;容量(M)&#8221;,<br />
　　round(nvl(b.bytes_free,0)/1024/1024,2) &#8220;空闲(M)&#8221;,<br />
　　round((a.bytes_alloc-nvl(b.bytes_free,0))/1024/1024,2) &#8220;使用(M)&#8221;,<br />
　　Largest &#8220;最大扩展段(M)&#8221;,<br />
　　to_char(sysdate,’yyyy-mm-dd hh24:mi:ss’) &#8220;采样时间&#8221;<br />
　　from (select f.tablespace_name,<br />
　　sum(f.bytes) bytes_alloc,<br />
　　sum(decode(f.autoextensible,’YES’,f.maxbytes,’NO’,f.bytes)) maxbytes<br />
　　from dba_data_files f<br />
　　group by tablespace_name) a,<br />
　　(select f.tablespace_name,<br />
　　sum(f.bytes) bytes_free<br />
　　from dba_free_space f<br />
　　group by tablespace_name) b,<br />
　　(select round(max(ff.length)*16/1024,2) Largest,<br />
　　ts.name tablespace_name<br />
　　from sys.fet$ ff, sys.file$ tf,sys.ts$ ts<br />
　　where ts.ts#=ff.ts# and ff.file#=tf.relfile# and ts.ts#=tf.ts#<br />
　　group by ts.name, tf.blocks) c<br />
　　where a.tablespace_name = b.tablespace_name and a.tablespace_name = c.tablespace_name<br />
25、 查询表空间的碎片程度<br />
　　select tablespace_name,count(tablespace_name) from dba_free_space group by tablespace_name<br />
　　having count(tablespace_name)&gt;10;<br />
　　alter tablespace name coalesce;<br />
　　alter table name deallocate unused;<br />
　　create or replace view ts_blocks_v as<br />
　　select tablespace_name,block_id,bytes,blocks,’free space’ segment_name from dba_free_space<br />
　　union all<br />
　　select tablespace_name,block_id,bytes,blocks,segment_name from dba_extents;<br />
　　select * from ts_blocks_v;<br />
　　select tablespace_name,sum(bytes),max(bytes),count(block_id) from dba_free_space<br />
　　group by tablespace_name;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronw.cn/static/199.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle Database 11g 体系结构图下载</title>
		<link>http://www.aaronw.cn/static/186.html</link>
		<comments>http://www.aaronw.cn/static/186.html#comments</comments>
		<pubDate>Tue, 09 Sep 2008 08:33:07 +0000</pubDate>
		<dc:creator>Aaron.wang</dc:creator>
				<category><![CDATA[DB]]></category>
		<category><![CDATA[oralce]]></category>

		<guid isPermaLink="false">http://www.aaronw.cn/?p=186</guid>
		<description><![CDATA[Kamus在ITPUB上发布了一张Oracle Database 11g的体系结构图。
文件很大，详细绘制了Oracle11g的数据库体系结构：

感觉很不错，转载一个在这里，供下载。10g版本的在视图结构本站也有提供。
转自http://www.eygle.com
]]></description>
			<content:encoded><![CDATA[<p>Kamus在ITPUB上发布了一张Oracle Database 11g的体系结构图。<br />
文件很大，详细绘制了Oracle11g的数据库体系结构：<br />
<a href="http://www.aaronw.cn/wp-content/uploads/2008/09/oracle11garch.jpg"><img class="aligncenter size-full wp-image-187" title="oracle11garch" src="http://www.aaronw.cn/wp-content/uploads/2008/09/oracle11garch.jpg" alt="" width="400" height="261" /></a><br />
感觉很不错，转载一个在<a href="http://www.aaronw.cn/wp-content/uploads/2008/09/db11g_arch_poster_jun2008_final.zip" target="_blank">这里</a>，供下载。<a href="http://www.aaronw.cn/wp-content/uploads/2008/09/oracle10g_views.pdf" target="_blank">10g版本</a>的在视图结构本站也有提供。</p>
<p>转自http://www.eygle.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronw.cn/static/186.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Oracle 10gR2 软件下载网址收藏</title>
		<link>http://www.aaronw.cn/static/180.html</link>
		<comments>http://www.aaronw.cn/static/180.html#comments</comments>
		<pubDate>Tue, 09 Sep 2008 08:24:01 +0000</pubDate>
		<dc:creator>Aaron.wang</dc:creator>
				<category><![CDATA[DB]]></category>
		<category><![CDATA[oracle10G]]></category>

		<guid isPermaLink="false">http://www.aaronw.cn/?p=180</guid>
		<description><![CDATA[记录一下ORACLE 10gR2的软件下载地址，备用。
下载OTN上的这些软件，你需要一个OTN免费帐号，不过如果通过迅雷进行下载，就不用登陆OTN了： Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Microsoft Windows (32-bit)
http://download.oracle.com/otn/nt/oracle10g/10201/10201_client_win32.zip
http://download.oracle.com/otn/nt/oracle10g/10201/10201_clusterware_win32.zip
http://download.oracle.com/otn/nt/oracle10g/10201/10201_gateways_win32.zip
Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Microsoft Windows (x64)
http://download.oracle.com/otn/nt/oracle10g/10201/102010_win64_x64_database.zip
http://download.oracle.com/otn/nt/oracle10g/10201/102010_win64_x64_client.zip
http://download.oracle.com/otn/nt/oracle10g/10201/102010_win64_x64_clusterware.zip
Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Linux x86
http://download.oracle.com/otn/linux/oracle10g/10201/10201_database_linux32.zip
http://download.oracle.com/otn/linux/oracle10g/10201/10201_client_linux32.zip
http://download.oracle.com/otn/linux/oracle10g/10201/10201_gateways_linux32.zip
Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Linux x86-64
http://download.oracle.com/otn/linux/oracle10g/10201/10201_database_linux_x86_64.cpio.gz
http://download.oracle.com/otn/linux/oracle10g/10201/10201_client_linux_x86_64.cpio.gz
http://download.oracle.com/otn/linux/oracle10g/10201/10201_clusterware_linux_x86_64.cpio.gz
http://download.oracle.com/otn/linux/oracle10g/10201/10201_gateways_linux_x86_64.cpio.gz
Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for AIX5L
http://download.oracle.com/otn/aix/oracle10g/10201/10gr2_aix5l64_database.cpio.gz
http://download.oracle.com/otn/aix/oracle10g/10201/10gr2_aix5l64_client.cpio.gz
http://download.oracle.com/otn/aix/oracle10g/10201/10gr2_aix5l64_cluster.cpio.gz
http://download.oracle.com/otn/aix/oracle10g/10201/10gr2_aix5l64_gateways.cpio.gz
Oracle Database [...]]]></description>
			<content:encoded><![CDATA[<h3>记录一下ORACLE 10gR2的软件下载地址，备用。</h3>
<p>下载OTN上的这些软件，你需要一个OTN免费帐号，不过如果通过迅雷进行下载，就不用登陆OTN了： Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Microsoft Windows (32-bit)</p>
<h4>http://download.oracle.com/otn/nt/oracle10g/10201/10201_client_win32.zip</h4>
<h4>http://download.oracle.com/otn/nt/oracle10g/10201/10201_clusterware_win32.zip</h4>
<h4>http://download.oracle.com/otn/nt/oracle10g/10201/10201_gateways_win32.zip</h4>
<p>Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Microsoft Windows (x64)</p>
<h4>http://download.oracle.com/otn/nt/oracle10g/10201/102010_win64_x64_database.zip</h4>
<h4>http://download.oracle.com/otn/nt/oracle10g/10201/102010_win64_x64_client.zip</h4>
<h4>http://download.oracle.com/otn/nt/oracle10g/10201/102010_win64_x64_clusterware.zip</h4>
<p>Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Linux x86</p>
<h4>http://download.oracle.com/otn/linux/oracle10g/10201/10201_database_linux32.zip</h4>
<h4>http://download.oracle.com/otn/linux/oracle10g/10201/10201_client_linux32.zip</h4>
<h4>http://download.oracle.com/otn/linux/oracle10g/10201/10201_gateways_linux32.zip</h4>
<p>Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Linux x86-64</p>
<h4>http://download.oracle.com/otn/linux/oracle10g/10201/10201_database_linux_x86_64.cpio.gz</h4>
<h4>http://download.oracle.com/otn/linux/oracle10g/10201/10201_client_linux_x86_64.cpio.gz</h4>
<h4>http://download.oracle.com/otn/linux/oracle10g/10201/10201_clusterware_linux_x86_64.cpio.gz</h4>
<h4>http://download.oracle.com/otn/linux/oracle10g/10201/10201_gateways_linux_x86_64.cpio.gz</h4>
<p>Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for AIX5L</p>
<h4>http://download.oracle.com/otn/aix/oracle10g/10201/10gr2_aix5l64_database.cpio.gz</h4>
<h4>http://download.oracle.com/otn/aix/oracle10g/10201/10gr2_aix5l64_client.cpio.gz</h4>
<h4>http://download.oracle.com/otn/aix/oracle10g/10201/10gr2_aix5l64_cluster.cpio.gz</h4>
<h4>http://download.oracle.com/otn/aix/oracle10g/10201/10gr2_aix5l64_gateways.cpio.gz</h4>
<p>Oracle Database 10g Release 2 (10.2.0.2) Enterprise/Standard Edition for Solaris Operating System (x86)</p>
<h4>http://download.oracle.com/otn/solaris/oracle10g/10202/10202_database_solx86.zip</h4>
<h4>http://download.oracle.com/otn/solaris/oracle10g/10202/10202_client_solx86.zip</h4>
<h4>http://download.oracle.com/otn/solaris/oracle10g/10202/10202_clusterware_solx86.zip</h4>
<p>Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Solaris Operating System (x86-64)</p>
<h4>http://download.oracle.com/otn/solaris/oracle10g/10201/x8664/10201_database_solx86_64.zip</h4>
<h4>http://download.oracle.com/otn/solaris/oracle10g/10201/x8664/10201_client_solx86_64.zip</h4>
<h4>http://download.oracle.com/otn/solaris/oracle10g/10201/x8664/10201_clusterware_solx86_64.zip</h4>
<p>收藏备忘！ 转自http://www.eygle.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronw.cn/static/180.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ORACLE 9iR2 软件下载地址收藏</title>
		<link>http://www.aaronw.cn/static/178.html</link>
		<comments>http://www.aaronw.cn/static/178.html#comments</comments>
		<pubDate>Tue, 09 Sep 2008 08:22:54 +0000</pubDate>
		<dc:creator>Aaron.wang</dc:creator>
				<category><![CDATA[DB]]></category>
		<category><![CDATA[oralce9i]]></category>

		<guid isPermaLink="false">http://www.aaronw.cn/?p=178</guid>
		<description><![CDATA[收录Oracle9iR2软件下载地址，备忘。
下载OTN上的这些软件，你需要一个OTN免费帐号，不过如果通过迅雷进行下载，就不用登陆OTN了：
Oracle9i Database Release 2 Enterprise/Standard/Personal Edition for Windows NT/2000/XP
http://download.oracle.com/otn/nt/oracle9i/9201/92010NT_Disk1.zip
http://download.oracle.com/otn/nt/oracle9i/9201/92010NT_Disk2.zip
http://download.oracle.com/otn/nt/oracle9i/9201/92010NT_Disk3.zip
Oracle9i Database Release 2 Enterprise/Standard/Personal/Client Edition for Windows XP 2003/Windows Server 2003 (64-bit)
http://download.oracle.com/otn/nt/oracle9i/9202/92021Win64_Disk1.zip
http://download.oracle.com/otn/nt/oracle9i/9202/92021Win64_Disk2.zip
Oracle9i Database Release 2 Enterprise/Standard Edition for Intel Linux
http://download.oracle.com/otn/linux/oracle9i/9204/ship_9204_linux_disk1.cpio.gz
http://download.oracle.com/otn/linux/oracle9i/9204/ship_9204_linux_disk2.cpio.gz
http://download.oracle.com/otn/linux/oracle9i/9204/ship_9204_linux_disk3.cpio.gz
Oracle9i Database Release 2 (9.2.0.4) Enterprise/Standard Edition for Linux x86-64
http://download.oracle.com/otn/linux/oracle9i/9204/amd64_db_9204_Disk1.cpio.gz
http://download.oracle.com/otn/linux/oracle9i/9204/amd64_db_9204_Disk2.cpio.gz
http://download.oracle.com/otn/linux/oracle9i/9204/amd64_db_9204_Disk3.cpio.gz
Oracle9i Database Release 2 Enterprise/Standard Edition for AIX &#8211; Based 4.3.3 Systems (64-bit)
http://download.oracle.com/otn/aix/oracle9i/9201/server_9201_AIX64_Disk1.cpio.gz
http://download.oracle.com/otn/aix/oracle9i/9201/server_9201_AIX64_Disk2.cpio.gz
http://download.oracle.com/otn/aix/oracle9i/9201/server_9201_AIX64_Disk3.cpio.gz
http://download.oracle.com/otn/aix/oracle9i/9201/server_9201_AIX64_Disk4.cpio.gz
Oracle9i Database Release 2 Enterprise/Standard Edition [...]]]></description>
			<content:encoded><![CDATA[<p>收录Oracle9iR2软件下载地址，备忘。<br />
下载OTN上的这些软件，你需要一个OTN免费帐号，不过如果通过迅雷进行下载，就不用登陆OTN了：</p>
<p>Oracle9i Database Release 2 Enterprise/Standard/Personal Edition for Windows NT/2000/XP</p>
<p>http://download.oracle.com/otn/nt/oracle9i/9201/92010NT_Disk1.zip</p>
<p>http://download.oracle.com/otn/nt/oracle9i/9201/92010NT_Disk2.zip</p>
<p>http://download.oracle.com/otn/nt/oracle9i/9201/92010NT_Disk3.zip</p>
<p>Oracle9i Database Release 2 Enterprise/Standard/Personal/Client Edition for Windows XP 2003/Windows Server 2003 (64-bit)</p>
<p>http://download.oracle.com/otn/nt/oracle9i/9202/92021Win64_Disk1.zip</p>
<p>http://download.oracle.com/otn/nt/oracle9i/9202/92021Win64_Disk2.zip</p>
<p>Oracle9i Database Release 2 Enterprise/Standard Edition for Intel Linux</p>
<p>http://download.oracle.com/otn/linux/oracle9i/9204/ship_9204_linux_disk1.cpio.gz</p>
<p>http://download.oracle.com/otn/linux/oracle9i/9204/ship_9204_linux_disk2.cpio.gz</p>
<p>http://download.oracle.com/otn/linux/oracle9i/9204/ship_9204_linux_disk3.cpio.gz</p>
<p>Oracle9i Database Release 2 (9.2.0.4) Enterprise/Standard Edition for Linux x86-64</p>
<p>http://download.oracle.com/otn/linux/oracle9i/9204/amd64_db_9204_Disk1.cpio.gz</p>
<p>http://download.oracle.com/otn/linux/oracle9i/9204/amd64_db_9204_Disk2.cpio.gz</p>
<p>http://download.oracle.com/otn/linux/oracle9i/9204/amd64_db_9204_Disk3.cpio.gz</p>
<p>Oracle9i Database Release 2 Enterprise/Standard Edition for AIX &#8211; Based 4.3.3 Systems (64-bit)</p>
<p>http://download.oracle.com/otn/aix/oracle9i/9201/server_9201_AIX64_Disk1.cpio.gz</p>
<p>http://download.oracle.com/otn/aix/oracle9i/9201/server_9201_AIX64_Disk2.cpio.gz</p>
<p>http://download.oracle.com/otn/aix/oracle9i/9201/server_9201_AIX64_Disk3.cpio.gz</p>
<p>http://download.oracle.com/otn/aix/oracle9i/9201/server_9201_AIX64_Disk4.cpio.gz</p>
<p>Oracle9i Database Release 2 Enterprise/Standard Edition for AIX- Based 5L Systems</p>
<p>http://download.oracle.com/otn/aix/oracle9i/9201/A99331-01.zip</p>
<p>http://download.oracle.com/otn/aix/oracle9i/9201/A99331-02.zip</p>
<p>http://download.oracle.com/otn/aix/oracle9i/9201/A99331-03.zip</p>
<p>http://download.oracle.com/otn/aix/oracle9i/9201/A99331-04.zip</p>
<p>Oracle9i Database Release 2 Enterprise/Standard Edition for Sun SPARC Solaris (32-bit)</p>
<p>http://download.oracle.com/otn/solaris/oracle9i/9201/92010Sol_Disk1.cpio.gz</p>
<p>http://download.oracle.com/otn/solaris/oracle9i/9201/92010Sol_Disk2.cpio.gz</p>
<p>http://download.oracle.com/otn/solaris/oracle9i/9201/92010Sol_Disk3.cpio.gz</p>
<p>Oracle9i Database Release 2 Enterprise/Standard Edition for Sun SPARC Solaris (64-bit)</p>
<p>http://download.oracle.com/otn/solaris/oracle9i64/9201/solaris64_9.2.0.1.0.Disk1.cpio.gz</p>
<p>http://download.oracle.com/otn/solaris/oracle9i64/9201/solaris64_9.2.0.1.0.Disk2.cpio.gz</p>
<p>http://download.oracle.com/otn/solaris/oracle9i64/9201/solaris64_9.2.0.1.0.Disk3.cpio.gz</p>
<p>转自http://www.eygle.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronw.cn/static/178.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle 9.2.0.8 及 10.2.0.4 Patch地址</title>
		<link>http://www.aaronw.cn/static/176.html</link>
		<comments>http://www.aaronw.cn/static/176.html#comments</comments>
		<pubDate>Tue, 09 Sep 2008 08:21:46 +0000</pubDate>
		<dc:creator>Aaron.wang</dc:creator>
				<category><![CDATA[DB]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[oracle91]]></category>
		<category><![CDATA[patch]]></category>

		<guid isPermaLink="false">http://www.aaronw.cn/?p=176</guid>
		<description><![CDATA[为了方便，将9.2.0.8 及常用的 10.2.0.4 的补丁下载地址列举在这里，如果没有Metalink帐号，你可以通过迅雷来尝试下载这些Patch.
oracle 9208 patch:
ftp://updates.oracle.com/4547809/p4547809_92080_AIX64-5L.zip     ftp://updates.oracle.com/4547809/p4547809_92080_AXP.zip     ftp://updates.oracle.com/4547809/p4547809_92080_HP64.zip     ftp://updates.oracle.com/4547809/p4547809_92080_HPUX-IA64.zip     ftp://updates.oracle.com/4547809/p4547809_92080_LINUX-S390.zip
ftp://updates.oracle.com/4547809/p4547809_92080_LINUX.zip     ftp://updates.oracle.com/4547809/p4547809_92080_Linux-IA64.zip     ftp://updates.oracle.com/4547809/p4547809_92080_Linux-x86-64.zip
ftp://updates.oracle.com/4547809/p4547809_92080_MVS.zip     ftp://updates.oracle.com/4547809/p4547809_92080_SOLARIS.zip     ftp://updates.oracle.com/4547809/p4547809_92080_SOLARIS64.zip     ftp://updates.oracle.com/4547809/p4547809_92080_TRU64.zip     [...]]]></description>
			<content:encoded><![CDATA[<p>为了方便，将9.2.0.8 及常用的 10.2.0.4 的补丁下载地址列举在这里，如果没有Metalink帐号，你可以通过迅雷来尝试下载这些Patch.<br />
oracle 9208 patch:<br />
ftp://updates.oracle.com/4547809/p4547809_92080_AIX64-5L.zip     ftp://updates.oracle.com/4547809/p4547809_92080_AXP.zip     ftp://updates.oracle.com/4547809/p4547809_92080_HP64.zip     ftp://updates.oracle.com/4547809/p4547809_92080_HPUX-IA64.zip     ftp://updates.oracle.com/4547809/p4547809_92080_LINUX-S390.zip<br />
ftp://updates.oracle.com/4547809/p4547809_92080_LINUX.zip     ftp://updates.oracle.com/4547809/p4547809_92080_Linux-IA64.zip     ftp://updates.oracle.com/4547809/p4547809_92080_Linux-x86-64.zip<br />
ftp://updates.oracle.com/4547809/p4547809_92080_MVS.zip     ftp://updates.oracle.com/4547809/p4547809_92080_SOLARIS.zip     ftp://updates.oracle.com/4547809/p4547809_92080_SOLARIS64.zip     ftp://updates.oracle.com/4547809/p4547809_92080_TRU64.zip     ftp://updates.oracle.com/4547809/p4547809_92080_WINNT.zip     ftp://updates.oracle.com/4547809/p4547809_92080_WINNT64.zip</p>
<p>oracle 10.2.0.4 patch:<br />
ftp://updates.oracle.com/6810189/p6810189_10204_AIX5L.zip     ftp://updates.oracle.com/6810189/p6810189_10204_HPUX-IA64.zip     ftp://updates.oracle.com/6810189/p6810189_10204_HPUX-64.zip     ftp://updates.oracle.com/6810189/p6810189_10204_Solaris-64.zip     ftp://updates.oracle.com/6810189/p6810189_10204_Linux-x86-64.zip<br />
ftp://updates.oracle.com/6810189/p6810189_10204_Linux-x86.zip     ftp://updates.oracle.com/6810189/p6810189_10204_Win32.zip     ftp://updates.oracle.com/6810189/p6810189_10204_MSWIN-x86-64.zip</p>
<p>转自http://www.eygle.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronw.cn/static/176.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>创建表空间、回滚段、用户、表的详细语法信息</title>
		<link>http://www.aaronw.cn/static/28.html</link>
		<comments>http://www.aaronw.cn/static/28.html#comments</comments>
		<pubDate>Fri, 07 Mar 2008 07:23:28 +0000</pubDate>
		<dc:creator>Aaron.wang</dc:creator>
				<category><![CDATA[DB]]></category>

		<guid isPermaLink="false">http://www.aaronw.cn/html/28_%e5%88%9b%e5%bb%ba%e8%a1%a8%e7%a9%ba%e9%97%b4%e3%80%81%e5%9b%9e%e6%bb%9a%e6%ae%b5%e3%80%81%e7%94%a8%e6%88%b7%e3%80%81%e8%a1%a8%e7%9a%84%e8%af%a6%e7%bb%86%e8%af%ad%e6%b3%95%e4%bf%a1%e6%81%af.html</guid>
		<description><![CDATA[创建表空间、回滚段、用户、表的详细语法信息
1:创建表空间
CREATE TABLESPACE ts_name DATAFILE &#8216;/dev/name1&#8242; SIZE 2000M, &#8216;/dev/name2&#8242; SIZE 2000M
DEFAULT STORAGE ( INITIAL 64K NEXT 64K MAXEXTENTS UNLIMITED PCTINCREASE 50 );
2：修改表空间
alter TABLESPACE ts_name add DATAFILE &#8216;/dev/name3&#8242; SIZE 2000M;
3：回滚段
CREATE ROLLBACK SEGMENT &#8220;RS01&#8243; TABLESPACE &#8220;TS_name&#8221;
STORAGE ( INITIAL 8M NEXT 8M MAXEXTENTS UNLIMITED);
4：创建用户和授权
CREATE USER tempuser IDENTIFIED BY tempuser
DEFAULT TABLESPACE TS_name1 TEMPORARY TABLESPACE TS_name2;
GRANT CONNECT TO tempuser;
GRANT DBA TO [...]]]></description>
			<content:encoded><![CDATA[<p>创建表空间、回滚段、用户、表的详细语法信息</p>
<p>1:创建表空间<br />
CREATE TABLESPACE ts_name DATAFILE &#8216;/dev/name1&#8242; SIZE 2000M, &#8216;/dev/name2&#8242; SIZE 2000M<br />
DEFAULT STORAGE ( INITIAL 64K NEXT 64K MAXEXTENTS UNLIMITED PCTINCREASE 50 );</p>
<p>2：修改表空间<br />
alter TABLESPACE ts_name add DATAFILE &#8216;/dev/name3&#8242; SIZE 2000M;</p>
<p>3：回滚段<br />
CREATE ROLLBACK SEGMENT &#8220;RS01&#8243; TABLESPACE &#8220;TS_name&#8221;<br />
STORAGE ( INITIAL 8M NEXT 8M MAXEXTENTS UNLIMITED);</p>
<p>4：创建用户和授权<br />
CREATE USER tempuser IDENTIFIED BY tempuser<br />
DEFAULT TABLESPACE TS_name1 TEMPORARY TABLESPACE TS_name2;<br />
GRANT CONNECT TO tempuser;<br />
GRANT DBA TO tempuser;<br />
GRANT resource TO tempuser;</p>
<p><span id="more-28"></span><br />
5:创建表<br />
create table tablename<br />
(<br />
f1 NUMBER(10) not null,</p>
<p>f2 NUMBER(10) null ,<br />
f3 NUMBER(3) defalut 0,<br />
pt number(3) not null ,<br />
constraint PK_tablename primary key (f1)<br />
using index<br />
tablespace ts_name<br />
storage<br />
(<br />
initial 1m<br />
next 1m<br />
pctincrease 0<br />
)<br />
)<br />
pctfree 10<br />
tablespace ts_name<br />
storage<br />
(<br />
initial 1m<br />
next 1m<br />
pctincrease 0<br />
)<br />
partition by range(pt)<br />
(partition part000 values less than (1) tablespace ts_name,<br />
partition part001 values less than (2) tablespace ts_name,<br />
)<br />
/</p>
<p>6：创建索引<br />
create index i_tablename1 on tablename(f2)<br />
tablespace ts_name<br />
storage<br />
(<br />
initial 500k<br />
next 500k<br />
pctincrease 0<br />
)<br />
/</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronw.cn/static/28.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL*PLUS命令的使用大全</title>
		<link>http://www.aaronw.cn/static/27.html</link>
		<comments>http://www.aaronw.cn/static/27.html#comments</comments>
		<pubDate>Fri, 07 Mar 2008 07:22:26 +0000</pubDate>
		<dc:creator>Aaron.wang</dc:creator>
				<category><![CDATA[DB]]></category>

		<guid isPermaLink="false">http://www.aaronw.cn/html/27_sqlplus%e5%91%bd%e4%bb%a4%e7%9a%84%e4%bd%bf%e7%94%a8%e5%a4%a7%e5%85%a8.html</guid>
		<description><![CDATA[Oracle的sql*plus是与oracle进行交互的客户端工具。在sql*plus中，可以运行sql*plus命令与sql*plus语句。
   我们通常所说的DML、DDL、DCL语句都是sql*plus语句，它们执行完后，都可以保存在一个被称为sql buffer的内存区域中，并且只能保存一条最近执行的sql语句，我们可以对保存在sql buffer中的sql 语句进行修改，然后再次执行，sql*plus一般都与数据库打交道。
   除了sql*plus语句，在sql*plus中执行的其它语句我们称之为sql*plus命令。它们执行完后，不保存在sql buffer的内存区域中，它们一般用来对输出的结果进行格式化显示，以便于制作报表。
   下面就介绍一下一些常用的sql*plus命令：
  
1. 执行一个SQL脚本文件
SQL&#62;start file_name
SQL&#62;@ file_name
我们可以将多条sql语句保存在一个文本文件中，这样当要执行这个文件中的所有的sql语句时，用上面的任一命令即可，这类似于dos中的批处理。
@与@@的区别是什么？
@等于start命令，用来运行一个sql脚本文件。
@命令调用当前目录下的，或指定全路径，或可以通过SQLPATH环境变量搜寻到的脚本文件。该命令使用是一般要指定要执行的文件的全路径，否则从缺省路径(可用SQLPATH变量指定)下读取指定的文件。
@@用在sql脚本文件中，用来说明用@@执行的sql脚本文件与@@所在的文件在同一目录下，而不用指定要执行sql脚本文件的全路径，也不是从SQLPATH环境变量指定的路径中寻找sql脚本文件，该命令一般用在脚本文件中。
如：在c:\temp目录下有文件start.sql和nest_start.sql，start.sql脚本文件的内容为：
@@nest_start.sql     - &#8211; 相当于@ c:\temp\nest_start.sql
则我们在sql*plus中，这样执行：
SQL&#62; @ c:\temp\start.sql

2. 对当前的输入进行编辑
SQL&#62;edit
  
3. 重新运行上一次运行的sql语句
SQL&#62;/
  
4. 将显示的内容输出到指定文件
SQL&#62; SPOOL file_name
   在屏幕上的所有内容都包含在该文件中，包括你输入的sql语句。
  
5. 关闭spool输出
SQL&#62; SPOOL OFF
   只有关闭spool输出，才会在输出文件中看到输出的内容。
  
6．显示一个表的结构
SQL&#62; desc table_name
  
7. COL命令：
主要格式化列的显示形式。
该命令有许多选项，具体如下：
COL[UMN] [{ column&#124;expr} [ option ...]]
Option选项可以是如下的子句:
ALI[AS] alias
CLE[AR]
FOLD_A[FTER]
FOLD_B[EFORE]
FOR[MAT] format
HEA[DING] text
JUS[TIFY] {L[EFT]&#124;C[ENTER]&#124;C[ENTRE]&#124;R[IGHT]}
LIKE { expr&#124;alias}
NEWL[INE]
NEW_V[ALUE] variable
NOPRI[NT]&#124;PRI[NT]
NUL[L] text
OLD_V[ALUE] variable
ON&#124;OFF
WRA[PPED]&#124;WOR[D_WRAPPED]&#124;TRU[NCATED]
  
1). 改变缺省的列标题
COLUMN column_name HEADING column_heading
For example:
Sql&#62;select * from dept;
     DEPTNO DNAME     [...]]]></description>
			<content:encoded><![CDATA[<p>Oracle的sql*plus是与oracle进行交互的客户端工具。在sql*plus中，可以运行sql*plus命令与sql*plus语句。<br />
   我们通常所说的DML、DDL、DCL语句都是sql*plus语句，它们执行完后，都可以保存在一个被称为sql buffer的内存区域中，并且只能保存一条最近执行的sql语句，我们可以对保存在sql buffer中的sql 语句进行修改，然后再次执行，sql*plus一般都与数据库打交道。<br />
   除了sql*plus语句，在sql*plus中执行的其它语句我们称之为sql*plus命令。它们执行完后，不保存在sql buffer的内存区域中，它们一般用来对输出的结果进行格式化显示，以便于制作报表。<br />
   下面就介绍一下一些常用的sql*plus命令：<br />
  <br />
1. 执行一个SQL脚本文件<br />
SQL&gt;start file_name<br />
SQL&gt;@ file_name<br />
我们可以将多条sql语句保存在一个文本文件中，这样当要执行这个文件中的所有的sql语句时，用上面的任一命令即可，这类似于dos中的批处理。</p>
<p>@与@@的区别是什么？<br />
@等于start命令，用来运行一个sql脚本文件。<br />
@命令调用当前目录下的，或指定全路径，或可以通过SQLPATH环境变量搜寻到的脚本文件。该命令使用是一般要指定要执行的文件的全路径，否则从缺省路径(可用SQLPATH变量指定)下读取指定的文件。<br />
@@用在sql脚本文件中，用来说明用@@执行的sql脚本文件与@@所在的文件在同一目录下，而不用指定要执行sql脚本文件的全路径，也不是从SQLPATH环境变量指定的路径中寻找sql脚本文件，该命令一般用在脚本文件中。<br />
如：在c:\temp目录下有文件start.sql和nest_start.sql，start.sql脚本文件的内容为：<br />
@@nest_start.sql     - &#8211; 相当于@ c:\temp\nest_start.sql<br />
则我们在sql*plus中，这样执行：<br />
SQL&gt; @ c:\temp\start.sql</p>
<p><span id="more-27"></span><br />
2. 对当前的输入进行编辑<br />
SQL&gt;edit<br />
  <br />
3. 重新运行上一次运行的sql语句<br />
SQL&gt;/<br />
  <br />
4. 将显示的内容输出到指定文件<br />
SQL&gt; SPOOL file_name<br />
   在屏幕上的所有内容都包含在该文件中，包括你输入的sql语句。<br />
  <br />
5. 关闭spool输出<br />
SQL&gt; SPOOL OFF<br />
   只有关闭spool输出，才会在输出文件中看到输出的内容。<br />
  <br />
6．显示一个表的结构<br />
SQL&gt; desc table_name<br />
  <br />
7. COL命令：<br />
主要格式化列的显示形式。<br />
该命令有许多选项，具体如下：<br />
COL[UMN] [{ column|expr} [ option ...]]<br />
Option选项可以是如下的子句:<br />
ALI[AS] alias<br />
CLE[AR]<br />
FOLD_A[FTER]<br />
FOLD_B[EFORE]<br />
FOR[MAT] format<br />
HEA[DING] text<br />
JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}<br />
LIKE { expr|alias}<br />
NEWL[INE]<br />
NEW_V[ALUE] variable<br />
NOPRI[NT]|PRI[NT]<br />
NUL[L] text<br />
OLD_V[ALUE] variable<br />
ON|OFF<br />
WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED]<br />
  <br />
1). 改变缺省的列标题<br />
COLUMN column_name HEADING column_heading<br />
For example:<br />
Sql&gt;select * from dept;<br />
     DEPTNO DNAME                        LOC<br />
&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;<br />
         10 ACCOUNTING                   NEW YORK<br />
sql&gt;col  LOC heading location<br />
sql&gt;select * from dept;<br />
    DEPTNO DNAME                        location<br />
&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8211;<br />
        10 ACCOUNTING                   NEW YORK<br />
  <br />
2). 将列名ENAME改为新列名EMPLOYEE NAME并将新列名放在两行上：<br />
Sql&gt;select * from emp<br />
Department  name           Salary<br />
&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;-<br />
         10 aaa                11         <br />
SQL&gt; COLUMN ENAME HEADING &#8216;Employee|Name&#8217;<br />
Sql&gt;select * from emp<br />
            Employee<br />
Department  name           Salary<br />
&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;-  <br />
         10 aaa                11<br />
note: the col heading turn into two lines from one line.<br />
  <br />
3). 改变列的显示长度：<br />
FOR[MAT] format<br />
Sql&gt;select empno,ename,job from emp;<br />
      EMPNO ENAME      JOB        <br />
&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;-     &#8212;&#8212;&#8212;<br />
       7369 SMITH      CLERK      <br />
       7499 ALLEN      SALESMAN   <br />
7521 WARD       SALESMAN   <br />
Sql&gt; col ename format a40<br />
      EMPNO ENAME                                    JOB<br />
&#8212;&#8212;&#8212;-   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-         &#8212;&#8212;&#8212;<br />
       7369 SMITH                                    CLERK<br />
       7499 ALLEN                                    SALESMAN<br />
       7521 WARD                                    SALESMAN<br />
  <br />
4). 设置列标题的对齐方式<br />
JUS[TIFY] {L[EFT]|C[ENTER]|C[ENTRE]|R[IGHT]}<br />
SQL&gt; col ename justify center<br />
SQL&gt; /<br />
      EMPNO           ENAME                   JOB<br />
&#8212;&#8212;&#8212;-   &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-       &#8212;&#8212;&#8212;<br />
       7369 SMITH                                    CLERK<br />
       7499 ALLEN                                    SALESMAN<br />
7521 WARD                                     SALESMAN<br />
对于NUMBER型的列，列标题缺省在右边，其它类型的列标题缺省在左边<br />
  <br />
5). 不让一个列显示在屏幕上<br />
NOPRI[NT]|PRI[NT]<br />
SQL&gt; col job noprint<br />
SQL&gt; /<br />
      EMPNO           ENAME<br />
&#8212;&#8212;&#8212;-     &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
       7369 SMITH<br />
       7499 ALLEN<br />
7521 WARD<br />
  <br />
6). 格式化NUMBER类型列的显示：<br />
SQL&gt; COLUMN SAL FORMAT $99,990<br />
SQL&gt; /<br />
Employee<br />
Department Name        Salary    Commission<br />
&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212; &#8212;&#8212;&#8212;-<br />
30          ALLEN        $1,600    300<br />
  <br />
7). 显示列值时，如果列值为NULL值，用text值代替NULL值<br />
COMM NUL[L] text<br />
SQL&gt;COL COMM NUL[L] text<br />
  <br />
8). 设置一个列的回绕方式<br />
WRA[PPED]|WOR[D_WRAPPED]|TRU[NCATED]<br />
        COL1<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
HOW ARE YOU?<br />
  <br />
SQL&gt;COL COL1 FORMAT A5<br />
SQL&gt;COL COL1 WRAPPED<br />
COL1<br />
&#8212;&#8211;<br />
HOW A<br />
RE YO<br />
U?<br />
  <br />
SQL&gt; COL COL1 WORD_WRAPPED<br />
COL1<br />
&#8212;&#8211;<br />
HOW<br />
ARE<br />
YOU?<br />
  <br />
SQL&gt; COL COL1 WORD_WRAPPED<br />
COL1<br />
&#8212;&#8211;<br />
HOW A<br />
  <br />
9). 显示列的当前的显示属性值<br />
SQL&gt; COLUMN column_name<br />
  <br />
10). 将所有列的显示属性设为缺省值<br />
SQL&gt; CLEAR COLUMNS<br />
  <br />
8. 屏蔽掉一个列中显示的相同的值<br />
BREAK ON break_column<br />
SQL&gt; BREAK ON DEPTNO<br />
SQL&gt; SELECT DEPTNO, ENAME, SAL<br />
FROM EMP<br />
  WHERE SAL &lt; 2500<br />
  ORDER BY DEPTNO;<br />
DEPTNO      ENAME         SAL<br />
&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;<br />
10           CLARK        2450<br />
MILLER      1300<br />
20            SMITH       800<br />
ADAMS       1100<br />
  <br />
9. 在上面屏蔽掉一个列中显示的相同的值的显示中，每当列值变化时在值变化之前插入n个空行。<br />
BREAK ON break_column SKIP n<br />
  <br />
SQL&gt; BREAK ON DEPTNO SKIP 1<br />
SQL&gt; /<br />
DEPTNO ENAME SAL<br />
&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;<br />
10 CLARK 2450<br />
MILLER 1300<br />
  <br />
20 SMITH 800<br />
ADAMS 1100<br />
  <br />
10. 显示对BREAK的设置<br />
SQL&gt; BREAK<br />
  <br />
11. 删除6、7的设置<br />
SQL&gt; CLEAR BREAKS<br />
  <br />
12. Set 命令：<br />
该命令包含许多子命令：<br />
SET system_variable value<br />
system_variable value 可以是如下的子句之一：<br />
APPI[NFO]{ON|OFF|text}<br />
ARRAY[SIZE] {15|n}<br />
AUTO[COMMIT]{ON|OFF|IMM[EDIATE]|n}<br />
AUTOP[RINT] {ON|OFF}<br />
AUTORECOVERY [ON|OFF]<br />
AUTOT[RACE] {ON|OFF|TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]<br />
BLO[CKTERMINATOR] {.|c}<br />
CMDS[EP] {;|c|ON|OFF}<br />
COLSEP {_|text}<br />
COM[PATIBILITY]{V7|V8|NATIVE}<br />
CON[CAT] {.|c|ON|OFF}<br />
COPYC[OMMIT] {0|n}<br />
COPYTYPECHECK {ON|OFF}<br />
DEF[INE] {&amp;|c|ON|OFF}<br />
DESCRIBE [DEPTH {1|n|ALL}][LINENUM {ON|OFF}][INDENT {ON|OFF}]<br />
ECHO {ON|OFF}<br />
EDITF[ILE] file_name[.ext]<br />
EMB[EDDED] {ON|OFF}<br />
ESC[APE] {\|c|ON|OFF}<br />
FEED[BACK] {6|n|ON|OFF}<br />
FLAGGER {OFF|ENTRY |INTERMED[IATE]|FULL}<br />
FLU[SH] {ON|OFF}<br />
HEA[DING] {ON|OFF}<br />
HEADS[EP] {||c|ON|OFF}<br />
INSTANCE [instance_path|LOCAL]<br />
LIN[ESIZE] {80|n}<br />
LOBOF[FSET] {n|1}<br />
LOGSOURCE [pathname]<br />
LONG {80|n}<br />
LONGC[HUNKSIZE] {80|n}<br />
MARK[UP] HTML [ON|OFF] [HEAD text] [BODY text] [ENTMAP {ON|OFF}] [SPOOL<br />
{ON|OFF}] [PRE[FORMAT] {ON|OFF}]<br />
NEWP[AGE] {1|n|NONE}<br />
NULL text<br />
NUMF[ORMAT] format<br />
NUM[WIDTH] {10|n}<br />
PAGES[IZE] {24|n}<br />
PAU[SE] {ON|OFF|text}<br />
RECSEP {WR[APPED]|EA[CH]|OFF}<br />
RECSEPCHAR {_|c}<br />
SERVEROUT[PUT] {ON|OFF} [SIZE n] [FOR[MAT] {WRA[PPED]|WOR[D_<br />
WRAPPED]|TRU[NCATED]}]<br />
SHIFT[INOUT] {VIS[IBLE]|INV[ISIBLE]}<br />
SHOW[MODE] {ON|OFF}<br />
SQLBL[ANKLINES] {ON|OFF}<br />
SQLC[ASE] {MIX[ED]|LO[WER]|UP[PER]}<br />
SQLCO[NTINUE] {&gt; |text}<br />
SQLN[UMBER] {ON|OFF}<br />
SQLPRE[FIX] {#|c}<br />
SQLP[ROMPT] {SQL&gt;|text}<br />
SQLT[ERMINATOR] {;|c|ON|OFF}<br />
SUF[FIX] {SQL|text}<br />
TAB {ON|OFF}<br />
TERM[OUT] {ON|OFF}<br />
TI[ME] {ON|OFF}<br />
TIMI[NG] {ON|OFF}<br />
TRIM[OUT] {ON|OFF}<br />
TRIMS[POOL] {ON|OFF}<br />
UND[ERLINE] {-|c|ON|OFF}<br />
VER[IFY] {ON|OFF}<br />
WRA[P] {ON|OFF}<br />
  <br />
1). 设置当前session是否对修改的数据进行自动提交<br />
SQL&gt;SET AUTO[COMMIT] {ON|OFF|IMM[EDIATE]| n}<br />
  <br />
2)．在用start命令执行一个sql脚本时，是否显示脚本中正在执行的SQL语句<br />
SQL&gt; SET ECHO {ON|OFF}<br />
  <br />
3).是否显示当前sql语句查询或修改的行数<br />
SQL&gt; SET FEED[BACK] {6|n|ON|OFF}<br />
   默认只有结果大于6行时才显示结果的行数。如果set feedback 1 ，则不管查询到多少行都返回。当为off 时，一律不显示查询的行数<br />
  <br />
4).是否显示列标题<br />
SQL&gt; SET HEA[DING] {ON|OFF}<br />
当set heading off 时，在每页的上面不显示列标题，而是以空白行代替<br />
  <br />
5).设置一行可以容纳的字符数<br />
SQL&gt; SET LIN[ESIZE] {80|n}<br />
   如果一行的输出内容大于设置的一行可容纳的字符数，则折行显示。<br />
  <br />
6).设置页与页之间的分隔<br />
SQL&gt; SET NEWP[AGE] {1|n|NONE}<br />
当set newpage 0 时，会在每页的开头有一个小的黑方框。<br />
当set newpage n 时，会在页和页之间隔着n个空行。<br />
当set newpage none 时，会在页和页之间没有任何间隔。<br />
  <br />
7).显示时，用text值代替NULL值<br />
SQL&gt; SET NULL text<br />
  <br />
8).设置一页有多少行数<br />
SQL&gt; SET PAGES[IZE] {24|n}<br />
如果设为0，则所有的输出内容为一页并且不显示列标题<br />
  <br />
9).是否显示用DBMS_OUTPUT.PUT_LINE包进行输出的信息。<br />
SQL&gt; SET SERVEROUT[PUT] {ON|OFF}  <br />
在编写存储过程时，我们有时会用dbms_output.put_line将必要的信息输出，以便对存储过程进行调试，只有将serveroutput变量设为on后，信息才能显示在屏幕上。<br />
  <br />
10).当SQL语句的长度大于LINESIZE时，是否在显示时截取SQL语句。<br />
SQL&gt; SET WRA[P] {ON|OFF}<br />
   当输出的行的长度大于设置的行的长度时（用set linesize n命令设置），当set wrap on时，输出行的多于的字符会另起一行显示，否则，会将输出行的多于字符切除，不予显示。<br />
  <br />
11).是否在屏幕上显示输出的内容，主要用与SPOOL结合使用。<br />
SQL&gt; SET TERM[OUT] {ON|OFF}<br />
   在用spool命令将一个大表中的内容输出到一个文件中时，将内容输出在屏幕上会耗费大量的时间，设置set termspool off后，则输出的内容只会保存在输出文件中，不会显示在屏幕上，极大的提高了spool的速度。<br />
  <br />
12).将SPOOL输出中每行后面多余的空格去掉<br />
SQL&gt; SET TRIMS[OUT] {ON|OFF}  <br />
   <br />
13)显示每个sql语句花费的执行时间<br />
set TIMING  {ON|OFF}</p>
<p>14). 遇到空行时不认为语句已经结束，从后续行接着读入。<br />
SET SQLBLANKLINES ON<br />
Sql*plus中, 不允许sql语句中间有空行, 这在从其它地方拷贝脚本到sql*plus中执行时很麻烦. 比如下面的脚本:<br />
select deptno, empno, ename<br />
from emp</p>
<p>where empno = &#8216;7788&#8242;;<br />
如果拷贝到sql*plus中执行, 就会出现错误。这个命令可以解决该问题</p>
<p>15).设置DBMS_OUTPUT的输出<br />
SET SERVEROUTPUT ON BUFFER 20000<br />
用dbms_output.put_line(&#8217;strin_content&#8217;);可以在存储过程中输出信息，对存储过程进行调试<br />
如果想让dbms_output.put_line(&#8216;     abc&#8217;);的输出显示为：<br />
SQL&gt;     abc，而不是SQL&gt;abc，则在SET SERVEROUTPUT ON后加format wrapped参数。</p>
<p>16). 输出的数据为html格式<br />
set markup html<br />
在8.1.7版本(也许是816? 不太确定)以后, sql*plus中有一个set markup html的命令, 可以将sql*plus的输出以html格式展现.<br />
注意其中的spool on, 当在屏幕上输出的时候, 我们看不出与不加spool on有什么区别, 但是当我们使用spool filename 输出到文件的时候, 会看到spool文件中出现了等tag.</p>
<p>14．修改sql buffer中的当前行中，第一个出现的字符串<br />
C[HANGE] /old_value/new_value<br />
SQL&gt; l<br />
   1* select * from dept<br />
SQL&gt; c/dept/emp<br />
   1* select * from emp<br />
  <br />
15．编辑sql buffer中的sql语句<br />
EDI[T]<br />
  <br />
16．显示sql buffer中的sql语句，list n显示sql buffer中的第n行，并使第n行成为当前行<br />
L[IST] [n]<br />
  <br />
17．在sql buffer的当前行下面加一行或多行<br />
I[NPUT]<br />
  <br />
18．将指定的文本加到sql buffer的当前行后面<br />
A[PPEND]<br />
SQL&gt; select deptno,<br />
   2  dname<br />
   3  from dept;<br />
     DEPTNO DNAME<br />
&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;&#8211;<br />
         10 ACCOUNTING<br />
         20 RESEARCH<br />
         30 SALES<br />
         40 OPERATIONS<br />
  <br />
SQL&gt; L 2<br />
   2* dname<br />
SQL&gt; a ,loc<br />
   2* dname,loc<br />
SQL&gt; L<br />
   1  select deptno,<br />
   2  dname,loc<br />
   3* from dept<br />
SQL&gt; /<br />
  <br />
     DEPTNO DNAME          LOC<br />
&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;-<br />
         10 ACCOUNTING     NEW YORK<br />
         20 RESEARCH       DALLAS<br />
         30 SALES          CHICAGO<br />
         40 OPERATIONS     BOSTON<br />
  <br />
19．将sql buffer中的sql语句保存到一个文件中<br />
SAVE file_name<br />
  <br />
20．将一个文件中的sql语句导入到sql buffer中<br />
GET file_name<br />
  <br />
21．再次执行刚才已经执行的sql语句<br />
RUN<br />
or<br />
/<br />
  <br />
22．执行一个存储过程<br />
EXECUTE procedure_name<br />
  <br />
23．在sql*plus中连接到指定的数据库<br />
CONNECT user_name/passwd@db_alias<br />
  <br />
24．设置每个报表的顶部标题<br />
TTITLE<br />
  <br />
25．设置每个报表的尾部标题<br />
BTITLE<br />
  <br />
26．写一个注释<br />
REMARK<br />
  <br />
27．将指定的信息或一个空行输出到屏幕上<br />
PROMPT<br />
  <br />
28．将执行的过程暂停，等待用户响应后继续执行<br />
PAUSE<br />
  <br />
Sql&gt;PAUSE Adjust paper and press RETURN to continue.<br />
  <br />
29．将一个数据库中的一些数据拷贝到另外一个数据库（如将一个表的数据拷贝到另一个数据库）<br />
COPY {FROM database | TO database | FROM database TO database}<br />
{APPEND|CREATE|INSERT|REPLACE} destination_table<br />
[(column, column, column, ...)] USING query<br />
  <br />
sql&gt;COPY FROM SCOTT/TIGER@HQ TO JOHN/CHROME@WEST  <br />
create emp_temp<br />
USING SELECT * FROM EMP<br />
  <br />
30．不退出sql*plus，在sql*plus中执行一个操作系统命令：<br />
HOST<br />
  <br />
Sql&gt; host hostname<br />
该命令在windows下可能被支持。<br />
  <br />
31．在sql*plus中，切换到操作系统命令提示符下，运行操作系统命令后，可以再次切换回sql*plus：<br />
!<br />
  <br />
sql&gt;!<br />
$hostname<br />
$exit<br />
sql&gt;<br />
  <br />
该命令在windows下不被支持。<br />
  <br />
32．显示sql*plus命令的帮助<br />
HELP<br />
如何安装帮助文件：<br />
Sql&gt;@ ?\sqlplus\admin\help\hlpbld.sql ?\sqlplus\admin\help\helpus.sql<br />
Sql&gt;help index<br />
  <br />
33．显示sql*plus系统变量的值或sql*plus环境变量的值<br />
Syntax<br />
SHO[W] option<br />
where option represents one of the following terms or clauses:<br />
system_variable<br />
ALL<br />
BTI[TLE]<br />
ERR[ORS] [{FUNCTION|PROCEDURE|PACKAGE|PACKAGE BODY|<br />
TRIGGER|VIEW|TYPE|TYPE BODY} [schema.]name]<br />
LNO<br />
PARAMETERS [parameter_name]<br />
PNO<br />
REL[EASE]<br />
REPF[OOTER]<br />
REPH[EADER]<br />
SGA<br />
SPOO[L]<br />
SQLCODE<br />
TTI[TLE]<br />
USER<br />
  <br />
1) . 显示当前环境变量的值：<br />
Show all<br />
  <br />
2) . 显示当前在创建函数、存储过程、触发器、包等对象的错误信息<br />
Show error<br />
当创建一个函数、存储过程等出错时，变可以用该命令查看在那个地方出错及相应的出错信息，进行修改后再次进行编译。<br />
  <br />
3) . 显示初始化参数的值：<br />
show PARAMETERS [parameter_name]<br />
  <br />
4) . 显示数据库的版本：<br />
show REL[EASE]<br />
  <br />
5) . 显示SGA的大小<br />
show SGA<br />
  <br />
6). 显示当前的用户名<br />
show user</p>
<p>34.查询一个用户下的对象<br />
SQL&gt;select * from tab;<br />
SQL&gt;select * from user_objects;</p>
<p>35.查询一个用户下的所有的表<br />
SQL&gt;select * from user_tables;</p>
<p>36.查询一个用户下的所有的索引<br />
SQL&gt;select * from user_indexes;</p>
<p>37. 定义一个用户变量<br />
方法有两个：<br />
a. define<br />
b. COL[UMN] [{column|expr} NEW_V[ALUE] variable [NOPRI[NT]|PRI[NT]]<br />
                            OLD_V[ALUE] variable  [NOPRI[NT]|PRI[NT]]</p>
<p>下面对每种方式给予解释：<br />
a. Syntax<br />
DEF[INE] [variable]|[variable = text]<br />
定义一个用户变量并且可以分配给它一个CHAR值。</p>
<p>assign the value MANAGER to the variable POS, type:<br />
SQL&gt; DEFINE POS = MANAGER</p>
<p>assign the CHAR value 20 to the variable DEPTNO, type:<br />
SQL&gt; DEFINE DEPTNO = 20</p>
<p>list the definition of DEPTNO, enter<br />
SQL&gt; DEFINE DEPTNO<br />
        ―――――――――――――――<br />
DEFINE DEPTNO = &#8220;20&#8243; (CHAR)</p>
<p>定义了用户变量POS后，就可以在sql*plus中用&amp;POS或&amp;&amp;POS来引用该变量的值，sql*plus不会再提示你给变量输入值。</p>
<p>b. COL[UMN] [{column|expr} NEW_V[ALUE] variable [NOPRI[NT]|PRI[NT]]<br />
NEW_V[ALUE] variable<br />
指定一个变量容纳查询出的列值。<br />
例:column col_name new_value var_name noprint<br />
   select col_name from table_name where ……..<br />
将下面查询出的col_name列的值赋给var_name变量.</p>
<p>一个综合的例子:<br />
得到一个列值的两次查询之差(此例为10秒之内共提交了多少事务):<br />
column redo_writes new_value commit_count</p>
<p>select sum(stat.value) redo_writes<br />
from v$sesstat stat, v$statname sn<br />
where stat.statistic# = sn.statistic#<br />
and <a href="http://sn.name/"><font color="#4389cf">sn.name</font></a> = &#8216;user commits&#8217;;</p>
<p>&#8211; 等待一会儿(此处为10秒);<br />
execute dbms_lock.sleep(10);</p>
<p>set veri off<br />
select sum(stat.value) &#8211; &amp;commit_count commits_added<br />
from v$sesstat stat, v$statname sn<br />
where stat.statistic# = sn.statistic#<br />
and <a href="http://sn.name/"><font color="#4389cf">sn.name</font></a> = &#8216;user commits&#8217;;</p>
<p>38. 定义一个绑定变量<br />
VAR[IABLE] [variable [NUMBER|CHAR|CHAR (n)|NCHAR|NCHAR (n) |VARCHAR2 (n)|NVARCHAR2 (n)|CLOB|NCLOB|REFCURSOR]]<br />
定义一个绑定变量，该变量可以在pl/sql中引用。<br />
可以用print命令显示该绑定变量的信息。<br />
如：<br />
column inst_num  heading &#8220;Inst Num&#8221;  new_value inst_num  format 99999;<br />
column inst_name heading &#8220;Instance&#8221;  new_value inst_name format a12;<br />
column db_name   heading &#8220;DB Name&#8221;   new_value db_name   format a12;<br />
column dbid      heading &#8220;DB Id&#8221;     new_value dbid      format 9999999999 just c;</p>
<p>prompt<br />
prompt Current Instance<br />
prompt ~~~~~~~~~~~~~~~~</p>
<p>select d.dbid            dbid<br />
     , <a href="http://d.name/"><font color="#4389cf">d.name</font></a>            db_name<br />
     , i.instance_number inst_num<br />
     , i.instance_name   inst_name<br />
  from v$database d,<br />
       v$instance i;</p>
<p>variable dbid       number;<br />
variable inst_num   number;<br />
begin<br />
  :dbid      :=  &amp;dbid;<br />
  :inst_num  :=  &amp;inst_num;<br />
end;<br />
/<br />
说明：<br />
在sql*plus中，该绑定变量可以作为一个存储过程的参数，也可以在匿名PL/SQL块中直接引用。为了显示用VARIABLE命令创建的绑定变量的值，可以用print命令</p>
<p>注意：<br />
绑定变量不同于变量：<br />
1．        定义方法不同<br />
2．        引用方法不同<br />
绑定变量：:variable_name<br />
        变量：&amp;variable_name or &amp;&amp;variable_name<br />
3.在sql*plus中，可以定义同名的绑定变量与用户变量，但是引用的方法不同。</p>
<p>39. &amp;与&amp;&amp;的区别<br />
&amp;用来创建一个临时变量，每当遇到这个临时变量时，都会提示你输入一个值。<br />
&amp;&amp;用来创建一个持久变量，就像用用define命令或带new_vlaue字句的column命令创建的持久变量一样。当用&amp;&amp;命令引用这个变量时，不会每次遇到该变量就提示用户键入值，而只是在第一次遇到时提示一次。</p>
<p>如，将下面三行语句存为一个脚本文件，运行该脚本文件，会提示三次，让输入deptnoval的值：<br />
select count(*) from emp where deptno = &amp;deptnoval;<br />
select count(*) from emp where deptno = &amp;deptnoval;<br />
select count(*) from emp where deptno = &amp;deptnoval;</p>
<p>将下面三行语句存为一个脚本文件，运行该脚本文件，则只会提示一次，让输入deptnoval的值：<br />
select count(*) from emp where deptno = &amp;&amp;deptnoval;<br />
select count(*) from emp where deptno = &amp;&amp;deptnoval;<br />
select count(*) from emp where deptno = &amp;&amp;deptnoval;</p>
<p>40．在输入sql语句的过程中临时先运行一个sql*plus命令( <a href="http://%e6%91%98%e8%87%aawww.itpub.com/"><font color="#4389cf">摘自www.itpub.com</font></a>)<br />
#<br />
有没有过这样的经历? 在sql*plus中敲了很长的命令后, 突然发现想不起某个列的名字了, 如果取消当前的命令,待查询后再重敲, 那太痛苦了. 当然你可以另开一个sql*plus窗口进行查询, 但这里提供的方法更简单.</p>
<p>比如说, 你想查工资大于4000的员工的信息, 输入了下面的语句:</p>
<p>SQL&gt; select deptno, empno, ename<br />
2 from emp<br />
3 where<br />
这时, 你发现你想不起来工资的列名是什么了.</p>
<p>这种情况下, 只要在下一行以#开头, 就可以执行一条sql*plus命令, 执行完后, 刚才的语句可以继续输入</p>
<p>SQL&gt;&gt; select deptno, empno, ename<br />
2 from emp<br />
3 where<br />
6 #desc emp<br />
Name Null? Type<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; &#8212;&#8212;&#8211; &#8212;&#8212;&#8212;&#8212;&#8211;<br />
EMPNO NOT NULL NUMBER(4)<br />
ENAME VARCHAR2(10)<br />
JOB VARCHAR2(9)<br />
MGR NUMBER(4)<br />
HIREDATE DATE<br />
SAL NUMBER(7,2)<br />
COMM NUMBER(7,2)<br />
DEPTNO NUMBER(2)</p>
<p>6 sal &gt; 4000;</p>
<p>DEPTNO EMPNO ENAME<br />
&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;-<br />
10 7839 KING</p>
<p>41. SQLPlus中的快速复制和粘贴技巧(<a href="http://%e6%91%98%e8%87%aawww.cnoug.org/"><font color="#4389cf">摘自www.cnoug.org </font></a>)<br />
1) 鼠标移至想要复制内容的开始<br />
2) 用右手食指按下鼠标左键<br />
3) 向想要复制内容的另一角拖动鼠标，与Word中选取内容的方法一样<br />
4) 内容选取完毕后（所选内容全部反显），鼠标左键按住不动，用右手中指按鼠标右键<br />
5) 这时，所选内容会自动复制到SQL*Plus环境的最后一行</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronw.cn/static/27.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>oracle10g 新特性之自动存储管理</title>
		<link>http://www.aaronw.cn/static/26.html</link>
		<comments>http://www.aaronw.cn/static/26.html#comments</comments>
		<pubDate>Fri, 07 Mar 2008 07:21:07 +0000</pubDate>
		<dc:creator>Aaron.wang</dc:creator>
				<category><![CDATA[DB]]></category>

		<guid isPermaLink="false">http://www.aaronw.cn/html/26_oracle10g-%e6%96%b0%e7%89%b9%e6%80%a7%e4%b9%8b%e8%87%aa%e5%8a%a8%e5%ad%98%e5%82%a8%e7%ae%a1%e7%90%86.html</guid>
		<description><![CDATA[自动存储管理  
  
数据库管理员终于可以将自己从单调而常用的增加、移动和删除存储磁盘的任务中解脱出来了 — 并且无需增加额外的成本。  
  
假设您刚得到一个新的 Oracle 数据库的全新的服务器和存储子系统。除操作系统配置之外，在您能够创建数据库之前，最重要的工作是什么？很明显，就是创建存储系统布局 — 或更具体地说，选择一种保护级别，然后构建必需的冗余磁盘阵列 (RAID) 组。  
  
在大多数数据库安装中安装存储器要花费大量的时间。从多种可能中选择一种特定的磁盘配置需要仔细的规划和分析，并且最重要的是，需要详细了解存储技术、卷管理器和文件系统。在这个阶段的设计任务可以大致说明如下（注意这个列表只是代表性的，任务将随配置而变化）：  
  
确认存储器在操作系统级通过了认证，并确定冗余保护的级别，该级别可能已经提供（硬件 RAID）。  
集中和构建逻辑卷组，并确定分段或镜像是否也是必需的。  
在逻辑卷管理器创建的逻辑卷上构建文件系统。  
设定所有权和权限，以便 Oracle 进程可以对设备进行打开、读和写操作。  
在文件系统上创建数据库，如果可能的话务必在非 RAID 的位置上创建特殊文件，例如重做日志、临时表空间和重做表空间之类的特殊文件。  
在大多数公司中，这些步骤大部分是由对存储系统非常了解的某些人来执行的。这里的&#8221;某些人&#8221;通常不是数据库管理员。  
  
不过，请注意所有这些任务 — 分段、镜像、逻辑文件系统构建 — 的执行都只支持一种类型的服务器，Oracle 数据库。因此，Oracle 自己提供一些技巧来简化或改进这个过程不是很有意义吗？  
  
Oracle Database 10g 正是这么做的。一个新的和激动人心的特性 — 自动存储管理 (ASM) — 使 DBA 能够完全在 Oracle 框架内执行上述的许多任务。利用 ASM，您可以仅利用 Oracle Database 10g 软件自带的功能（无需额外的成本）来将一组磁盘转换成一个高可伸缩的（重点是在&#8221;可伸缩&#8221;上）和高性能的文件系统/卷管理器。并且您不需要是一个磁盘、卷管理器或文件系统管理方面的专家。  
  
在本部分中，您将了解到关于 ASM 大量的基础知识，以开始在实际的应用程序中使用它。正如您的猜测，这个强大的特性无疑将引发全面的讨论，篇幅所限，我们不能在此作过多介绍，如果您想了解更多的内容，在结论部分列出了一些极好的信息来源。  
  
ASM 是什么？  
  
假设您要在数据库中使用 10 个磁盘。利用 ASM，您不需要在 OS 端创建任何东西，该特性将把一组物理磁盘集合成一个逻辑实体（称为磁盘组）。磁盘组类似于一个分段（和可选镜像）文件系统，但具有重要的差异：它不是一个用于存储用户文件的通用文件系统，并且它不进行缓冲。由于后面的原因，磁盘组提供了直接作为原始设备来访问这个空间，并仍提供文件系统的便利性和灵活性的好处。  
  
逻辑卷管理器一般使用一个函数（如散列函数）来将块的逻辑地址映射到物理块。计算使用 CPU 周期。此外，当增加一个新的磁盘（或 RAID-5 磁盘组）时，这种典型的分段函数需要重新定位整个数据集中的每一位。  
  
相比而言，ASM 使用一个特殊的 Oracle 例程来解决从文件区到物理磁盘块的映射问题。这种设计除了定位文件区非常快速之外，还在增加或删除磁盘时有所帮助，因为文件区的位置不需要调整。这个特殊的 ASM 例程类似于其它的文件系统，必须运行此例程，ASM 才能工作，并且用户不能进行修改。一个 [...]]]></description>
			<content:encoded><![CDATA[<p>自动存储管理  <br />
  <br />
数据库管理员终于可以将自己从单调而常用的增加、移动和删除存储磁盘的任务中解脱出来了 — 并且无需增加额外的成本。  <br />
  <br />
假设您刚得到一个新的 Oracle 数据库的全新的服务器和存储子系统。除操作系统配置之外，在您能够创建数据库之前，最重要的工作是什么？很明显，就是创建存储系统布局 — 或更具体地说，选择一种保护级别，然后构建必需的冗余磁盘阵列 (RAID) 组。  <br />
  <br />
在大多数数据库安装中安装存储器要花费大量的时间。从多种可能中选择一种特定的磁盘配置需要仔细的规划和分析，并且最重要的是，需要详细了解存储技术、卷管理器和文件系统。在这个阶段的设计任务可以大致说明如下（注意这个列表只是代表性的，任务将随配置而变化）：  <br />
  <br />
确认存储器在操作系统级通过了认证，并确定冗余保护的级别，该级别可能已经提供（硬件 RAID）。  <br />
集中和构建逻辑卷组，并确定分段或镜像是否也是必需的。  <br />
在逻辑卷管理器创建的逻辑卷上构建文件系统。  <br />
设定所有权和权限，以便 Oracle 进程可以对设备进行打开、读和写操作。  <br />
在文件系统上创建数据库，如果可能的话务必在非 RAID 的位置上创建特殊文件，例如重做日志、临时表空间和重做表空间之类的特殊文件。  <br />
在大多数公司中，这些步骤大部分是由对存储系统非常了解的某些人来执行的。这里的&#8221;某些人&#8221;通常不是数据库管理员。  <br />
  <span id="more-26"></span><br />
不过，请注意所有这些任务 — 分段、镜像、逻辑文件系统构建 — 的执行都只支持一种类型的服务器，Oracle 数据库。因此，Oracle 自己提供一些技巧来简化或改进这个过程不是很有意义吗？  <br />
  <br />
Oracle Database 10g 正是这么做的。一个新的和激动人心的特性 — 自动存储管理 (ASM) — 使 DBA 能够完全在 Oracle 框架内执行上述的许多任务。利用 ASM，您可以仅利用 Oracle Database 10g 软件自带的功能（无需额外的成本）来将一组磁盘转换成一个高可伸缩的（重点是在&#8221;可伸缩&#8221;上）和高性能的文件系统/卷管理器。并且您不需要是一个磁盘、卷管理器或文件系统管理方面的专家。  <br />
  <br />
在本部分中，您将了解到关于 ASM 大量的基础知识，以开始在实际的应用程序中使用它。正如您的猜测，这个强大的特性无疑将引发全面的讨论，篇幅所限，我们不能在此作过多介绍，如果您想了解更多的内容，在结论部分列出了一些极好的信息来源。  <br />
  <br />
ASM 是什么？  <br />
  <br />
假设您要在数据库中使用 10 个磁盘。利用 ASM，您不需要在 OS 端创建任何东西，该特性将把一组物理磁盘集合成一个逻辑实体（称为磁盘组）。磁盘组类似于一个分段（和可选镜像）文件系统，但具有重要的差异：它不是一个用于存储用户文件的通用文件系统，并且它不进行缓冲。由于后面的原因，磁盘组提供了直接作为原始设备来访问这个空间，并仍提供文件系统的便利性和灵活性的好处。  <br />
  <br />
逻辑卷管理器一般使用一个函数（如散列函数）来将块的逻辑地址映射到物理块。计算使用 CPU 周期。此外，当增加一个新的磁盘（或 RAID-5 磁盘组）时，这种典型的分段函数需要重新定位整个数据集中的每一位。  <br />
  <br />
相比而言，ASM 使用一个特殊的 Oracle 例程来解决从文件区到物理磁盘块的映射问题。这种设计除了定位文件区非常快速之外，还在增加或删除磁盘时有所帮助，因为文件区的位置不需要调整。这个特殊的 ASM 例程类似于其它的文件系统，必须运行此例程，ASM 才能工作，并且用户不能进行修改。一个 ASM 例程可以在同一台服务器上支持许多 Oracle 数据库例程。  <br />
  <br />
这个特殊的例程只是一个例程，不是用户可以在其中创建对象的数据库。所有关于磁盘的元数据都存储在磁盘组本身中，使得它们能够尽可能地自我描述。  <br />
  <br />
那么概括地说，ASM 的优点是什么？  <br />
磁盘增加 — 增加磁盘变得非常容易。无需停机时间，并且文件区域自动重新分配。  <br />
I/O 分配 — I/O 自动分布在所有可用的磁盘上，无需人工干预，从而减少了热点出现的可能性。  <br />
带区宽度 — 在重做日志文件中分段可以细分（128K，以获得更快的传输速率），对于数据文件，带区则略大一些（1MB，以一次性传输大量的数据块）。  <br />
缓冲 — ASM 文件系统不进行缓冲，直接进行输入/输出。  <br />
核心化的异步 I/O — 实现核心化的异步 I/O 无需特殊的设置，并且无需使用原始或第三方的文件系统（如 Veritas Quick I/O）。  <br />
镜像 — 如果硬件镜像不可用，则可以容易地建立软件镜像。  <br />
逐步创建一个基于 ASM 的数据库  <br />
  <br />
下面是如何创建一个基于 ASM 的数据库的具体的示例：  <br />
  <br />
1. 创建一个 ASM 例程  <br />
  <br />
通过指定下列初始化参数，您可以利用数据库创建助手来创建一个 ASM 例程：  <br />
  <br />
INSTANCE_TYPE = ASM<br />
  <br />
当服务器启动时，您应当启动该例程，而当服务器关闭时，应当最后关闭该例程。  <br />
  <br />
这个参数的默认值是 RDBMS，适用于常见的数据库。  <br />
  <br />
2. 创建磁盘组  <br />
  <br />
在启动 ASM 例程后，利用可用的磁盘创建一个磁盘组。  <br />
  <br />
CREATE DISKGROUP dskgrp1<br />
EXTERNAL REDUNDANCY<br />
DISK<br />
&#8216;/dev/d1&#8242;,<br />
&#8216;/dev/d2&#8242;,<br />
&#8216;/dev/d3&#8242;,<br />
&#8216;/dev/d4&#8242;,<br />
&#8230; and so on for all the specific disks &#8230;<br />
;<br />
  <br />
在上述命令中，我们使数据库利用名称为 /dev/d1、/dev/d2 等的磁盘创建了一个名称为 dksgrp1 的磁盘组。您还可以在 DISK 子句中用通配符指定磁盘名称，而不是分别给定磁盘。  <br />
  <br />
DISK &#8216;/dev/d*&#8217;<br />
  <br />
在上述命令中，我们指定了一个子句 EXTERNAL REDUNDANCY，它指示一个磁盘出现故障将使磁盘组停止工作。这通常是由硬件提供冗余（如镜像）的情况。如果没有基于硬件的冗余，则可以设置 ASM 来在磁盘组中创建一组特殊的磁盘（称为 failgroup），以提供这种冗余。  <br />
  <br />
CREATE DISKGROUP dskgrp1<br />
NORMAL REDUNDANCY<br />
FAILGROUP failgrp1 DISK<br />
&#8216;/dev/d1&#8242;,<br />
&#8216;/dev/d2&#8242;,<br />
FAILGROUP failgrp2 DISK<br />
&#8216;/dev/d3&#8242;,<br />
&#8216;/dev/d4&#8242;;<br />
  <br />
d3 和 d4 不是 d1 和 d2 的镜像，虽然看起来似乎是那样。相反，ASM 使用所有的磁盘来创建一个容错系统。例如，可能利用在 d4 上保留的一个备份来在 d1 中创建磁盘组上的一个文件。另一个文件可以利用 d2 上的备份在 d3 上创建。一个特定的磁盘出现故障，则允许使用另一个磁盘上的备份，以使操作可以继续。例如，您可能丢失了磁盘 d1 和 d2 的控制器，ASM 将为全部故障磁盘组的区块的拷贝建立镜像，以保持数据完整性。  <br />
  <br />
3. 创建表空间  <br />
  <br />
现在利用基于 ASM 的存储器中的一个数据文件来在主数据库中创建一个表空间。  <br />
  <br />
CREATE TABLESPACE USER_DATA DATAFILE &#8216;+dskgrp1/user_data_01&#8242;  <br />
SIZE 1024M<br />
/<br />
  <br />
就这样！创建过程完成了。  <br />
  <br />
注意磁盘组是如何作为一个虚拟文件系统使用的。这种方法不仅在数据文件中有用，在其它类型的 Oracle 文件中也有用。例如，您可以按以下方式创建在线重做日志文件  <br />
  <br />
LOGFILE GROUP 1 (<br />
&#8216;+dskgrp1/redo/group_1.258.3&#8242;,<br />
&#8216;+dskgrp2/redo/group_1.258.3&#8242;<br />
) SIZE 50M,<br />
&#8230;<br />
  <br />
更多的资源  <br />
正如之前所提到的，本文的目的不是为了提供关于 AMS 特性的所有知识，使您变成一个专家，原因很简单，相关的信息量太大了。不过，别失望，在 Oracle 技术网上提供了许多的帮助：  <br />
  <br />
&#8220;自动存储&#8221;（作者：Lannes Morris-Murphy）是关于 ASM 的一篇极好的介绍性文章。  <br />
  <br />
ASMLib — 为 Linux 提供的一个 ASM 特性的资料库 — 扩展了 ASM 功能。本页面还链接了技术参考文献和资料库模块的源代码。  <br />
  <br />
Oracle 数据库管理员指南 10g Release 1 (10.1) 的第 12 章完整说明了 ASM 背后的概念。  <br />
   <br />
甚至存档日志目标也可以设为一个磁盘组。与 Oracle 数据库相关的全部内容都可以在一个基于 ASM 的磁盘组中创建。例如，备份是 ASM 的另一大用途。您可以设置一组廉价的磁盘来创建一个数据库的恢复区，RMAN 可以使用这个恢复区来创建备份数据库文件和存档日志文件。（在下一个关于 Oracle Database 10g 中的 RMAN 的部分中，您将详细了解如何使用这种功能来为您带来好处。）  <br />
  <br />
请记住，无论 ASM 如何支持仅由 Oracle 数据库创建和读取的文件；它也不能替代一个通用的文件系统，并且不能存储二进制文件和纯文本文件。  <br />
  <br />
维护  <br />
  <br />
让我们看看维护磁盘组所需的一些典型任务。您可能必须经常在磁盘组 dskgrp1 中增加额外的磁盘来适应不断增长的需求。可以执行下面的语句：  <br />
  <br />
alter diskgroup dskgrp1 add disk &#8216;/dev/d5&#8242;;<br />
  <br />
要查明哪个磁盘在哪个磁盘组中，可以执行下面的语句：  <br />
  <br />
select * from v$asm_disk;<br />
  <br />
该命令显示了 ASM 例程为所有客户机数据库管理的所有磁盘。在这些磁盘中，您可能决定利用以下命令来删除一个磁盘：  <br />
  <br />
alter diskgroup dskgrp1 drop disk diskb23;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronw.cn/static/26.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle优化经典文章&#8212;&#8212;索引原理篇</title>
		<link>http://www.aaronw.cn/static/25.html</link>
		<comments>http://www.aaronw.cn/static/25.html#comments</comments>
		<pubDate>Fri, 07 Mar 2008 07:19:22 +0000</pubDate>
		<dc:creator>Aaron.wang</dc:creator>
				<category><![CDATA[DB]]></category>

		<guid isPermaLink="false">http://www.aaronw.cn/html/25_oracle%e4%bc%98%e5%8c%96%e7%bb%8f%e5%85%b8%e6%96%87%e7%ab%a0-%e7%b4%a2%e5%bc%95%e5%8e%9f%e7%90%86%e7%af%87.html</guid>
		<description><![CDATA[Oracle提供了大量索引选项。知道在给定条件下使用哪个选项对于一个应用程序的性能来说非常重要。一个错误的选择可能会引发死锁，并导致数据库性能急剧下降或进程终止。而如果做出正确的选择，则可以合理使用资源，使那些已经运行了几个小时甚至几天的进程在几分钟得以完成，这样会使您立刻成为一位英雄。这篇文章就将简单的讨论每个索引选项。主要有以下内容：
[1] 基本的索引概念
    查询DBA_INDEXES视图可得到表中所有索引的列表，注意只能通过USER_INDEXES的方法来检索模式(schema)的索引。访问USER_IND_COLUMNS视图可得到一个给定表中被索引的特定列。
[2] 组合索引
    当某个索引包含有多个已索引的列时，称这个索引为组合（concatented）索引。在 Oracle9i引入跳跃式扫描的索引访问方法之前，查询只能在有限条件下使用该索引。比如：表emp有一个组合索引键，该索引包含了empno、 ename和deptno。在Oracle9i之前除非在where之句中对第一列（empno）指定一个值，否则就不能使用这个索引键进行一次范围扫描。
    特别注意：在Oracle9i之前，只有在使用到索引的前导索引时才可以使用组合索引！
[3] ORACLE ROWID
    通过每个行的ROWID，索引Oracle提供了访问单行数据的能力。ROWID其实就是直接指向单独行的线路图。如果想检查重复值或是其他对ROWID本身的引用，可以在任何表中使用和指定rowid列。   

[4] 限制索引
    限制索引是一些没有经验的开发人员经常犯的错误之一。在SQL中有很多陷阱会使一些索引无法使用。下面讨论一些常见的问题：
   
    4.1 使用不等于操作符（&#60;&#62;、!=）
        下面的查询即使在cust_rating列有一个索引，查询语句仍然执行一次全表扫描。
         select cust_Id,cust_name
         from   customers
         where  cust_rating &#60;&#62; &#8216;aa&#8217;;
         把上面的语句改成如下的查询语句，这样，在采用基于规则的优化器而不是基于代价的优化器（更智能）时，将会使用索引。
         select cust_Id,cust_name
         from   customers
         where  cust_rating &#60; &#8216;aa&#8217; or [...]]]></description>
			<content:encoded><![CDATA[<p>Oracle提供了大量索引选项。知道在给定条件下使用哪个选项对于一个应用程序的性能来说非常重要。一个错误的选择可能会引发死锁，并导致数据库性能急剧下降或进程终止。而如果做出正确的选择，则可以合理使用资源，使那些已经运行了几个小时甚至几天的进程在几分钟得以完成，这样会使您立刻成为一位英雄。这篇文章就将简单的讨论每个索引选项。主要有以下内容：</p>
<p>[1] 基本的索引概念<br />
    查询DBA_INDEXES视图可得到表中所有索引的列表，注意只能通过USER_INDEXES的方法来检索模式(schema)的索引。访问USER_IND_COLUMNS视图可得到一个给定表中被索引的特定列。</p>
<p>[2] 组合索引<br />
    当某个索引包含有多个已索引的列时，称这个索引为组合（concatented）索引。在 Oracle9i引入跳跃式扫描的索引访问方法之前，查询只能在有限条件下使用该索引。比如：表emp有一个组合索引键，该索引包含了empno、 ename和deptno。在Oracle9i之前除非在where之句中对第一列（empno）指定一个值，否则就不能使用这个索引键进行一次范围扫描。<br />
    特别注意：在Oracle9i之前，只有在使用到索引的前导索引时才可以使用组合索引！</p>
<p>[3] ORACLE ROWID<br />
    通过每个行的ROWID，索引Oracle提供了访问单行数据的能力。ROWID其实就是直接指向单独行的线路图。如果想检查重复值或是其他对ROWID本身的引用，可以在任何表中使用和指定rowid列。   <br />
<span id="more-25"></span><br />
[4] 限制索引<br />
    限制索引是一些没有经验的开发人员经常犯的错误之一。在SQL中有很多陷阱会使一些索引无法使用。下面讨论一些常见的问题：<br />
   <br />
    4.1 使用不等于操作符（&lt;&gt;、!=）<br />
        下面的查询即使在cust_rating列有一个索引，查询语句仍然执行一次全表扫描。<br />
         select cust_Id,cust_name<br />
         from   customers<br />
         where  cust_rating &lt;&gt; &#8216;aa&#8217;;<br />
         把上面的语句改成如下的查询语句，这样，在采用基于规则的优化器而不是基于代价的优化器（更智能）时，将会使用索引。<br />
         select cust_Id,cust_name<br />
         from   customers<br />
         where  cust_rating &lt; &#8216;aa&#8217; or cust_rating &gt; &#8216;aa&#8217;;<br />
     特别注意：通过把不等于操作符改成OR条件，就可以使用索引，以避免全表扫描。<br />
     <br />
     4.2 使用IS NULL 或IS NOT NULL<br />
         使用IS NULL 或IS NOT NULL同样会限制索引的使用。因为NULL值并没有被定义。在SQL语句中使用NULL会有很多的麻烦。因此建议开     发人员在建表时，把需要索引的列设成NOT NULL。如果被索引的列在某些行中存在NULL值，就不会使用这个索引（除非索引是一个位图索     引，关于位图索引在稍后在详细讨论）。</p>
<p>     4.3 使用函数<br />
         如果不使用基于函数的索引，那么在SQL语句的WHERE子句中对存在索引的列使用函数时，会使优化器忽略掉这些索引。<br />
         下面的查询不会使用索引（只要它不是基于函数的索引）<br />
          select empno,ename,deptno<br />
          from   emp<br />
          where  trunc(hiredate)=&#8217;01-MAY-81&#8242;;<br />
          把上面的语句改成下面的语句，这样就可以通过索引进行查找。<br />
          select empno,ename,deptno<br />
          from   emp<br />
          where  hiredate&lt;(to_date(&#8216;01-MAY-81&#8242;)+0.9999);</p>
<p>     4.4 比较不匹配的数据类型<br />
         比较不匹配的数据类型也是比较难于发现的性能问题之一。<br />
         注意下面查询的例子，account_number是一个VARCHAR2类型，在account_number字段上有索引。下面的语句将执行全表扫描。<br />
         select bank_name,address,city,state,zip<br />
         from   banks<br />
         where  account_number = 990354;<br />
         Oracle可以自动把where子句变成to_number(account_number)=990354，这样就限制了索引的使用,改成下面的查询就可以使用索引：<br />
         select bank_name,address,city,state,zip<br />
         from   banks<br />
         where  account_number =&#8217;990354&#8242;;<br />
     特别注意：不匹配的数据类型之间比较会让Oracle自动限制索引的使用，即便对这个查询执行Explain Plan也不能让您明白为什么做了一               次“全表扫描”。</p>
<p>[5] 选择性<br />
    使用USER_INDEXES视图，该视图中显示了一个distinct_keys列。比较一下唯一键的数量和表中的行数，就可以判断索引的选择性。选择性越高，索引返回的数据就越少。</p>
<p>[6] 群集因子(Clustering Factor)<br />
    Clustering Factor位于USER_INDEXES视图中。该列反映了数据相对于已索引的列是否显得有序。如果Clustering Factor列的值接近于索引中的树叶块(leaf block)的数目，表中的数据就越有序。如果它的值接近于表中的行数，则表中的数据就不是很有序。<br />
   </p>
<p>[7] 二元高度(Binary height)<br />
    索引的二元高度对把ROWID返回给用户进程时所要求的I/O量起到关键作用。在对一个索引进行分析后，可以通过查询DBA_INDEXES的B- level列查看它的二元高度。二元高度主要随着表的大小以及被索引的列中值的范围的狭窄程度而变化。索引上如果有大量被删除的行，它的二元高度也会增加。更新索引列也类似于删除操作，因为它增加了已删除键的数目。重建索引可能会降低二元高度。</p>
<p>[8] 快速全局扫描<br />
    在Oracle7.3后就可以使用快速全局扫描(Fast Full Scan)这个选项。这个选项允许Oracle执行一个全局索引扫描操作。快速全局扫描读取B-树索引上所有树叶块。初始化文件中的 DB_FILE_MULTIBLOCK_READ_COUNT参数可以控制同时被读取的块的数目。</p>
<p>[9] 跳跃式扫描<br />
    从Oracle9i开始，索引跳跃式扫描特性可以允许优化器使用组合索引，即便索引的前导列没有出现在WHERE子句中。索引跳跃式扫描比全索引扫描要快的多。下面的程序清单显示出性能的差别：<br />
    create index skip1 on emp5(job,empno);<br />
    index created.</p>
<p>    select count(*)<br />
    from emp5<br />
    where empno=7900;</p>
<p>    Elapsed:00:00:03.13</p>
<p>    Execution Plan<br />
    0     SELECT STATEMENT Optimizer=CHOOSE(Cost=4 Card=1 Bytes=5)<br />
    1  0    SORT(AGGREGATE)<br />
    2  1      INDEX(FAST FULL SCAN) OF &#8216;SKIP1&#8242;(NON-UNIQUE)</p>
<p>    Statistics</p>
<p>    6826 consistent gets<br />
    6819 physical   reads</p>
<p>    select /*+ index(emp5 skip1)*/ count(*)<br />
    from emp5<br />
    where empno=7900;</p>
<p>    Elapsed:00:00:00.56</p>
<p>    Execution Plan<br />
    0     SELECT STATEMENT Optimizer=CHOOSE(Cost=6 Card=1 Bytes=5)<br />
    1  0    SORT(AGGREGATE)<br />
    2  1      INDEX(SKIP SCAN) OF &#8216;SKIP1&#8242;(NON-UNIQUE)</p>
<p>    Statistics</p>
<p>    21 consistent gets<br />
    17 physical   reads</p>
<p>[10] 索引的类型<br />
     B-树索引<br />
     位图索引<br />
     HASH索引<br />
     索引编排表<br />
     反转键索引<br />
     基于函数的索引<br />
     分区索引<br />
     本地和全局索引</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronw.cn/static/25.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle专家调优</title>
		<link>http://www.aaronw.cn/static/24.html</link>
		<comments>http://www.aaronw.cn/static/24.html#comments</comments>
		<pubDate>Fri, 07 Mar 2008 07:14:42 +0000</pubDate>
		<dc:creator>Aaron.wang</dc:creator>
				<category><![CDATA[DB]]></category>

		<guid isPermaLink="false">http://www.aaronw.cn/html/24_oracle%e4%b8%93%e5%ae%b6%e8%b0%83%e4%bc%98.html</guid>
		<description><![CDATA[在过去的十年中， Oracle 已经成为世界上最专业的数据库之一。对于 IT 专家来说，就是要确保利用 Oracle 的强大特性来提高他们公司的生产力。最有效的方法之一是通过 Oracle 调优。它有大量的调整参数和技术来改进你的 Oracle 数据库的性能。
Oracle 调优是一个复杂的主题。关于调优可以写整整一本书，不过，为了改善 Oracle 数据库的性能，有一些基本的概念是每个 Oracle DBA 都应该遵从的。
　　 在这篇简介中，我们将简要地介绍以下的 Oracle 主题：
　　&#8211; 外部调整：我们应该记住 Oracle 并不是单独运行的。因此我们将查看一下通过调整 Oracle 服务器以得到高的性能。
　　&#8211;Row re-sequencing 以减少磁盘 I/O ：我们应该懂得 Oracle 调优最重要的目标是减少 I/O 。
　　&#8211;Oracle SQL 调整。 Oracle SQL 调整是 Oracle 调整中最重要的领域之一，只要通过一些简单的 SQL 调优规则就可以大幅度地提升 SQL 语句的性能，这是一点都不奇怪的。
　　&#8211; 调整 Oracle 排序：排序对于 Oracle 性能也是有很大影响的。
　　&#8211; 调整 Oracle 的竞争：表和索引的参数设置对于 UPDATE 和 INSERT [...]]]></description>
			<content:encoded><![CDATA[<p>在过去的十年中， Oracle 已经成为世界上最专业的数据库之一。对于 IT 专家来说，就是要确保利用 Oracle 的强大特性来提高他们公司的生产力。最有效的方法之一是通过 Oracle 调优。它有大量的调整参数和技术来改进你的 Oracle 数据库的性能。<br />
Oracle 调优是一个复杂的主题。关于调优可以写整整一本书，不过，为了改善 Oracle 数据库的性能，有一些基本的概念是每个 Oracle DBA 都应该遵从的。<br />
　　 在这篇简介中，我们将简要地介绍以下的 Oracle 主题：<br />
　　&#8211; 外部调整：我们应该记住 Oracle 并不是单独运行的。因此我们将查看一下通过调整 Oracle 服务器以得到高的性能。<br />
　　&#8211;Row re-sequencing 以减少磁盘 I/O ：我们应该懂得 Oracle 调优最重要的目标是减少 I/O 。<br />
　　&#8211;Oracle SQL 调整。 Oracle SQL 调整是 Oracle 调整中最重要的领域之一，只要通过一些简单的 SQL 调优规则就可以大幅度地提升 SQL 语句的性能，这是一点都不奇怪的。<br />
　　&#8211; 调整 Oracle 排序：排序对于 Oracle 性能也是有很大影响的。<br />
　　&#8211; 调整 Oracle 的竞争：表和索引的参数设置对于 UPDATE 和 INSERT 的性能有很大的影响。</p>
<p>　　 我们首先从调整 Oracle 外部的环境开始。如果内存和 CPU 的资源不足的话，任何的 Oracle 调整都是没有帮助的。<br />
<span id="more-24"></span><br />
　　外部的性能问题<br />
　　<br />
　　Oracle 并不是单独运行的。 Oracle 数据库的性能和外部的环境有很大的关系。这些外部的条件包括有：<br />
　　 ． CPU&#8211;CPU 资源的不足令查询变慢。当查询超过了 Oracle 服务器的 CPU 性能时，你的数据库性能就受到 CPU 的限制。<br />
　　 ．内存 &#8212; 可用于 Oralce 的内存数量也会影响 SQL 的性能，特别是在数据缓冲和内存排序方面。<br />
　　 ．网络 &#8212; 大量的 Net8 通信令 SQL 的性能变慢。<br />
　　 许多新手都错误的认为应该首先调整 Oracle 数据库，而不是先确认外部资源是否足够。实际上，如果外部环境出现瓶颈，再多的 Oracle 调整都是没有帮助的。<br />
　　 在检查 Oracle 的外部环境时，有两个方面是需要注意的：<br />
　　1 、当运行队列的数目超过服务器的 CPU 数量时，服务器的性能就会受到 CPU 的限制。补救的方法是为服务器增加额外的 CPU 或者关闭需要很多处理资源的组件，例如 Oracle Parallel Query 。<br />
　　2 、内存分页。当内存分页时，内存容量已经不足，而内存页是与磁盘上的交换区进行交互的。补救的方法是增加更多的内存，减少 Oracle SGA 的大小，或者关闭 Oracle 的多线程服务器。<br />
　　 可以使用各种标准的服务器工具来得到服务器的统计数据，例如 vmstat,glance,top 和 sar 。 DBA 的目标是确保数据库服务器拥有足够的 CPU 和内存资源来处理 Oracle 的请求。<br />
　　 以下让我们来看一下 Oracle 的 row-resequencing 是如何能够极大地减少磁盘 I/O 的。</p>
<p>　　Row-resequencing （行的重新排序）<br />
　　<br />
　　就象我们上面提到的，有经验的 Oracle DBA 都知道 I/O 是响应时间的最大组成部分。其中磁盘 I/O 特别厉害，因为当 Oracle 由磁盘上的一个数据文件得到一个数据块时，读的进程就必须等待物理 I/O 操作完成。磁盘操作要比数据缓冲慢 10,000 倍。因此，如果可以令 I/O 最小化，或者减少由于磁盘上的文件竞争而带来的瓶颈，就可以大大地改善 Oracle 数据库的性能。<br />
　　如果系统响应很慢，通过减少磁盘 I/O 就可以有一个很快的改善。如果在一个事务中通过按一定的范围搜索 primary-key 索引来访问表，那么重新以 CTAS 的方法组织表将是你减少 I/O 的首要策略。通过在物理上将行排序为和 primary-key 索引一样的顺序，就可以加快获得数据的速度。<br />
　　 就象磁盘的负载平衡一样，行的重新排序也是很简单的，而且也很快。通过与其它的 DBA 管理技巧一起使用，就可以在高 I/O 的系统中大大地减少响应的时间。<br />
　　 在高容量的在线事务处理环境中（ online transaction processing ， OLTP ），数据是由一个 primary 索引得到的，重新排序表格的行就可以令连续块的顺序和它们的 primary 索引一样，这样就可以在索引驱动的表格查询中，减少物理 I/O 并且改善响应时间。这个技巧仅在应用选择多行的时候有用，或者在使用索引范围搜索和应用发出多个查询来得到连续的 key 时有效。对于随机的唯一 primary-key （主键）的访问将不会由行重新排序中得到好处。<br />
　　 让我们看一下它是如何工作的。考虑以下的一个 SQL 的查询，它使用一个索引来得到 100 行：<br />
selectsalaryfromemployeewherelast_name like &#8216;B%&#8217;;<br />
这个查询将会使用 last_name_index ，搜索其中的每一行来得到目标行。这个查询将会至少使用 100 次物理磁盘的读取，因为 employee 的行存放在不同的数据块中。<br />
　　 不过，如果表中的行已经重新排序为和 last_name_index 的一样，同样的查询又会怎样处理呢？我们可以看到这个查询只需要三次的磁盘 I/O 就读完全部 100 个员工的资料（一次用作索引的读取，两次用作数据块的读取），减少了 97 次的块读取。<br />
　　 重新排序带来的性能改善的程度在于在你开始的时候行的乱序性如何，以及你需要由序列中访问多少行。至于一个表中的行与索引的排序键的匹配程度，可以查看数据字典中的 dba_indexes 和 dba_tables 视图得到。<br />
　　 在 dba_indexes 的视图中，查看 clustering_factor 列。如果 clustering_factor 的值和表中的块数目大致一样，那么你的表和索引的顺序是一样的。不过，如果 clustering_factor 的值接近表中的行数目，那就表明表格中的行和索引的顺序是不一样的。<br />
　　 行重新排序的作用是不可以小看的。在需要进行大范围的索引搜索的大表中，行重新排序可以令查询的性能提高三倍。<br />
　　 一旦你已经决定重新排序表中的行，你可以使用以下的工具之一来重新组织表格。<br />
　　. 使用 Oracle 的 Create Table As Select (CTAS) 语法来拷贝表格<br />
　　. Oracle9i 自带的表格重新组织工具<br />
　　<br />
　　 以下，我们来看以下 SQL 语句的调优。</p>
<p>　　SQL 调优<br />
　　Oracle 的 SQL 调优是一个复杂的主题，甚至是需要整本书来介绍 Oracle SQL 调优的细微差别。不过有一些基本的规则是每个 Oracle DBA 都需要跟从的，这些规则可以改善他们系统的性能。 SQL 调优的目标是简单的：<br />
　　. 消除不必要的大表全表搜索：不必要的全表搜索导致大量不必要的 I/O ，从而拖慢整个数据库的性能。调优专家首先会根据查询返回的行数目来评价 SQL 。在一个有序的表中，如果查询返回少于 40% 的行，或者在一个无序的表中，返回少于 7% 的行，那么这个查询都可以调整为使用一个索引来代替全表搜索。对于不必要的全表搜索来说，最常见的调优方法是增加索引。可以在表中加入标准的 B 树索引，也可以加入 bitmap 和基于函数的索引。要决定是否消除一个全表搜索，你可以仔细检查索引搜索的 I/O 开销和全表搜索的开销，它们的开销和数据块的读取和可能的并行执行有关，并将两者作对比。在一些情况下，一些不必要的全表搜索的消除可以通过强制使用一个 index 来达到，只需要在 SQL 语句中加入一个索引的提示就可以了。<br />
　　. 在全表搜索是一个最快的访问方法时，将小表的全表搜索放到缓存中，调优专家应该确保有一个专门的数据缓冲用作行缓冲。在 Oracle7 中，你可以使用 alter table xxx cache 语句，在 Oracle8 或以上，小表可以被强制为放到 KEEP 池中缓冲。<br />
　　. 确保最优的索引使用 ：对于改善查询的速度，这是特别重要的。有时 Oracle 可以选择多个索引来进行查询，调优专家必须检查每个索引并且确保 Oracle 使用正确的索引。它还包括 bitmap 和基于函数的索引的使用。<br />
　　. 确保最优的 JOIN 操作：有些查询使用 NESTED LOOP join 快一些，有些则是 HASH join 快一些，另外一些则是 sort-merge join 更快。<br />
　　 这些规则看来简单，不过它们占 SQL 调优任务的 90% ，并且它们也无需完全懂得 Oracle SQL 的内部运作。以下我们来简单概览以下 Oracle SQL 的优化。<br />
　　 我们首先简要查看 Oracle 的排序，并且看一看排序操作是如何影响性能的。</p>
<p>　　 调整 Oracle 的排序操作<br />
　　 排序是 SQL 语法中一个小的方面，但很重要，在 Oracle 的调整中，它常常被忽略。当使用 create index 、 ORDER BY 或者 GROUP BY 的语句时， Oracle 数据库将会自动执行排序的操作。通常，在以下的情况下 Oracle 会进行排序的操作：<br />
　　 使用 Order by 的 SQL 语句<br />
　　 使用 Group by 的 SQL 语句<br />
　　 在创建索引的时候<br />
　　 进行 table join 时，由于现有索引的不足而导致 SQL 优化器调用 MERGE SORT<br />
　　 当与 Oracle 建立起一个 session 时，在内存中就会为该 session 分配一个私有的排序区域。如果该连接是一个专用的连接 (dedicated connection) ，那么就会根据 init.ora 中 sort_area_size 参数的大小在内存中分配一个 Program Global Area (PGA) 。如果连接是通过多线程服务器建立的，那么排序的空间就在 large_pool 中分配。不幸的是，对于所有的 session ，用做排序的内存量都必须是一样的，我们不能为需要更大排序的操作分配额外的排序区域。因此，设计者必须作出一个平衡，在分配足够的排序区域以避免发生大的排序任务时出现磁盘排序（ disk sorts ）的同时，对于那些并不需要进行很大排序的任务，就会出现一些浪费。当然，当排序的空间需求超出了 sort_area_size 的大小时，这时将会在 TEMP 表空间中分页进行磁盘排序。磁盘排序要比内存排序大概慢 14,000 倍。<br />
　　 上面我们已经提到，私有排序区域的大小是有 init.ora 中的 sort_area_size 参数决定的。每个排序所占用的大小由 init.ora 中的 sort_area_retained_size 参数决定。当排序不能在分配的空间中完成时，就会使用磁盘排序的方式，即在 Oracle 实例中的临时表空间中进行。<br />
　　磁盘排序的开销是很大的，有几个方面的原因。首先，和内存排序相比较，它们特别慢；而且磁盘排序会消耗临时表空间中的资源。 Oracle 还必须分配缓冲池块来保持临时表空间中的块。无论什么时候，内存排序都比磁盘排序好，磁盘排序将会令任务变慢，并且会影响 Oracle 实例的当前任务的执行。还有，过多的磁盘排序将会令 free buffer waits 的值变高，从而令其它任务的数据块由缓冲中移走。<br />
　　 接着，让我们看一下 Oracle 的竞争，并且看一下表的存储参数的设置是如何影响 SQL UPDATE 和 INSERT 语句的性能的。</p>
<p>调整 Oracle 的竞争<br />
　　Oracle 的其中一个优点时它可以管理每个表空间中的自由空间。 Oracle 负责处理表和索引的空间管理，这样就可以让我们无需懂得 Oracle 的表和索引的内部运作。不过，对于有经验的 Oracle 调优专家来说，他需要懂得 Oracle 是如何管理表的 extent 和空闲的数据块。对于调整拥有高的 insert 或者 update 的系统来说，这是非常重要的。<br />
　　 要精通对象的调整，你需要懂得 freelists 和 freelist 组的行为，它们和 pctfree 及 pctused 参数的值有关。这些知识对于企业资源计划（ ERP ）的应用是特别重要的，因为在这些应用中，不正确的表设置通常是 DML 语句执行慢的原因。<br />
　　对于初学者来说，最常见的错误是认为默认的 Oracle 参数对于所有的对象都是最佳的。除非磁盘的消耗不是一个问题，否则在设置表的 pctfree 和 pctused 参数时，就必须考虑平均的行长和数据库的块大小，这样空的块才会被有效地放到 freelists 中。当这些设置不正确时，那些得到的 freelists 也是 &#8220;dead&#8221; 块，因为它们没有足够的空间来存储一行，这样将会导致明显的处理延迟。<br />
Freelists 对于有效地重新使用 Oracle 表空间中的空间是很重要的，它和 pctfree 及 pctused 这两个存储参数的设置直接相关。通过将 pctused 设置为一个高的值，这时数据库就会尽快地重新使用块。不过，高性能和有效地重新使用表的块是对立的。在调整 Oracle 的表格和索引时，需要认真考虑究竟需要高性能还是有效的空间重用，并且据此来设置表的参数。以下我们来看一下这些 freelists 是如何影响 Oracle 的性能的。<br />
　　 当有一个请求需要插入一行到表格中时， Oracle 就会到 freelist 中寻找一个有足够的空间来容纳一行的块。你也许知道， freelist 串是放在表格或者索引的第一个块中，这个块也被称为段头（ segment header ）。 pctfree 和 pctused 参数的唯一目的就是为了控制块如何在 freelists 中进出。虽然 freelist link 和 unlink 是简单的 Oracle 功能，不过设置 freelist link (pctused) 和 unlink (pctfree) 对 Oracle 的性能确实有影响。<br />
　　 由 DBA 的基本知识知道， pctfree 参数是控制 freelist un-links 的（即将块由 freelists 中移除）。设置 pctfree=10 意味着每个块都保留 10% 的空间用作行扩展。 pctused 参数是控制 freelist re-links 的。设置 pctused=40 意味着只有在块的使用低于 40% 时才会回到表格的 freelists 中。<br />
　　 许多新手对于一个块重新回到 freelists 后的处理都有些误解。其实，一旦由于一个删除的操作而令块被重新加入到 freelist 中，它将会一直保留在 freelist 中即使空间的使用超过了 60% ，只有在到达 pctfree 时才会将数据块由 freelist 中移走。</p>
<p>　　 表格和索引存储参数设置的要求总结<br />
　　 以下的一些规则是用来设置 freelists, freelist groups, pctfree 和 pctused 存储参数的。你也知道， pctused 和 pctfree 的值是可以很容易地通过 alter table 命令修改的，一个好的 DBA 应该知道如何设置这些参数的最佳值。<br />
　　 有效地使用空间和高性能之间是有矛盾的，而表格的存储参数就是控制这个方面的矛盾：<br />
. 对于需要有效地重新使用空间，可以设置一个高的 pctused 值，不过副作用是需要额外的 I/O 。一个高的 pctused 值意味着相对满的块都会放到 freelist 中。因此，这些块在再次满之前只可以接受几行记录，从而导致更多的 I/O 。<br />
. 追求高性能的话，可以将 pctused 设置为一个低的值，这意味着 Oracle 不会将数据块放到 freelists 中直到它几乎是空的。那么块将可以在满之前接收更多的行，因此可以减少插入操作的 I/O 。要记住 Oracle 扩展新块的性能要比重新使用现有的块高。对于 Oracle 来说，扩展一个表比管理 freelists 消耗更少的资源。<br />
　　 让我们来回顾一下设置对象存储参数的一些常见规则：<br />
　　 ．经常将 pctused 设置为可以接收一条新行。对于不能接受一行的 free blocks 对于我们来说是没有用的。如果这样做，将会令 Oracle 的性能变慢，因为 Oracle 将在扩展表来得到一个空的块之前，企图读取 5 个 &#8220;dead&#8221; 的 free block 。<br />
　　 ．表格中 chained rows 的出现意味着 pctfree 太低或者是 db_block_size 太少。在很多情况下， RAW 和 LONG RAW 列都很巨大，以至超过了 Oracle 的最大块的大小，这时 chained rows 是不可以避免的。<br />
　　 ．如果一个表有同时插入的 SQL 语句，那么它需要有同时删除的语句。运行单一个一个清除的工作将会把全部的空闲块放到一个 freelist 中，而没有其它包含有任何空闲块的 freelists 出现。<br />
　　 ． freelist 参数应该设置为表格同时更新的最大值。例如，如果在任何时候，某个表最多有 20 个用户执行插入的操作，那么该表的参数应该设置为 freelists=20 。<br />
　　 应记住的是 freelist groups 参数的值只是对于 Oracle Parallel Server 和 Real Application Clusters 才是有用的。对于这类 Oracle ， freelist groups 应该设置为访问该表格的 Oracle Parallel Server 实例的数目。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronw.cn/static/24.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>调整系统用SYSTEM回滚段</title>
		<link>http://www.aaronw.cn/static/23.html</link>
		<comments>http://www.aaronw.cn/static/23.html#comments</comments>
		<pubDate>Fri, 07 Mar 2008 07:11:52 +0000</pubDate>
		<dc:creator>Aaron.wang</dc:creator>
				<category><![CDATA[DB]]></category>

		<guid isPermaLink="false">http://www.aaronw.cn/html/23_%e8%b0%83%e6%95%b4%e7%b3%bb%e7%bb%9f%e7%94%a8system%e5%9b%9e%e6%bb%9a%e6%ae%b5.html</guid>
		<description><![CDATA[Oracle 数据库系统总是将系统用的回滚取名为SYSTEM(不要与SYSTEM用户相混)，而且该回滚段都建立在 SYSTEM表空间内。比如可以从下面查询中看到系统的所有回滚段的基本信息：
SQL&#62; select segment_name,tablespace_name,bytes,next_extent
  2   from dba_segments where segment_type=&#8217;ROLLBACK&#8217;;
SEGMENT_NAME     TABLESPACE_NAME           BYTES  NEXT_EXTENT
&#8212;&#8212;&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;&#8212;&#8211;    &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;
SYSTEM           SYSTEM                   409600       57344
RBS0               RBS                     4194304     2097152
RBS1               RBS                     4194304  [...]]]></description>
			<content:encoded><![CDATA[<p>Oracle 数据库系统总是将系统用的回滚取名为SYSTEM(不要与SYSTEM用户相混)，而且该回滚段都建立在 SYSTEM表空间内。比如可以从下面查询中看到系统的所有回滚段的基本信息：</p>
<p>SQL&gt; select segment_name,tablespace_name,bytes,next_extent<br />
  2   from dba_segments where segment_type=&#8217;ROLLBACK&#8217;;</p>
<p>SEGMENT_NAME     TABLESPACE_NAME           BYTES  NEXT_EXTENT<br />
&#8212;&#8212;&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;&#8212;&#8211;    &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;<br />
SYSTEM           SYSTEM                   409600       57344<br />
RBS0               RBS                     4194304     2097152<br />
RBS1               RBS                     4194304     2097152<br />
RBS2               RBS                     4194304     2097152<br />
RBS3               RBS                     4194304     2097152<br />
RBS4               RBS                     4194304     2097152<br />
RBS5               RBS                     4194304     2097152<br />
RBS6               RBS                     4194304     2097152</p>
<p>从上面仅仅是查询到回滚段的基本信息，要了目前各个回滚段的动态信息，还要查询V$ROLLNAME和V$ROLLSTAT视图。V$ROLLNAME视图只存放各回滚段的编号和名字，V$ROLLSTATS存放各个回滚段当前的情况信息。要想得到每个回滚段的信息，就要查询两个表的信息才能得到。如：<br />
<span id="more-23"></span><br />
SQL&gt; col name for a12<br />
  1  select s.usn,n.name,s.extents,s.optsize,s.hwmsize,s.status<br />
  2* from v$rollstat s, v$rollname n where s.usn=n.usn</p>
<p>显示的查询结果如下：</p>
<p>     USN         NAME       EXTENTS    OPTSIZE    HWMSIZE     STATUS<br />
&#8212;&#8212;&#8212;-  &#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;-  &#8212;&#8212;&#8212;-  &#8212;&#8212;&#8212;&#8212;&#8212;<br />
    0         SYSTEM           5       8388608        401408         ONLINE<br />
    1          RBS0            8       8388608        4186112        ONLINE<br />
    2          RBS1            8       8388608        4186112        ONLINE<br />
    3          RBS2            8       8388608        4186112        ONLINE<br />
    4          RBS3            8       8388608        4186112        ONLINE<br />
    5          RBS4            8       8388608        4186112        ONLINE<br />
    6          RBS5            8       8388608        4186112        ONLINE</p>
<p>已选择8行。</p>
<p>从第1个查询语句得到的结果看，SYSTEM回滚段的初始分配太小，只有400KB，而且下一次分配的大小也太小。只有56KB。这显然是不合适的，但对于 SYSTEM回滚段，建议只能调整修改下次分配（NEXT）值和最佳扩展（OPTIMAL）值。注意目前Oracle不允许修改各个段的初始分配值，包括表、索引及簇的初始分配等。</p>
<p>例子：根据前面的查询结果：<br />
systen回滚段的初始分配initial = 409600 ；<br />
下一次分配 next = 57344；<br />
最佳扩展值 optimal= null；<br />
根据这样的情况，我们可以修改下一次分配的值为 1MB(=1024000字节)；修改最佳扩展值为：optimal = initial + 2 * next = 409600 + 2* 1024000 = 2457600  。所以修改SYSTEM回滚的命令为：</p>
<p>SQL&gt; alter rollback segment system  storage(next 1m optimal 2457600);</p>
<p>重算段已修改。</p>
<p>注： optimal 表示在事务处理当中，该回滚段由于增、删、改的数据量的需要而不断对回滚段进行扩展，以满足事务的要求，但是在事务处理完成后可以让回滚段缩小到一个最佳的范围内。这就是由回滚段的OPTIMAL参数来控制。一般optimal = initial + n* next , 且  n &gt;1 。</p>
<p>确定回滚段的数目</p>
<p>    回滚段的数量直接影响到系统的性能，如果回滚段的个数不够多，则在多个用户同时进行增、删、该时就存在等待现象。</p>
<p>要确定是否增加回滚段的数量，先要查询两个动态视图，即V$ROLLSTAT，V$WAITSTAT。如：</p>
<p>SQL&gt;  select * from v$waitstat where ;</p>
<p>CLASS                   COUNT       TIME<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;-<br />
undo header                 0          0</p>
<p>SQL&gt; select usn,extents,waits from v$rollstat;</p>
<p>       USN    EXTENTS      WAITS<br />
&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;-<br />
         0          5          0<br />
         1          8          0<br />
         2          8          0<br />
         3          8          0<br />
         4          8          0<br />
         5          8          0<br />
         6          8          0<br />
         7          8          0</p>
<p>如果 waits 存在大于 0 的数，则需要增加回滚段的数量。一般回滚段的数量主要根据应用系统的类型来决定。比如一般的历史档案系统，由于其主要处理是查询。这类增、删、改相对较少的应用，可以建立较少的回滚段。而想银行、证券等应用。就需要很多的回滚段。那么到底要多少才相对就够了呢？ 下面的回答具有一般性：</p>
<p>在并发程度要求高的应用系统， 同一时间内有多个 transaction 在竞争竟争回退段。假如transaction为事务的个数；则有：</p>
<p>n= transaction/transactions_per_rollback_segment</p>
<p>其中：<br />
n= 回退段数量<br />
transaction 为ORACLE 系统参数，系统中允许并发处理的最大transaction 数。<br />
transactions_per_rollback_segment 为 ORACLE 参数，每个回退段允许同时写入的最大 transaction 数。</p>
<p>另外，如果从 v$waitstat 动态视图中查出自数据库启动后回退头的等待次数较高，则应该多建立回滚段。</p>
<p>确定回滚段的大小<br />
    由于回滚段是建立在特定的表空间里，所以回滚段的多少就要根据应用的需要和硬盘的大小来决定。一般Oracle安装完成后各个回滚段的大小都太小。一般的应用都需要进行调整。那么到底每个回滚段建立多大就够了呢。下面给出一般的应用的回滚段大小的创建建议：</p>
<p>建立专用的大回滚段<br />
如果说，建立每个回滚段都很大，可以满足任何增、删、改的需要。但是这样就会浪费磁盘空间，因为这些回滚段的使用频繁并不是很高。所以，建议针对专门的处理建立大的回滚段。比如管理员的数据库整理，包括将旧数据删除，恢复大量数据等。这样的操作无论是在命令方式或是通过程序来使用，都会有很大好处。</p>
<p>例子：为结息处理建立大的回滚段：</p>
<p>create rollback segment  interest   tablespace  interest_tabspace<br />
storage( initial  50m  next 10m  optimal  80m  pct_increase 0 );</p>
<p>建立通用的回滚段<br />
无论是任何类型的应用，建议重新建立新的回滚段。除了上面介绍的建立专门的回滚段以外，需要建立初始值，下次增加及最佳值合适的值。一般建议是 初始值 最好是 5MB以上，下次增长为 2MB至 5MB之间，最佳值在 20M至30MB之间。</p>
<p>改变回滚段<br />
当回滚段建立好了之后，有时需要对它们进行修改。可以对回滚段进行存储参数的修改，可以对某个脱机（OFFLINE）回滚段修改为联机（ONLINE）。也可能对已经处于联机的回滚段设置为脱机，比如当我们进行IMP或大量修改数据时，Oracle总是需要大的回滚段。但由于分配回滚段是Oracle系统包办。为了在事务处理中得到大的回滚段，我们只能将较小的回滚段设置为脱机的状态，等到我们所处理的事务完成后在将它们设置为联机等。<br />
§14.4.1 观察回滚段的增长<br />
虽然回滚段在使用过程中作过扩展而在用完后又自动按照 OPTIMAL 要求大小缩小，但在动态字典V$ROLLSTAT 中会记录曾经扩展的情况。命令如下：</p>
<p>select   n.name, optsize, hwmsize<br />
from v$ROLLNAME n , V$ROLLSTAT s<br />
where n.usn=s.usn ;</p>
<p>optsize  是 最优大小值， hwmsize =Hight water mark of rollback segment  size 回滚段扩展中最高值（水位）。如果 optsize 为空，则 hwmsize 就是当前最高值。</p>
<p>改变回滚段的存储参数<br />
可以对已经建立的回滚段的参数进行修改，允许修改的参数有OPTIMAL或MAXEXTENTS参数。如：<br />
ALTER ROLLBACK SEGMENT rbs_01<br />
STORAGE (MAXEXTENTS 120);</p>
<p>同样也可以修改系统回滚段的OPTIMAL参数。</p>
<p>手工缩短回滚段的存储分配<br />
如果某些回滚段建立时设置参数过大，可以用Alter 命令带SHRINK保留字来实现将其大小缩短到某个合适的值里。如：</p>
<p>ALTER ROLLBACK SEGMENT rbs1 SHRINK TO 100K;</p>
<p>§14.4.4 设置回滚段状态为ONLINE/OFFLINE<br />
作为细心的管理员，应该经常注意到所运行的系统的各个回滚段的状态是处于ONLINE或OFFLINE。可以从数据字典中查询到。如：</p>
<p>SQL&gt; select name,status from v$rollname,v$rollstat<br />
  2  where v$rollstat.usn=v$rollname.usn;</p>
<p>NAME                           STATUS<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;&#8212;&#8212;<br />
SYSTEM                         ONLINE<br />
RBS0                           ONLINE<br />
RBS1                           ONLINE<br />
RBS2                           ONLINE<br />
RBS3                           ONLINE<br />
RBS4                           ONLINE<br />
RBS5                           ONLINE<br />
RBS6                           ONLINE</p>
<p>已选择8行。</p>
<p>可以用下面方法来使回滚段状态为脱机或联机：</p>
<p>1．在INITsid.ora参数文件中设置ROLLBACK_SEGMENTS使得所需要的回滚段变为ONLINE.</p>
<p>ROLLBACK_SEGMENTS = ( seg1_name,seg2_name, &#8230; )</p>
<p>2．在命令方式下设置回滚段为ONLINE</p>
<p>ALTER ROLLBACK SEGMENT user_rs_2 ONLINE;</p>
<p>3.设置回滚段为OFFLINE</p>
<p>ALTER ROLLBACK SEGMENT user_rs_2 OFFLINE;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronw.cn/static/23.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ORACLE 10G 闪回技术</title>
		<link>http://www.aaronw.cn/static/22.html</link>
		<comments>http://www.aaronw.cn/static/22.html#comments</comments>
		<pubDate>Fri, 07 Mar 2008 07:10:24 +0000</pubDate>
		<dc:creator>Aaron.wang</dc:creator>
				<category><![CDATA[DB]]></category>

		<guid isPermaLink="false">http://www.aaronw.cn/html/22_oracle-10g-%e9%97%aa%e5%9b%9e%e6%8a%80%e6%9c%af.html</guid>
		<description><![CDATA[何为闪回恢复区
Oracle 10g 有一项新功能称为：自动的基于磁盘的备份与恢复( Automatic Disk-Based Backup and Recovery )。实现该功能的基础为本文要讲述的闪回恢复区( Flash Recovery Area )。闪回恢复区是 Oracle 10g 中的新事物。简单的说，闪回恢复区是一块用以存储恢复相关的文件的存储空间。允许用户集中存储所有恢复相关的文件。
闪回恢复区可以放在如下几种存储形式上：
l         目录
l         一个文件系统
l         自动存储管理(ASM)磁盘组
在 RAC 环境中,这个该位置必须为 集群文件系统 (cluster file system) 或是 ASM 磁盘组亦或是通过 NFS 控制的文件共享目录，还要注意的是，所有实例的位置和操作系统的磁盘限额 (disk quota) 必须一致。
如下几种文件可以放到闪回恢复区中:
l         控制文件
l         归档的日志文件(注：Oracle 手册上所说的在设定flash recovery area之后，LOG_ARCHIVE_DEST_10的值将自动设定为flash recovery area的位置，这个变化在笔者测试过程中观察不到)
l         闪回日志
l        [...]]]></description>
			<content:encoded><![CDATA[<p>何为闪回恢复区</p>
<p>Oracle 10g 有一项新功能称为：自动的基于磁盘的备份与恢复( Automatic Disk-Based Backup and Recovery )。实现该功能的基础为本文要讲述的闪回恢复区( Flash Recovery Area )。闪回恢复区是 Oracle 10g 中的新事物。简单的说，闪回恢复区是一块用以存储恢复相关的文件的存储空间。允许用户集中存储所有恢复相关的文件。<br />
闪回恢复区可以放在如下几种存储形式上：</p>
<p>l         目录</p>
<p>l         一个文件系统</p>
<p>l         自动存储管理(ASM)磁盘组</p>
<p>在 RAC 环境中,这个该位置必须为 集群文件系统 (cluster file system) 或是 ASM 磁盘组亦或是通过 NFS 控制的文件共享目录，还要注意的是，所有实例的位置和操作系统的磁盘限额 (disk quota) 必须一致。</p>
<p>如下几种文件可以放到闪回恢复区中:</p>
<p>l         控制文件</p>
<p>l         归档的日志文件(注：Oracle 手册上所说的在设定flash recovery area之后，LOG_ARCHIVE_DEST_10的值将自动设定为flash recovery area的位置，这个变化在笔者测试过程中观察不到)</p>
<p>l         闪回日志</p>
<p>l         控制文件和 SPFILE 自动备份</p>
<p>l         RMAN 备份集</p>
<p>l         数据文件拷贝</p>
<p><span id="more-22"></span><br />
为何要用闪回恢复区?</p>
<p>如前所述，闪回恢复区提供了一个集中化的存储区域，很大程度上减小了管理开销。这是其最主要的优点。与 RMAN 结合使用可以进行快速恢复。</p>
<p>近年来随着存储技术的发展，单个磁盘的存储能力已经加强。这使自动的基于磁盘的备份与恢复的技术实现成为可能。而闪回恢复区恰是基于磁盘的备份与恢复的基础。把闪回恢复区和 OMF 与 ASM 结合运用看起来是比较完美的方案。当然，不可否认的是，自动备份恢复技术还远远不够成熟。</p>
<p>设定闪回恢复区</p>
<p>如果您使用DBCA创建的数据库，在安装时可以设定闪回恢复区的位置以及大小(点击这里查看安装截图)&#8211;这也是 Oracle 10g OUI 的新功能之一。如果在开始的时候没有启用闪回恢复区，可以通过如下方式设定。调整如下两个动态初始化参数(无需重新启动实例)：</p>
<p>SQL&gt; ALTER SYSTEM SET db_recovery_file_dest_size=2g SCOPE=BOTH;</p>
<p>System altered.</p>
<p>SQL&gt;<br />
SQL&gt; ALTER SYSTEM SET db_recovery_file_dest=&#8217;/u01/app/oracle/flash_recovery_area&#8217;</p>
<p>  2  SCOPE=BOTH;</p>
<p>System altered.</p>
<p>SQL&gt;</p>
<p>之后查看所作的修改是否生效：</p>
<p>SQL&gt; SHOW parameter db_recovery_file_dest</p>
<p>NAME                             TYPE        VALUE<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>db_recovery_file_dest            string      /u01/app/oracle/flash_recovery_area</p>
<p>db_recovery_file_dest_size       big integer 2G</p>
<p>SQL&gt;</p>
<p>如上所示，我们设定了闪回恢复区，位置在 /u01/app/oracle/flash_recovery_area，上限为2G。如果要撤销闪回恢复区，把初始化参数 DB_RECOVERY_FILE_DEST 的值清空即可。</p>
<p>注意：DB_RECOVERY_FILE_DEST_SIZE 只有在 DB_RECOVERY_FILE_DEST 清空之后才可以清空。</p>
<p>初始化参数 db_recovery_file_dest_size 的设定有一点点需要注意的地方：</p>
<p>l         文件的第0块和操作系统数据块头的空间大小不包含在内</p>
<p>l         该参数并不代表实际占用的空间大小。如果空间被压缩、镜像、RAID 的话，该参数的值意义是不一样的管理并监控闪回恢复区</p>
<p>我们先看看闪回恢复区内的文架结构层次</p>
<p>SQL&gt; host tree /u01/app/oracle/flash_recovery_area</p>
<p>/u01/app/oracle/flash_recovery_area</p>
<p>|&#8211; DEMO</p>
<p>|   |&#8211; archivelog</p>
<p>|   |   |&#8211; 2004_12_07</p>
<p>|   |   |   |&#8211; o1_mf_1_10_0vbwz2fm_.arc</p>
<p>|   |   |   |&#8211; o1_mf_1_11_0vc1yj14_.arc</p>
<p>|   |   |   |&#8211; o1_mf_1_12_0vc6vvws_.arc</p>
<p>|   |   |   |&#8211; o1_mf_1_13_0vcbv6cg_.arc</p>
<p>|   |   |   |&#8211; o1_mf_1_14_0vchlxb3_.arc</p>
<p>|   |   |   |&#8211; o1_mf_1_15_0vcnh2bz_.arc</p>
<p>|   |   |   |&#8211; o1_mf_1_5_0vbk8goo_.arc</p>
<p>|   |   |   |&#8211; o1_mf_1_6_0vbkq6dk_.arc</p>
<p>|   |   |   |&#8211; o1_mf_1_7_0vbktl5f_.arc</p>
<p>|   |   |   |&#8211; o1_mf_1_8_0vbo97xp_.arc</p>
<p>|   |   |   `&#8211; o1_mf_1_9_0vbrrlo6_.arc</p>
<p>|   |   `&#8211; 2004_12_08</p>
<p>|   |       |&#8211; o1_mf_1_16_0vcnyqvf_.arc</p>
<p>|   |       |&#8211; o1_mf_1_17_0vcp58bj_.arc</p>
<p>|   |       |&#8211; o1_mf_1_18_0vcv4qxb_.arc</p>
<p>|   |       |&#8211; o1_mf_1_19_0vczcsl0_.arc</p>
<p>|   |       |&#8211; o1_mf_1_20_0vd34svw_.arc</p>
<p>|   |       |&#8211; o1_mf_1_21_0vd7tg4h_.arc</p>
<p>|   |       |&#8211; o1_mf_1_22_0vddq7lc_.arc</p>
<p>|   |       |&#8211; o1_mf_1_23_0vdk0nbh_.arc</p>
<p>|   |       |&#8211; o1_mf_1_24_0vdojjky_.arc</p>
<p>|   |       |&#8211; o1_mf_1_25_0vdtg1rq_.arc</p>
<p>|   |       |&#8211; o1_mf_1_26_0vdz23h2_.arc</p>
<p>|   |       |&#8211; o1_mf_1_27_0vf3nlnw_.arc</p>
<p>|   |       |&#8211; o1_mf_1_28_0vf6hon5_.arc</p>
<p>|   |       |&#8211; o1_mf_1_29_0vf867lt_.arc</p>
<p>|   |       |&#8211; o1_mf_1_30_0vf86pkg_.arc</p>
<p>|   |       `&#8211; o1_mf_1_31_0vfjphqm_.arc</p>
<p>|   `&#8211; backupset</p>
<p>|       |&#8211; 2004_12_07</p>
<p>|       |   |&#8211; o1_mf_ncsn1_TAG20041207T150715_0vboq7kv_.bkp</p>
<p>|       |   `&#8211; o1_mf_nnnd1_TAG20041207T150715_0vboo3t2_.bkp</p>
<p>|       `&#8211; 2004_12_08</p>
<p>|           |&#8211; o1_mf_ncsnf_TAG20041208T161219_0vffxv2n_.bkp</p>
<p>|           |&#8211; o1_mf_ncsnf_TAG20041208T165456_0vfjcvgl_.bkp</p>
<p>|           `&#8211; o1_mf_nnndf_TAG20041208T161219_0vffv40q_.bkp</p>
<p>`&#8211; tracking.dbf</p>
<p>7 directories, 33 files</p>
<p>闪回恢复区中添加或删除文件等变化都将记录在数据库的 alert 日志中，Oracle 10g 也针对该新特性提供了一个新的视图， DBA_OUTSTANDING_ALERTS，通过该视图可以得到相关的信息。</p>
<p>DBA_OUTSTANDING_ALERTS 视图的存在体现了 Oracle 愈加人性化的一面。我们先来看一下该视图的基本结构，后面会用到。</p>
<p>SQL&gt; DESC dba_outstanding_alerts</p>
<p>Name                                      Null?    Type</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>SEQUENCE_ID                                        NUMBER</p>
<p>REASON_ID                                 NOT NULL NUMBER</p>
<p>OWNER                                              VARCHAR2(30)</p>
<p>OBJECT_NAME                                        VARCHAR2(513)</p>
<p>SUBOBJECT_NAME                                     VARCHAR2(30)</p>
<p>OBJECT_TYPE                                        VARCHAR2(64)</p>
<p>REASON                                             VARCHAR2(4000)</p>
<p>TIME_SUGGESTED                                     TIMESTAMP(6) WITH TIME ZONE</p>
<p>CREATION_TIME                                      TIMESTAMP(6) WITH TIME ZONE</p>
<p>SUGGESTED_ACTION                                   VARCHAR2(4000)</p>
<p>ADVISOR_NAME                                       VARCHAR2(30)</p>
<p>METRIC_VALUE                                       NUMBER</p>
<p>MESSAGE_TYPE                                       VARCHAR2(12)</p>
<p>MESSAGE_GROUP                                      VARCHAR2(64)</p>
<p>MESSAGE_LEVEL                                      NUMBER</p>
<p>HOSTING_CLIENT_ID                                  VARCHAR2(64)</p>
<p>MODULE_ID                                          VARCHAR2(64)</p>
<p>PROCESS_ID                                         VARCHAR2(128)</p>
<p>HOST_ID                                            VARCHAR2(256)</p>
<p>HOST_NW_ADDR                                       VARCHAR2(256)</p>
<p>INSTANCE_NAME                                      VARCHAR2(16)</p>
<p>INSTANCE_NUMBER                                    NUMBER</p>
<p>USER_ID                                            VARCHAR2(30)<br />
EXECUTION_CONTEXT_ID                               VARCHAR2(60)</p>
<p>ERROR_INSTANCE_ID                                  VARCHAR2(142)<br />
SQL&gt;</p>
<p>10g 的新视图 V$RECOVERY_FILE_DEST 包含闪回恢复区的相关信息：</p>
<p>SQL&gt; desc V$RECOVERY_FILE_DEST</p>
<p>Name                                      Null?    Type</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>NAME                                               VARCHAR2(513)</p>
<p>SPACE_LIMIT                                        NUMBER</p>
<p>SPACE_USED                                         NUMBER</p>
<p>SPACE_RECLAIMABLE                                  NUMBER</p>
<p>NUMBER_OF_FILES                                    NUMBER</p>
<p>SQL&gt; SELECT NAME, space_limit, space_used, space_reclaimable space_rec,</p>
<p>  2         number_of_files file_num</p>
<p>  3    FROM v$recovery_file_dest;</p>
<p>NAME                                SPACE_LIMIT SPACE_USED  SPACE_REC   FILE_NUM</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>/u01/app/oracle/flash_recovery_area  2147483648 1106849280  602410496         30</p>
<p>SQL&gt;</p>
<p>在一些 10g 的动态视图里(V$CONTROLFILE，V$LOGFILE，V$ARCHIVED_LOG，V$DATAFILE_COPY等)的新的列 IS_RECOVERY_DEST_FILE ,指明相关的文件是否在恢复区内。</p>
<p>SQL&gt; SELECT recid, blocks, is_recovery_dest_file</p>
<p>  2    FROM v$archived_log</p>
<p>  3   WHERE recid &lt; 5;<br />
     RECID     BLOCKS IS_RECOVERY_DEST_FILE<br />
&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>         1      20072 YES</p>
<p>         2      19566 YES</p>
<p>         3      19566 YES</p>
<p>         4      19566 YES</p>
<p>SQL&gt;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronw.cn/static/22.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>oracle10g Data Guard新特性：物理备库也可以read/write</title>
		<link>http://www.aaronw.cn/static/21.html</link>
		<comments>http://www.aaronw.cn/static/21.html#comments</comments>
		<pubDate>Fri, 07 Mar 2008 07:06:09 +0000</pubDate>
		<dc:creator>Aaron.wang</dc:creator>
				<category><![CDATA[DB]]></category>

		<guid isPermaLink="false">http://www.aaronw.cn/html/21_oracle10g-data-guard%e6%96%b0%e7%89%b9%e6%80%a7%ef%bc%9a%e7%89%a9%e7%90%86%e5%a4%87%e5%ba%93%e4%b9%9f%e5%8f%af%e4%bb%a5readwrite.html</guid>
		<description><![CDATA[从Oracle10g开始，physical standby也可以临时的置于read/write状态，以便用于开发，测试以及做报表等，然后再通过flashback到先前的时间点，继续应用主库的归档。
下面通过一个实验演示整个过程：
1.设置闪回恢复区
SQL&#62; alter system set db_recovery_file_dest_size=2G;
系统已更改。
SQL&#62; alter system set db_recovery_file_dest=&#8217;e:/oracle/back&#8217;;
系统已更改。
2.取消备库的自动恢复状态
SQL&#62; alter database recover managed standby database cancel;
数据库已更改。
3.创建一个还原点
SQL&#62; create restore point restore_point_test guarantee flashback database;
还原点已创建。

4.在主库归档当前日志，确保前一步创建还原点的scn的归档日志已经传到备库
SQL&#62; alter system archive log current;
系统已更改。
5.将主库到备库的归档目的地的状态设置为defer
SQL&#62; alter system set log_archive_dest_state_2=defer;
系统已更改。
6.激活备库到read/write状态
SQL&#62; alter database activate standby database;
数据库已更改。
SQL&#62; alter database open;
数据库已更改。
7.此时可以在备库执行需要的读写操作
SQL&#62; create table t1 as select * from all_objects where rownum&#60;101;
表已创建。
SQL&#62; drop table t1;
表已删除。
8.将数据库flashback回原来保存的还原点
SQL&#62; startup [...]]]></description>
			<content:encoded><![CDATA[<p><span style="font-size: 12px"><font face="Verdana">从Oracle10g开始，physical standby也可以临时的置于read/write状态，以便用于开发，测试以及做报表等，然后再通过flashback到先前的时间点，继续应用主库的归档。</p>
<p>下面通过一个实验演示整个过程：</p>
<p>1.设置闪回恢复区<br />
SQL&gt; alter system set db_recovery_file_dest_size=2G;</p>
<p>系统已更改。</p>
<p>SQL&gt; alter system set db_recovery_file_dest=&#8217;e:/oracle/back&#8217;;</p>
<p>系统已更改。</p>
<p>2.取消备库的自动恢复状态<br />
SQL&gt; alter database recover managed standby database cancel;</p>
<p>数据库已更改。</p>
<p>3.创建一个还原点<br />
SQL&gt; create restore point restore_point_test guarantee flashback database;</p>
<p>还原点已创建。<br />
<span id="more-21"></span><br />
4.在主库归档当前日志，确保前一步创建还原点的scn的归档日志已经传到备库<br />
SQL&gt; alter system archive log current;</p>
<p>系统已更改。</p>
<p>5.将主库到备库的归档目的地的状态设置为defer<br />
SQL&gt; alter system set log_archive_dest_state_2=defer;</p>
<p>系统已更改。</p>
<p>6.激活备库到read/write状态<br />
SQL&gt; alter database activate standby database;</p>
<p>数据库已更改。</p>
<p>SQL&gt; alter database open;</p>
<p>数据库已更改。</p>
<p>7.此时可以在备库执行需要的读写操作<br />
SQL&gt; create table t1 as select * from all_objects where rownum&lt;101;</p>
<p>表已创建。</p>
<p>SQL&gt; drop table t1;</p>
<p>表已删除。</p>
<p>8.将数据库flashback回原来保存的还原点<br />
SQL&gt; startup mount force;<br />
ORACLE 例程已经启动。</p>
<p>Total System Global Area 142606336 bytes<br />
Fixed Size 1247732 bytes<br />
Variable Size 83887628 bytes<br />
Database Buffers 50331648 bytes<br />
Redo Buffers 7139328 bytes<br />
数据库装载完毕。</p>
<p>SQL&gt; flashback database to restore point restore_point_test;</p>
<p>闪回完成。</p>
<p>9.转换成备库<br />
SQL&gt; alter database convert to physical standby;</p>
<p>数据库已更改。</p>
<p>10.将备库至于自动恢复状态<br />
SQL&gt; startup mount force;<br />
ORACLE 例程已经启动。</p>
<p>Total System Global Area 142606336 bytes<br />
Fixed Size 1247732 bytes<br />
Variable Size 83887628 bytes<br />
Database Buffers 50331648 bytes<br />
Redo Buffers 7139328 bytes<br />
数据库装载完毕。</p>
<p>SQL&gt; alter database recover managed standby database disconnect from session;</p>
<p>数据库已更改。</p>
<p>11.将主库到备库的归档目的地的状态设置为enable<br />
SQL&gt; alter system set log_archive_dest_state_2=enable;</p>
<p>系统已更改。</p>
<p>12.检查主备库，状态正常</p>
<p>主库检查归档目的状态<br />
SQL&gt; select dest_name,status from v$archive_dest;</p>
<p>DEST_NAME STATUS<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
LOG_ARCHIVE_DEST_1 VALID<br />
LOG_ARCHIVE_DEST_2 VALID<br />
LOG_ARCHIVE_DEST_3 INACTIVE<br />
LOG_ARCHIVE_DEST_4 INACTIVE<br />
LOG_ARCHIVE_DEST_5 INACTIVE<br />
LOG_ARCHIVE_DEST_6 INACTIVE<br />
LOG_ARCHIVE_DEST_7 INACTIVE<br />
LOG_ARCHIVE_DEST_8 INACTIVE<br />
LOG_ARCHIVE_DEST_9 INACTIVE<br />
LOG_ARCHIVE_DEST_10 INACTIVE</p>
<p>已选择10行。</p>
<p>备库检查相关进程<br />
SQL&gt; select process,status from v$managed_standby;</p>
<p>PROCESS STATUS<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212; &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
ARCH CONNECTED<br />
ARCH CONNECTED<br />
MRP0 WAIT_FOR_LOG<br />
RFS IDLE</font></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronw.cn/static/21.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用SQL_TRACE进行数据库诊断</title>
		<link>http://www.aaronw.cn/static/20.html</link>
		<comments>http://www.aaronw.cn/static/20.html#comments</comments>
		<pubDate>Fri, 07 Mar 2008 07:04:55 +0000</pubDate>
		<dc:creator>Aaron.wang</dc:creator>
				<category><![CDATA[DB]]></category>

		<guid isPermaLink="false">http://www.aaronw.cn/html/20_%e4%bd%bf%e7%94%a8sql_trace%e8%bf%9b%e8%a1%8c%e6%95%b0%e6%8d%ae%e5%ba%93%e8%af%8a%e6%96%ad.html</guid>
		<description><![CDATA[一、 基础介绍(a) SQL_TRACE说明
SQL_TRACE可以作为初始化参数在全局启用，也可以通过命令行方式在具体session启用。
1． 在全局启用
在参数文件(pfile/spfile)中指定:



sql_trace =true



在全局启用SQL_TRACE会导致所有进程的活动被跟踪，包括后台进程及所有用户进程，这通常会导致比较严重的性能问题，所以在生产环境
中要谨慎使用.
提示: 通过在全局启用sql_trace，我们可以跟踪到所有后台进程的活动，很多在文档中的抽象说明，通过跟踪文件的实时变化，我们可以清晰
的看到各个进程之间的紧密协调.
2． 在当前session级设置
大多数时候我们使用sql_trace跟踪当前进程.通过跟踪当前进程可以发现当前操作的后台数据库递归活动(这在研究数据库新特性时尤其有效)，
研究SQL执行，发现后台错误等.
在session级启用和停止sql_trace方式如下:




启用当前session的跟踪: SQL&#62; alter session set sql_trace=true;  Session altered.  此时的SQL操作将被跟踪: SQL&#62; select count(*) from dba_users;    COUNT(*) ----------         34 结束跟踪: SQL&#62; alter session set sql_trace=false;  Session altered.



3． 跟踪其他用户进程
在很多时候我们需要跟踪其他用户的进程，而不是当前用户，这可以通过Oracle提供的系统包DBMS_SYSTEM. SET_SQL_TRACE_IN_SESSION
来完成
SET_SQL_TRACE_IN_SESSION过程序要提供三个参数:



SQL&#62; desc dbms_system … PROCEDURE SET_SQL_TRACE_IN_SESSION  Argument Name [...]]]></description>
			<content:encoded><![CDATA[<p>一、 基础介绍(a) SQL_TRACE说明</p>
<p>SQL_TRACE可以作为初始化参数在全局启用，也可以通过命令行方式在具体session启用。<br />
<strong>1． 在全局启用</strong><br />
在参数文件(pfile/spfile)中指定:</p>
<table border="0">
<tr>
<td height="24" bgColor="#999999" width="729"><span></p>
<pre>sql_trace =true</pre>
<p></span></td>
</tr>
</table>
<p>在全局启用SQL_TRACE会导致所有进程的活动被跟踪，包括后台进程及所有用户进程，这通常会导致比较严重的性能问题，所以在生产环境<br />
中要谨慎使用.<br />
提示: 通过在全局启用sql_trace，我们可以跟踪到所有后台进程的活动，很多在文档中的抽象说明，通过跟踪文件的实时变化，我们可以清晰<br />
的看到各个进程之间的紧密协调.</p>
<p><strong>2． 在当前session级设置</strong><br />
大多数时候我们使用sql_trace跟踪当前进程.通过跟踪当前进程可以发现当前操作的后台数据库递归活动(这在研究数据库新特性时尤其有效)，<br />
研究SQL执行，发现后台错误等.<br />
在session级启用和停止sql_trace方式如下:<br />
<span id="more-20"></span></p>
<table bgColor="#999999" cellPadding="0" cellSpacing="0">
<tr>
<td width="736" vAlign="top">
<pre>启用当前session的跟踪: SQL&gt; alter session set sql_trace=true;  Session altered.  此时的SQL操作将被跟踪: SQL&gt; select count(*) from dba_users;    COUNT(*) ----------         34 结束跟踪: SQL&gt; alter session set sql_trace=false;  Session altered.</pre>
</td>
</tr>
</table>
<p><strong>3． 跟踪其他用户进程</strong><br />
在很多时候我们需要跟踪其他用户的进程，而不是当前用户，这可以通过Oracle提供的系统包DBMS_SYSTEM. SET_SQL_TRACE_IN_SESSION<br />
来完成</p>
<p>SET_SQL_TRACE_IN_SESSION过程序要提供三个参数:</p>
<table bgColor="#999999" cellPadding="0" cellSpacing="0">
<tr>
<td width="692" vAlign="top">
<pre>SQL&gt; desc dbms_system … PROCEDURE SET_SQL_TRACE_IN_SESSION  Argument Name                     Type                    In/Out Default?  ------------------------------           -----------------------   ------ --------  SID                               NUMBER                  IN  SERIAL#                          NUMBER                  IN  SQL_TRACE                        BOOLEAN                 IN …</pre>
</td>
</tr>
</table>
<p>通过v$session我们可以获得sid、serial#等信息:</p>
<table bgColor="#999999" cellPadding="0" cellSpacing="0">
<tr>
<td width="692" vAlign="top">
<pre>获得进程信息，选择需要跟踪的进程:  SQL&gt; select sid,serial#,username from v$session   2  where username is not null;         SID    SERIAL#  USERNAME ---------- ---------- ------------------------------          8       2041  SYS          9        437  EYGLE  设置跟着: SQL&gt; exec dbms_system.set_sql_trace_in_session(9,437,true)  PL/SQL procedure successfully completed.  …. 可以等候片刻，跟踪session执行任务,捕获sql操作… ….  停止跟踪: SQL&gt; exec dbms_system.set_sql_trace_in_session(9,437,false)  PL/SQL procedure successfully completed.</pre>
</td>
</tr>
</table>
<p><strong>(b) 10046事件说明</strong><br />
10046事件是Oracle提供的内部事件，是对SQL_TRACE的增强.<br />
10046事件可以设置以下四个级别:<br />
1 &#8211; 启用标准的SQL_TRACE功能,等价于sql_trace<br />
4 &#8211; Level 1 加上绑定值(bind values)<br />
8 &#8211; Level 1 + 等待事件跟踪<br />
12 &#8211; Level 1 + Level 4 + Level 8<br />
类似sql_trace，10046事件可以在全局设置，也可以在session级设置。<br />
<strong>1． 在全局设置</strong><br />
在参数文件中增加:</p>
<table bgColor="#999999" cellPadding="0" cellSpacing="0">
<tr>
<td width="692" vAlign="top">event=&#8221;10046 trace name context forever,level 12&#8243;</td>
</tr>
</table>
<p>此设置对所有用户的所有进程生效、包括后台进程.</p>
<p><strong>2． 对当前session设置</strong><br />
通过alter session的方式修改，需要alter session的系统权限:</p>
<table bgColor="#999999" cellPadding="0" cellSpacing="0">
<tr>
<td width="692" vAlign="top">
<pre>SQL&gt; alter session set events '10046 trace name context forever';  Session altered.  SQL&gt; alter session set events '10046 trace name context forever, level 8';  Session altered.  SQL&gt; alter session set events '10046 trace name context off';  Session altered.</pre>
</td>
</tr>
</table>
<p><strong>3． 对其他用户session设置</strong><br />
通过DBMS_SYSTEM.SET_EV系统包来实现:</p>
<table border="0">
<tr>
<td bgColor="#999999" width="729">
<pre><span><span></span> </span>SQL&gt; desc dbms_system ... PROCEDURE SET_EV  Argument Name                  Type                    In/Out Default?  ------------------------------ ----------------------- ------ --------  SI                             BINARY_INTEGER          IN  SE                             BINARY_INTEGER          IN  EV                             BINARY_INTEGER          IN  LE                             BINARY_INTEGER          IN  NM                             VARCHAR2                IN  ...</pre>
</td>
</tr>
</table>
<p>其中的参数SI、SE来自v$session视图:</p>
<table border="0">
<tr>
<td bgColor="#999999" width="729">
<pre><span> </span><span><font size="2" face="Verdana">查询获得需要跟踪的session信息:
SQL&gt; select sid,serial#,username from v$session where username is not null;</font></span></pre>
<p>SID SERIAL# USERNAME<br />
&#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;- &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
8 2041 SYS<br />
9 437 EYGLE<br />
执行跟踪:<br />
SQL&gt; exec dbms_system.set_ev(9,437,10046,8,&#8217;eygle&#8217;);</p>
<p>PL/SQL procedure successfully completed.</p>
<p>结束跟踪:<br />
SQL&gt; exec dbms_system.set_ev(9,437,10046,0,&#8217;eygle&#8217;);</p>
<p><span><font size="2">PL/SQL procedure successfully completed.<br />
</font></span></td>
</tr>
</table>
<p><strong>(c) 获取跟踪文件</strong><br />
以上生成的跟踪文件位于user_dump_dest目录中，位置及文件名可以通过以下SQL查询获得:</p>
<table border="0">
<tr>
<td bgColor="#999999" width="729">
<pre><span> </span><span><font size="2" face="Verdana">SQL&gt; select
  2    d.value||'/'||lower(rtrim(i.instance, chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name
  3  from
  4    ( select p.spid
  5      from sys.v$mystat m,sys.v$session s,sys.v$process p
  6      where m.statistic# = 1 and s.sid = m.sid and p.addr = s.paddr) p,
  7    ( select t.instance from sys.v$thread  t,sys.v$parameter  v
  8      where v.name = 'thread' and (v.value = 0 or t.thread# = to_number(v.value))) i,
  9    ( select value from sys.v$parameter where ) d
 10  /</font></span></pre>
<p>TRACE_FILE_NAME<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
/opt/oracle/admin/hsjf/udump/hsjf_ora_1026.trc</p>
<pre> </pre>
</td>
</tr>
</table>
<p><strong>(d) 读取当前session设置的参数</strong><br />
当我们通过alter session的方式设置了sql_trace,这个设置是不能通过show parameter的方式得到的,我们需要通过dbms_system.read_ev来获取：</p>
<table border="0">
<tr>
<td bgColor="#999999" width="729">
<pre><span> </span><span><font size="2" face="Verdana">SQL&gt; set feedback off
SQL&gt; set serveroutput on </font></span></pre>
<p>SQL&gt; declare<br />
2 event_level number;<br />
3 begin<br />
4 for event_number in 10000..10999 loop<br />
5 sys.dbms_system.read_ev(event_number, event_level);<br />
6 if (event_level &gt; 0) then<br />
7 sys.dbms_output.put_line(<br />
8 &#8216;Event &#8216; ||<br />
9 to_char(event_number) ||<br />
10 &#8216; is set at level &#8216; ||<br />
11 to_char(event_level)<br />
12 );<br />
13 end if;<br />
14 end loop;<br />
15 end;<br />
16 /<br />
Event 10046 is set at level 1</td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronw.cn/static/20.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle 9i轻松取得建表和索引的DDL语句</title>
		<link>http://www.aaronw.cn/static/19.html</link>
		<comments>http://www.aaronw.cn/static/19.html#comments</comments>
		<pubDate>Fri, 07 Mar 2008 07:03:37 +0000</pubDate>
		<dc:creator>Aaron.wang</dc:creator>
				<category><![CDATA[DB]]></category>

		<guid isPermaLink="false">http://www.aaronw.cn/html/19_oracle-9i%e8%bd%bb%e6%9d%be%e5%8f%96%e5%be%97%e5%bb%ba%e8%a1%a8%e5%92%8c%e7%b4%a2%e5%bc%95%e7%9a%84ddl%e8%af%ad%e5%8f%a5.html</guid>
		<description><![CDATA[我们都知道在9i之前，要想获得建表和索引的语句是一件很麻烦的事。我们通常的做法都是通过export with rows=no来得到，但它的输出因为格式的问题并不能直接拿来用。而另一种方法就是写复杂的脚本来查询数据字典，但这对于一稍微复杂的对象，如IOT和嵌套表等，还是无法查到。　　从数据字典中获得DDL语句是经常要用的，特别是在系统升级/重建的时候。在Oracle 9i中，我们可以直接通过执行dbms_metadata从数据字典中查处DDL语句。使用这个功能强大的工具，我们可以获得单个对象或整个SCHEMA 的DDL语句。最好不过的是因为它使用起来很简单。
　　1、获得单个表和索引DDL语句的方法：
set heading off;
set echo off;
Set pages 999;
set long 90000;
spool get_single.sql
select dbms_metadata.get_ddl(&#8216;TABLE&#8217;,'SZT_PQSO2&#8242;,&#8217;SHQSYS&#8217;) from dual;
select dbms_metadata.get_ddl(&#8216;INDEX&#8217;,'INDXX_PQZJYW&#8217;,'SHQSYS&#8217;) from dual;
spool off;

　　下面是输出。我们只要把建表/索引语句取出来在后面加个分号就可以直接运行了。
SQL&#62; select dbms_metadata.get_ddl(&#8216;TABLE&#8217;,'SZT_PQSO2&#8242;,&#8217;SHQSYS&#8217;) from dual;
　
CREATE TABLE &#8220;SHQSYS&#8221;.&#8221;SZT_PQSO2&#8243;
( &#8220;PQBH&#8221; VARCHAR2(32) NOT NULL ENABLE,
&#8220;ZJYW&#8221; NUMBER(10,0),
&#8220;CGSO&#8221; NUMBER(10,0) NOT NULL ENABLE,
&#8220;SOLS&#8221; VARCHAR2(17),
&#8220;SORQ&#8221; VARCHAR2(8),
&#8220;SOWR&#8221; VARCHAR2(8),
&#8220;SOCL&#8221; VARCHAR2(6),
&#8220;YWHM&#8221; VARCHAR2(10),
&#8220;YWLX&#8221; VARCHAR2(6)
) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
STORAGE(INITIAL 1048576 NEXT [...]]]></description>
			<content:encoded><![CDATA[<p>我们都知道在9i之前，要想获得建表和索引的语句是一件很麻烦的事。我们通常的做法都是通过export with rows=no来得到，但它的输出因为格式的问题并不能直接拿来用。而另一种方法就是写复杂的脚本来查询数据字典，但这对于一稍微复杂的对象，如IOT和嵌套表等，还是无法查到。　　从数据字典中获得DDL语句是经常要用的，特别是在系统升级/重建的时候。在Oracle 9i中，我们可以直接通过执行dbms_metadata从数据字典中查处DDL语句。使用这个功能强大的工具，我们可以获得单个对象或整个SCHEMA 的DDL语句。最好不过的是因为它使用起来很简单。</p>
<p>　　1、获得单个表和索引DDL语句的方法：</p>
<p>set heading off;</p>
<p>set echo off;</p>
<p>Set pages 999;</p>
<p>set long 90000;</p>
<p>spool get_single.sql</p>
<p>select dbms_metadata.get_ddl(&#8216;TABLE&#8217;,'SZT_PQSO2&#8242;,&#8217;SHQSYS&#8217;) from dual;</p>
<p>select dbms_metadata.get_ddl(&#8216;INDEX&#8217;,'INDXX_PQZJYW&#8217;,'SHQSYS&#8217;) from dual;</p>
<p>spool off;<br />
<span id="more-19"></span><br />
　　下面是输出。我们只要把建表/索引语句取出来在后面加个分号就可以直接运行了。</p>
<p>SQL&gt; select dbms_metadata.get_ddl(&#8216;TABLE&#8217;,'SZT_PQSO2&#8242;,&#8217;SHQSYS&#8217;) from dual;</p>
<p>　</p>
<p>CREATE TABLE &#8220;SHQSYS&#8221;.&#8221;SZT_PQSO2&#8243;</p>
<p>( &#8220;PQBH&#8221; VARCHAR2(32) NOT NULL ENABLE,</p>
<p>&#8220;ZJYW&#8221; NUMBER(10,0),</p>
<p>&#8220;CGSO&#8221; NUMBER(10,0) NOT NULL ENABLE,</p>
<p>&#8220;SOLS&#8221; VARCHAR2(17),</p>
<p>&#8220;SORQ&#8221; VARCHAR2(8),</p>
<p>&#8220;SOWR&#8221; VARCHAR2(8),</p>
<p>&#8220;SOCL&#8221; VARCHAR2(6),</p>
<p>&#8220;YWHM&#8221; VARCHAR2(10),</p>
<p>&#8220;YWLX&#8221; VARCHAR2(6)</p>
<p>) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING</p>
<p>STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645</p>
<p>PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)</p>
<p>TABLESPACE &#8220;DATA1&#8243;</p>
<p>SQL&gt; select dbms_metadata.get_ddl(&#8216;INDEX&#8217;,'INDXX_PQZJYW&#8217;,'SHQSYS&#8217;) from dual;</p>
<p>CREATE INDEX &#8220;SHQSYS&#8221;.&#8221;INDXX_PQZJYW&#8221; ON &#8220;SHQSYS&#8221;.&#8221;SZT_PQSO2&#8243; (&#8220;ZJYW&#8221;)</p>
<p>PCTFREE 10 INITRANS 2 MAXTRANS 255</p>
<p>STORAGE(INITIAL 1048576 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645</p>
<p>PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)</p>
<p>TABLESPACE &#8220;DATA1&#8243;</p>
<p>SQL&gt;</p>
<p>SQL&gt; spool off;</p>
<p>　　2、获得整个SCHEMA DDL语句的方法：</p>
<p>set pagesize 0</p>
<p>set long 90000</p>
<p>set feedback off</p>
<p>set echo off</p>
<p>spool get_schema.sql</p>
<p>connect shqsys/shqsys@hawk1;</p>
<p>SELECT DBMS_METADATA.GET_DDL(&#8216;TABLE&#8217;,u.table_name)</p>
<p>FROM USER_TABLES u;</p>
<p>SELECT DBMS_METADATA.GET_DDL(&#8216;INDEX&#8217;,u.index_name)</p>
<p>FROM USER_INDEXES u;</p>
<p>spool off;</p>
<p>　　需要注意的是，当我们的表中有外健（参照约束）时，我们需要判别参照表之间的顺序，确保重建时按照合理的顺序进行。你可以通过查询dba_constraints and dba_cons_columns来确定各表之间的顺序，不再详述。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronw.cn/static/19.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在Oracle中获取磁盘空间的使用情况</title>
		<link>http://www.aaronw.cn/static/18.html</link>
		<comments>http://www.aaronw.cn/static/18.html#comments</comments>
		<pubDate>Fri, 07 Mar 2008 07:02:16 +0000</pubDate>
		<dc:creator>Aaron.wang</dc:creator>
				<category><![CDATA[DB]]></category>

		<guid isPermaLink="false">http://www.aaronw.cn/html/18_%e5%9c%a8oracle%e4%b8%ad%e8%8e%b7%e5%8f%96%e7%a3%81%e7%9b%98%e7%a9%ba%e9%97%b4%e7%9a%84%e4%bd%bf%e7%94%a8%e6%83%85%e5%86%b5.html</guid>
		<description><![CDATA[Select Distinct
SysDate,
s.user# As UserID,
u.name As UserName,
s.ts# As TableSpaceID,
d.tablespace_name As TableSpaceName,
s.FILE# As DataFileID,
d.file_name As DataFileName,
d.bytes As Bytes,
d.maxbytes As MaxBytes,
d.user_bytes As UserBytes,
d.autoextensible As AutoExtensible,
d.increment_by As InCrementBy,
d.status As Status
From sys.seg$ s, sys.user$ u, dba_data_files d
Where s.user# = u.user#
And s.file# = d.file_id;
]]></description>
			<content:encoded><![CDATA[<p>Select Distinct</p>
<p>SysDate,</p>
<p>s.user# As UserID,</p>
<p>u.name As UserName,</p>
<p>s.ts# As TableSpaceID,</p>
<p>d.tablespace_name As TableSpaceName,</p>
<p>s.FILE# As DataFileID,</p>
<p>d.file_name As DataFileName,</p>
<p>d.bytes As Bytes,</p>
<p>d.maxbytes As MaxBytes,</p>
<p>d.user_bytes As UserBytes,</p>
<p>d.autoextensible As AutoExtensible,</p>
<p>d.increment_by As InCrementBy,</p>
<p>d.status As Status</p>
<p>From sys.seg$ s, sys.user$ u, dba_data_files d</p>
<p>Where s.user# = u.user#</p>
<p>And s.file# = d.file_id;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronw.cn/static/18.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ORACLE笔记</title>
		<link>http://www.aaronw.cn/static/17.html</link>
		<comments>http://www.aaronw.cn/static/17.html#comments</comments>
		<pubDate>Fri, 07 Mar 2008 07:01:16 +0000</pubDate>
		<dc:creator>Aaron.wang</dc:creator>
				<category><![CDATA[DB]]></category>

		<guid isPermaLink="false">http://www.aaronw.cn/html/17_oracle%e7%ac%94%e8%ae%b0.html</guid>
		<description><![CDATA[Oracle SQL(Oracle 9i 9.2.0.1.0)
SQL(结构化查询语言)，是操作关系型数据库中的对象。
DDL（数据定义语言），用于建表或删表操作，以及对表约束进行修改。
DML（数据操作语言），向表中插入纪录，修改纪录。
事务控制语言，commit; rollback;
授权语句
select（数据的查询），投影，过滤（选择）查寻，关联查寻（表连接）。
sqlplus 访问数据库命令（本地访问/远程访问），和数据库建立连接的命令，是数据库操作的环境
sqlplus 用户名/密码
show user 显示当前用户的用户名
在sqlplus中可以使用 ! 可以在shell和sqlplus间切换，!shell命令 可以在sqlplus中使用shell命令。实际上是sqlplus开了子进程来执行shell命令。
Oracle数据库中的表分两类：用户表（用户使用操作的表），系统表（数据库系统维护的表，数据字典）

select查询语句
select table_name from user_tables;（查询系统表）
以上的查询语句就是查询本用户下所拥有的所有表的表名。
desc [表名] 这是一条sqlplus命令，注意他不是sql语句，这条命令用于查看表的结构。
[字段名] [字段的类型]，这是使用完desc命令后显示的表结构。
投影操作，只查看选择的字段的信息。
选择操作，查看字段中的特定某些信息。
多表查询，通过表间连接，查寻出多表中的信息
!oerr ora [错误号] ，系统可以显示错误的原因和如何修改。
如果命令错误输入可以使用edit或ed来修改输入错误。实际上是在编辑缓存文件中的最后一条sql语句。也可以使用 (change) c /错误字段/正确字段，来进行替换操作进行修改。
select [表的字段名1],[表的字段名2], &#8230; from 表名;
select * from 表名; 查寻表中所有字段的信息
关键字不等拆分，sql语句，以及表名，字段名是大小写不敏感的。
sql语句要以&#8221;；&#8221;结尾，来表示sql语句结束，如果不加&#8221;；&#8221;系统不会执行此条sql语句，并提示。
sqlplus的buffer中会缓存最后一条sql语句，可以使用&#8221;/&#8221;来执行这最后一条sql语句，也可以使用
edit命令来编辑最后一条sql语句。l命令（list）（sqlplus命令）可以显示buffer中最后一条命令。
sqlplus设置
set pause on 回车响应，分屏显示，只在本会话中有效
set pause off 关闭分屏显示。
set pause &#8216;&#8230;&#8217; 设置分屏显示的提示信息。
set pause on 先输出提示信息，回车响应，分屏显示
set head off 提头输出关闭
set feed off 结尾输出关闭
set echo off 回写关闭
spool 文件名.sql 写入指定文件
spool [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Oracle SQL(Oracle 9i 9.2.0.1.0)</strong></p>
<p><strong>SQL(</strong><strong>结构化查询语言)</strong><strong>，是操作关系型数据库中的对象。</strong></p>
<p><strong>DDL</strong><strong>（数据定义语言），用于建表或删表操作，以及对表约束进行修改。</strong></p>
<p><strong>DML</strong><strong>（数据操作语言），向表中插入纪录，修改纪录。</strong></p>
<p><strong>事务控制语言，commit; rollback;</strong></p>
<p><strong>授权语句</strong></p>
<p>select（数据的查询），投影，过滤（选择）查寻，关联查寻（表连接）。</p>
<p>sqlplus 访问数据库命令（本地访问/远程访问），和数据库建立连接的命令，是数据库操作的环境</p>
<p>sqlplus 用户名/密码</p>
<p>show user 显示当前用户的用户名</p>
<p>在sqlplus中可以使用 ! 可以在shell和sqlplus间切换，!shell命令 可以在sqlplus中使用shell命令。实际上是sqlplus开了子进程来执行shell命令。</p>
<p>Oracle数据库中的表分两类：用户表（用户使用操作的表），系统表（数据库系统维护的表，数据字典）<br />
<span id="more-17"></span><br />
<strong>select</strong><strong>查询语句</strong></p>
<p>select table_name from user_tables;（查询系统表）</p>
<p>以上的查询语句就是查询本用户下所拥有的所有表的表名。</p>
<p>desc [表名] 这是一条sqlplus命令，注意他不是sql语句，这条命令用于查看表的结构。</p>
<p>[字段名] [字段的类型]，这是使用完desc命令后显示的表结构。</p>
<p><strong>投影操作</strong>，只查看选择的字段的信息。</p>
<p><strong>选择操作</strong>，查看字段中的特定某些信息。</p>
<p><strong>多表查询</strong>，通过表间连接，查寻出多表中的信息</p>
<p><strong>!oerr ora [</strong><strong>错误号] </strong>，系统可以显示错误的原因和如何修改。</p>
<p>如果命令错误输入可以使用edit或ed来修改输入错误。实际上是在编辑缓存文件中的最后一条sql语句。也可以使用 (change) c /错误字段/正确字段，来进行替换操作进行修改。</p>
<p>select [表的字段名1],[表的字段名2], &#8230; from 表名;</p>
<p>select * from 表名; 查寻表中所有字段的信息</p>
<p>关键字不等拆分，sql语句，以及表名，字段名是大小写不敏感的。</p>
<p>sql语句要以&#8221;；&#8221;结尾，来表示sql语句结束，如果不加&#8221;；&#8221;系统不会执行此条sql语句，并提示。</p>
<p>sqlplus的buffer中会缓存最后一条sql语句，可以使用&#8221;/&#8221;来执行这最后一条sql语句，也可以使用</p>
<p>edit命令来编辑最后一条sql语句。l命令（list）（sqlplus命令）可以显示buffer中最后一条命令。</p>
<p><strong>sqlplus</strong><strong>设置</strong></p>
<p>set pause on 回车响应，分屏显示，只在本会话中有效</p>
<p>set pause off 关闭分屏显示。</p>
<p>set pause &#8216;&#8230;&#8217; 设置分屏显示的提示信息。</p>
<p>set pause on 先输出提示信息，回车响应，分屏显示</p>
<p>set head off 提头输出关闭</p>
<p>set feed off 结尾输出关闭</p>
<p>set echo off 回写关闭</p>
<p>spool 文件名.sql 写入指定文件</p>
<p>spool off 关闭写入。</p>
<p><strong>清屏命令</strong> !clear 或 clear screen</p>
<p>在Oracle中字符显示是左对齐，数值右对齐。</p>
<p>在select 语句中可以使用数学表达式。</p>
<p>select [表达式（必须包含本表字段名）],[...],&#8230;. from 表名；</p>
<p>运算的优先级的先乘除后加减，同级自左向右运算，括号改变优先级。</p>
<p>select [字段名或表达式] ["别名"]，[...] ["..."],&#8230;. from 表名；</p>
<p>可以通过在字段名或表达式后加空格&#8221;别名&#8221;，可以给列，或者表达式结果其别名。</p>
<p>字符串拼接使用||符号</p>
<p>select 目标字段名||&#8221; &#8220;||目标字段名 from 表名；</p>
<p>注意：在Oracle中的字符串要用&#8217;..&#8217;包含</p>
<p>别名中需要使用空格，或是大小写敏感时需要用&#8221;..&#8221;包含。</p>
<p><strong><span style="font-size: 12pt">sql</span></strong><strong>脚本</strong>，也就是在文件中写有sql语句的文件，可以在sqlplus中运行,推荐为.sql。</p>
<p>引入sql脚本: sqlplus 用户名/密码 @sql脚本(注意@前一定要有空格,否则含义就变了)</p>
<p>Oracle中的空值 空值会当无穷大处理。</p>
<p>Oracle中控制处理函数 NVL(字段名，值)，这个字段中的空值替换为指定值，如果不为空，则会返回其原值。</p>
<p>例：select (salary*12)*(NVL(commission_pct,0)/100+1) salary,first_name from s_emp;</p>
<p><strong>distinct</strong><strong>关键字</strong>，去掉重复行（这个关键字会处发排序操作）</p>
<p>例： select distinct dept_id,title from s_emp;</p>
<p>注意：distinct，关键字之后会对from之前的字段进行排重操作。</p>
<p><strong>column</strong><strong>命令</strong>（这是个sqlplus命令）</p>
<p>column命令 列格式的定义</p>
<p>column 目标列名 查看这个类是否定义了格式</p>
<p>column 目标列名 format a.. 设置列宽。</p>
<p>column last_name heading &#8216;Employee|Name&#8217;（设置题头） FORMAT A15</p>
<p>这其中的&#8217;|'是换行符</p>
<p>column salary justify left format $99,990.00（定义数字显示格式）</p>
<p>注意：如果不满足显示的格式，就会把数据显示为&#8221;#&#8221;</p>
<p>column 列名 clear （清除列格式定义）</p>
<p>注意：只有sqlplus命令才有简写，并且在使用sqlplus命令时结尾也不能加分号。</p>
<p><strong>选择操作</strong></p>
<p><strong>order by</strong> 排序子句 ASC（默认，升序） DESC（降序）</p>
<p>order by 目标列名（别名） 排序顺序（不写排序顺序，会默认为升序排序）</p>
<p>例：select first_name from s_emp order by first_name;</p>
<p><span>    select first_name from s_emp order by first_name desc;</span></p>
<p>注意：升序空值在结果的末尾，降序空值在结果的最前面。</p>
<p><strong>where</strong><strong>子句</strong></p>
<p>where子句使用在 select &#8230; from &#8230; 后面，用来选择所需（符合条件的）的记录</p>
<p>where后面跟的是表达式 也就是 XXX=XXX， XXX between X and X ，XXX in（X，X，X）</p>
<p>like &#8216;&#8230;&#8217; 通配查询</p>
<p>between &#8230; and &#8230; ,表示结果在这之间，between and是一个闭区间。</p>
<p>!=，&lt;&gt;，^=，这三个都标识不等于，&lt;=，&gt;=，=，这些运算符都可以使用。</p>
<p>&#8230; in (va1,val2,&#8230;) 判断结果是否在这个枚举中存在</p>
<p>like &#8216;&#8230;&#8217; 字符串通配查询，&#8217;%'表示多个字符，&#8217;_'，表示一个字符。</p>
<p>&#8230; and &#8230; 表示只有两个条件同时满足</p>
<p>&#8230; or &#8230; 表示条件只要满足其中只一就可以</p>
<p>all &#8230; 是要求都满足条件。</p>
<p>not &#8230;..，则是可以与以上的条件产生反效果。</p>
<p>&#8230; is null 使用来判断值是不是空。</p>
<p>注意：Oracle中的字符串是严格区分大小写的。</p>
<p>1.注意数据类型</p>
<p>2.选择合适的运算符</p>
<p><strong>Oracle</strong><strong>数据库函数（单行函数）</strong></p>
<p>Oracle中的函数和C中的函数差不多，也是有函数名，参数表，和返回值类型组成的</p>
<p>1,字符函数</p>
<p><span>   </span>字符是大小写敏感的</p>
<p><span>   </span>转小写 lower(&#8230;)</p>
<p><span>   </span>转大写 upper(&#8230;)</p>
<p><span>   </span>首字母大写 initcap(&#8230;)</p>
<p><span>   dual</span>表，是专门用于函数测试和运算的，他只有一条记录<span>      </span></p>
<p><span>   </span>字符串拼接 concat(&#8230;,&#8230;.)</p>
<p><span>   </span>求指定子串 substr(&#8230;,起始位置，取字符个数)</p>
<p><span>   </span>可以使用&#8221;-&#8221;表示从右向左取，取的时候可以从左往友取。</p>
<p><span>    </span>例：select substr(first_name,-2,2) sub from s_emp;（取后两个）</p>
<p><span>       select substr(first_name,2,2) sub from s_emp;</span>（取前两个）</p>
<p>2,数值函数</p>
<p><span>   </span>四舍五入 round(数据,保留小数点后几位)</p>
<p><span>   </span>可以用负数表示小数点前，0，表示小数点后第一位，也就是保留个位，-1表示个位（保留到十<span>   </span>位）。</p>
<p><span>   </span>例：select round(15.36,1) from dual;</p>
<p><span>   </span>截取数字函数 trunc(数据，保留的位数（小数点后位数）) 截取个位之后补0</p>
<p><span>   </span>例：select trunc(123.456,1) from dual;</p>
<p>3，日期函数</p>
<p><span>   </span>日期格式，</p>
<p><span>   </span>全日期格式 世纪信息，年月日，时分秒。</p>
<p><span>   </span>缺省日期格式，日-月-年 dd-mon-rr</p>
<p><span>   </span>修改当前会话的日期格式，会按照指定的格式输出日期</p>
<p><span>   alter session set nls_date_format=&#8217;yyyy mm dd hh24:mi:ss&#8217;;</span></p>
<p><span>   </span>返回当前日期 sysdate</p>
<p><span>   </span>例：select sysdate from dual;</p>
<p><span>   </span>日期是格式敏感的</p>
<p><span>   </span>求两个日期间相隔了多少个月 months_between(date1,date2)</p>
<p><span>   </span>加减指定数量的月份 add_months(date,月数)，月数可以为负，负值就是减去相应的月数。</p>
<p><span>   </span>从下周开始的日期加一天 next_day(date,天数)</p>
<p><span>   </span>例：select next_day(sysdate,2) from dual;</p>
<p><span>   </span>返回月末的日期 last_day(date)</p>
<p><span>   </span>截取日期 trunc(date,&#8217;年或月或日或时分秒&#8217;)</p>
<p><span>   </span>例：select trunc(add_months(sysdate,1),&#8217;month&#8217;) from dual;</p>
<p>4，不同数据类型间转换函数</p>
<p><span>   </span>将日期转成字符 tochar(date,&#8217;日期格式&#8217;)</p>
<p><span>   </span>日期格式要用有效格式，格式大小写敏感 &#8216;yyyy mm dd hh24:mi:ss&#8217;,'year&#8217;(全拼的年),&#8217;mm&#8217;(数字表示的月) &#8216;month&#8217;(全拼的月)，&#8217;day&#8217;(星期的全拼)，&#8217;ddspth&#8217; (日期的全拼) &#8216;yy mm dd&#8217;</p>
<p><span>   </span>例：select to_char(sysdate,&#8217;yyyy mm dd hh24:mi:ss&#8217;)from dual;</p>
<p><span>   </span>将字符转换成数字 to_number(&#8216;&#8230;&#8217;)</p>
<p><span>   </span>将数字转字符to_char(number，&#8217;fmt&#8217;) fmt是数字格式</p>
<p><span>   </span>将字符串转成日期 to_date(&#8216;&#8230;&#8217;,'日期格式&#8217;)</p>
<p><span>   </span>例：select to_char(to_date(&#8216;2006 11 03&#8242;,&#8217;yyyy mm dd&#8217;),&#8217;dd-month-yy&#8217;) from dual；</p>
<p>5，函数嵌套</p>
<p style="text-indent: 21.75pt">例：select to_char(to_date(&#8216;2006 11 03&#8242;,&#8217;yyyy mm dd&#8217;),&#8217;dd-month-yy&#8217;) from dual；</p>
<p><strong>表连接（关联查寻）</strong></p>
<p>如果多表查询时不加where子句，也就是过滤条件或者是使用了无效的条件，就会产生两表之间记录的相互逐条匹配（组合），产生很多无效的结果（笛卡尔积）。</p>
<p>注意：在使用表连接时，要注意查询的表间的关系信息，表之间的字段所表示的信息的关系</p>
<p>等值连接</p>
<p> select [表别名1.字段名1]，[表别名2.字段名2],&#8230;</p>
<p> from 表1 表别名1 ，表2 表别名2</p>
<p> where 表别名1.字段名3=表别名2.字段名4;</p>
<p> 表连接时，当表与表之间有同名字段时，可以加上表名或表的别名，加以区分，使用时要用</p>
<p>表名.字段名或表别名.字段名（列名）。当表的字段名是唯一时，可以不用加上表名或表的别名。</p>
<p>注意：当为表起了别名，就不能再使用表名.字段名</p>
<p>例：select a.first_name,a.last_name,b.name from s_emp a,s_dept b where a.dept_id=b.id;</p>
<p><strong>非等值连接</strong></p>
<p> select [表别名1.字段名1]，[表别名2.字段名2],&#8230;</p>
<p> from 表1 表别名1 ，表2 表别名2</p>
<p> where 表别名1.字段名3 &#8230;.. 表别名2.字段名4</p>
<p> &#8230;.可以使比较运算符，也可以使其他的除了&#8217;='的运算符</p>
<p>例：select e.ename, d.grade,e.sal from emp e,salgrade d where e.sal between d.losal and d.hisal;</p>
<p><strong>自连接</strong> 用别名把一张表中的数据分成两部分，然后在使用条件过滤。</p>
<p> select [表别名1.字段名1]，[表别名2.字段名2],&#8230;</p>
<p> from 表1 表别名1 ，表1 表别名2</p>
<p> where 表别名1.字段名3=表别名2.字段名4;</p>
<p>例：select a.first_name ename,b.first_name cname from s_emp a,s_emp b where a.manager_id=b.id;</p>
<p>以上所提到的表连接，都叫做<strong>内连接。</strong></p>
<p><strong>外连接</strong> 会使用一方表中的所有记录去和另一格表中的记录按条件匹配，空值也会匹配，这个表中的所有记录都会显示，数据库会模拟出记录去和那些不匹配的记录匹配。</p>
<p>例：select a.first_name enamei,a.id,b.first_name cname,b.id from s_emp a,s_emp b where a.manager_id=b.id(+);</p>
<p>注意：要把那一方的记录全部都显示出来，还有注意条件(+)跟在要全部显示的那个表的字段后。</p>
<p><strong>组函数</strong></p>
<p>group 组</p>
<p>group by 分组子句，按指定的分组规则分组 ，这个group by 子句可以跟在 select 语句后或是 having后面。group by子句也会出发排序操作，会按分组字段排序。</p>
<p>select [组函数或分组的字段名] ，&#8230; from 表名 group by [字段名1],[字段名2],&#8230;..；</p>
<p>例：select avg(salary) from s_emp group by dept_id;</p>
<p>注意：组函数可以处理一组数据，返回一个值。组函数会忽略空值。count()除外，他会把空记录也记录在内。</p>
<p>avg(..),求平均值，sum(..),求和 这两个函数的参数只能是number型的。</p>
<p>以下所提到的函数可以使用任意类型做参数。</p>
<p>count(..)，用来统计记录数，可以使用排重命令。count(&#8230;)默认使用的是all。</p>
<p>max(..),min(..)求最大值和最小值，</p>
<p>count(*),统计表中记录数。</p>
<p>例：select max(b.name),avg(a.salary), max(c.name) from s_emp a,s_dept b,s_region c where a.dept_id=b.id and b.region_id=c.id group by b.id;</p>
<p>注意：只要写了group by子句，select后就只能用group by后的字段或者是组函数。</p>
<p><span>      where</span>子句只能够过滤记录。</p>
<p>having子句可以过滤组函数结果或是分组的信息，且写在group by子句后。</p>
<p>例:</p>
<p> select max(b.name),avg(a.salary), max(c.name) from s_emp a,s_dept b,s_region c where a.dept_id=b.id and b.region_id=c.id group by b.id having sum(a.salary)&gt;4000;</p>
<p>column 也可以定义有别名的列的格式。</p>
<p>column &#8220;别名&#8221; 格式定义</p>
<p>注意：要先过滤掉不需要的记录，然后再进行分组操作，提高效率。</p>
<p><strong>子查询</strong></p>
<p>子查询，就是可以嵌在任何的sql语句中的select语句。</p>
<p>在select语句中嵌套子查询时，会先执行子查询。一般的会将子查询放在运算符的右边。</p>
<p>注意：在使用子查询时，要注意这个运算符是单行的（也就是只能是单值），还是多行运算符（范围，多值）。配合使用子查询返回的结果必须符合运算符的用法。</p>
<p>例:</p>
<p>select first_name,title from s_emp where title=any(select title from s_emp where last_name=&#8217;Smith&#8217;) and upper(last_name)!=&#8217;SMITH&#8217;;</p>
<p>select first_name,title from s_emp where title in (select title from s_emp where last_name=&#8217;Smith&#8217;) and upper(last_name)!=&#8217;SMITH&#8217;;</p>
<p><strong>数据库设计</strong></p>
<p>数据库表设计，把业务需求转换成可操作的表。</p>
<p>1，需求分析，了解客户的业务需求（业务技能）。</p>
<p>2，设计，通过ER图（实体关系图）</p>
<p>3，建表</p>
<p>4，测试</p>
<p>5，形成产品</p>
<p><strong>ER</strong><strong>图</strong></p>
<p>将一类事物的共性抽象处来成为一个实体，并且表现出来实体间的关系。</p>
<p>unique identifier 唯一的值</p>
<p>primary with<span>     &#8216;#*&#8217; </span>唯一且非空</p>
<p>indispensable 必要的（也就是要求必须非空）</p>
<p><strong>实体关系</strong></p>
<p>one to one 一对一关联，one to many 一对多关联，many to many 多对多关联</p>
<p>反射关联，自身的属性之间的关联</p>
<p><strong>ER</strong><strong>图转换成表</strong></p>
<p><strong>第一范式</strong>，所有的属性都必须是单值，也就是属性只表示单一的意义。（记录可以重复，没有任何限制）</p>
<p><strong>第二范式</strong>，属性要求唯一且非空，（记录不可重复，但是数据可能会出现冗余）。</p>
<p><strong>第三范式</strong>，非主属性只能依赖于主属性，不能依赖于其他非主属性。（解决数据冗余问题）</p>
<p><strong><span style="font-size: 12pt">约束</span></strong></p>
<p>约束是针对表中的字段进行定义的。</p>
<p><strong>primary key</strong> （主键约束 PK）保证实体的完整性，保证记录的唯一</p>
<p>主键约束，唯一且非空，并且每一个表中只能有一个主键，有两个字段联合作为主键，只有两个字段放在一起唯一标识记录，叫做联合主键。</p>
<p><strong>foreign key </strong>（外建约束 FK）保证引用的完整性，</p>
<p>外键约束，外键的取值是受另外一张表中的主键或唯一值得约束，不能够取其他值，只能够引用主键会唯一键的值，被引用的表，叫做parent table（父表），引用方的表叫做child table（子表），要想创建子表，就要先创建父表，后创建子表，记录的插入也是如此，先父表后子表，删除记录，要先删除子表记录，后删除父表记录，要修改记录，如果要修改父表的记录要保证没有被子表引用。要删表时，要先删子表，后删除父表。</p>
<p><strong>unuque key</strong>（唯一键），值为唯一</p>
<p>index（索引）是数据库特有的一类对象，view（视图）</p>
<p>典型的一对多 class 对应多个学生。</p>
<p>student table<span>                      class table </span></p>
<p> ______________________________<span>     _________________________</span></p>
<p>| id | name | address| class_id|<span>   | id |class_desc|class_num|</span></p>
<p>|(PK)|______|________|___(FK)__|<span>   |(pk)|__________|_________|</span></p>
<p>|<span>    |      |        |         |   |    |          |         |</span></p>
<p><strong>一对一</strong></p>
<p>student tabel<span>             shenfenzheng table</span></p>
<p> ____________________<span>     _________________________________</span></p>
<p>| id | name | address|<span>   | s_id |shenfen_desc|shenfen_num|</span></p>
<p>|(PK)|______|________|<span>   |(PK</span>，FK)|____________|___________|</p>
<p>|<span>    |      |        |   |        |            |           |</span></p>
<p><strong>多对多</strong></p>
<p>student tabel<span>             zhongjian table                      kecheng table</span></p>
<p> ____________________<span>     _________________________________    __________________</span></p>
<p>| id | name | address|<span>   | s_id |shenfen_desc|shenfen_num| | kid | kechengname|</span></p>
<p>|(PK)|______|________|<span>   |(FK</span>，FK)|____________|___________| | (PK)|____________|</p>
<p>|<span>    |      |        |   |</span>联合主键|<span>            |           | |     |            |</span></p>
<p>引用对方表的主键,当作本身的主键,所以这个表的主键,既是主键又是外建</p>
<p>建表和其他相关操作</p>
<p><strong><span style="font-size: 12pt">DDL</span></strong><strong><span style="font-size: 12pt">语句</span></strong></p>
<p><strong>创建表：</strong></p>
<p><span>   create    table </span>表名<span>   (    </span>字段名1<span>    </span>类型(数据长度)(default &#8230;)<span>   </span>约束条件，<span>   </span>字段名2<span>    </span>类型(数据长度)<span>    </span>约束条件 );</p>
<p><strong>Oracle</strong><strong>数据库中的数据类型</strong></p>
<p>varchar(长度)，可变长字符串，char(长度) 定长</p>
<p>number(..,..),number 表示浮点数，或者是整数</p>
<p>long 大对象，clog 字符的大对象，相当于文本文件在表中只存放一个相当于只针对值</p>
<p><span>             blog </span>二进制的大对象，也是以相当于指针的形式存放的。</p>
<p>primary key约束：</p>
<p>主键约束的定义：</p>
<p>第一种定义形式：</p>
<p>create table<span>   test(c number primary key );     </span>列级约束</p>
<p>第二种定义形式：</p>
<p>create table test(c number , primary key(c) ) ; 表级约束</p>
<p>create table<span>   test( c1 number constraints   pkc1 primary key );   </span>此约束有名字: pkc1</p>
<p>create table<span>   test(c number , c2 number , primary key (c ,c1) ); </span>用表级约束可以实现联合主键</p>
<p>foregin key<span>   (fk)   </span>外键约束:</p>
<p>(先定义父表，再定义子表）</p>
<p>carete<span>   table     parent(c1 number primary key );</span></p>
<p>create<span>   table    child (c number primary key ,   c2 number references parent(c1));</span></p>
<p>或表级约束定义:</p>
<p>create<span>   table child( c number primary key , c2 number , foreign key(c2) references parent(c1));</span></p>
<p><strong>约束</strong></p>
<p>非空约束（not null）这是一个列级约束</p>
<p>在建表时,在数据类型的后面加上 not null ，也就是在插入时不允许插入空值。</p>
<p>例：create table student(id number primary key,name varchar2(32) not null,address varchar2(32));</p>
<p>unique 唯一约束</p>
<p>唯一约束，是会忽略空值的，唯一约束，要求插入的记录中的值是为一的。</p>
<p>例：create table student(id number，name varchar2(32),address varchar2(32),primary key (id),unique (address));</p>
<p>check约束</p>
<p>检查约束，可以按照指定条件，检查记录的插入。check中不能使用尾列，不能使用函数，不能引用其他字段。</p>
<p>例：create table sal (a1 number , check(a1&gt;1000));</p>
<p>创建脚本<span>   </span>例：见课本相应章节</p>
<p><strong>一对一建表语句</strong></p>
<p>student table</p>
<p>create table student(</p>
<p><span>       id number,</span></p>
<p><span>       name varchar2(32),</span></p>
<p><span>       address varchar2(32)</span></p>
<p><span>       primary key(id)</span></p>
<p>);</p>
<p>shenfenzheng table</p>
<p>create tabel shenfenzheng(</p>
<p><span>       sid number primary key, </span></p>
<p><span>       num number unique not null,</span></p>
<p><span>       foreign key (sid) references student(id)</span></p>
<p>);</p>
<p><strong>一对多</strong></p>
<p>class table</p>
<p>一</p>
<p>create table class(</p>
<p><span>        cid number,</span></p>
<p><span>        class_num number,</span></p>
<p><span>        desc varchar2(32),</span></p>
<p><span>        primary key(cid)</span></p>
<p>);</p>
<p>student table</p>
<p>多</p>
<p>create table student(</p>
<p><span>       id number,</span></p>
<p><span>       name varchar2(32),</span></p>
<p><span>       address varchar2(32)</span></p>
<p><span>       class_id number,</span></p>
<p><span>       primary key(id),foreign key (class_id) references class(cid)</span></p>
<p>);</p>
<p><strong>数据字典</strong></p>
<p>数据字典是由系统维护的，包含的数据库的信息</p>
<p>数据字典视图</p>
<p>user_XXXXX 用户视图</p>
<p>all_XXXXX 所有视图</p>
<p>dba_XXXXX 数据库中所有视图</p>
<p>v$_XXXXX<span>   </span>动态性能视图</p>
<p>dist或 distionary 表示数据字典的数据字典。</p>
<p>user_constraints 用户的表中约束的表</p>
<p>其中有constraints_name字段存放的是约束名，r_constraints_name字段表示外键引用子何处</p>
<p>这两个字段之间有自连接的关系，也就是约束名和外键约束名之间的自连接。</p>
<p>user_cons_column表，是用户的列级约束表</p>
<p><strong><span style="font-size: 12pt">DML</span></strong><strong><span style="font-size: 12pt">操作</span></strong></p>
<p><strong>insert</strong><strong>操作，插入记录</strong></p>
<p>insert into 表名 values(值1，值2，&#8230;&#8230;);</p>
<p>注意这种方法插入记录时，要对所有字段进行插入，没有非空约束时，又不想插入值时，要用空值替代，并且要按照字段的顺序插值（要清楚表结构），且要注意数据类型一致。</p>
<p>insert into 表名(字段名1，字段名2，&#8230;..) values(值1，值2，&#8230;&#8230;);</p>
<p>这种方法可以对指定的字段进行插入，不想插值的就可以不写，前提是该字段没有非空约束。</p>
<p>例：insert into student values(1,&#8217;xxx&#8217;,'xxx&#8217;);</p>
<p><span>    insert into student(id,name,address) values(1,&#8217;xxx&#8217;,'xxx&#8217;);</span></p>
<p><strong>update</strong><strong>修改操作</strong></p>
<p>update table 表名 set 字段名1=数据1或表达式1， 字段名2=数据2或表达式2</p>
<p>[where ....=....];</p>
<p>例：update shenfenzhen set num=99 where sid=2;</p>
<p><strong>delete</strong><strong>删除操作</strong></p>
<p>delete from 表名 [where ...=...];</p>
<p>例：update shenfenzhen set num=99 where sid=2;</p>
<p>用delete操作删除的记录可以通过 rollback命令回滚操作，会恢复delete操作删除的数据。</p>
<p>delete操作不会释放表所占用的空间，delete不是和删除记录多的大表。delete操作会占用大量的系统资源。</p>
<p><strong>事务transaction</strong></p>
<p><strong>OLTP</strong>（<strong>联机事务处理</strong> OnLine Transaction Process）</p>
<p>原子操作，也就是不可分割的操作，必须一起成功一起失败。</p>
<p>要是实现一个原子操作，就要把这个原子操作（操作数据库数据(DML操作)）放在事务中。</p>
<p>事务的结束动作 就是commit;语句 rollback;语句，DDL，DCL语句执行会自动提交commit;。</p>
<p>sqlplus正常退出是会做提交动作的commit;，当系统异常推出是，会执行回滚操作rollback;。</p>
<p>事务的开始，一个事务的开始就是上一个事务的结束。</p>
<p>一个没有结束的事务，叫做活动的事务 (active transaction),活动的事务中修改的数据，只有本会话才能看见。</p>
<p>readcommited，只可以读取已经作提交操作的数据，本会话可以看到自己的所作的没有提交的操作。</p>
<p>在活动事务中，当多个用户同时对同一张表进行操作时，会对表加上表级共享锁，当用户对操作该表某一条记录进行操作时会对该条记录加上行级排它锁，只允许一个用户对该条记录进行DML操作，只有提交操作commit;或回滚操作rollback;时，才可让其他用户操作对该记录进行DML操作，也就是释放了该条记录的行级排它锁。如果没有提交操作或回滚操作，那么该用户就不能对该条记录加锁，该用户的DML操作就会进入等待状态，但是在对表作 drop操作（DDL操作）时，如果还有用户在操作该表，也就是没有释放表级共享锁，就会直接报错。</p>
<p>事务越大，就会消耗更多的资源，并长时间持有事务会造成无法进行其他的操作，事物提交太频繁的话，会对I/O造成很大的负担，所以要合理确定事务的大小。</p>
<p><strong>commit</strong>;提交操作，事物的结束</p>
<p><strong>rollback</strong>;回滚操作，会将先前的活动事务中的操作（DML操作）的结果进行回滚，撤销全部操作，恢复成事务开始时的数据，也就是恢复成事务开始时的状态。</p>
<p><strong>alter table</strong><strong>命令</strong></p>
<p>alter table 命令用于修改表的结构(这些命令不会经常用)：</p>
<p>增加字段：</p>
<p>alter table 表名　add(字段字，字段类型)</p>
<p>删除字段<strong>：</strong></p>
<p>alter tbale 表名 drop column 字段; (8i 以后才支持)</p>
<p>给列改名:9.2.0才支持</p>
<p>alter table 表名 rename column 旧字段名 to 新字段名;</p>
<p>修改字段</p>
<p>alter table 表名 modify( 字段，类型)</p>
<p>(此时应注意的问题，更改时要看具体值情况之间的转达换，　改为字符类型时，必须要为空)</p>
<p>not null约束是使用alter table .. modify (..,not null)，来加上的。</p>
<p>增加约束：</p>
<p>alter table 表名 add constraint [约束名] 约束(字段);</p>
<p>只能够增加表级约束。</p>
<p>解除约束：(删除约束)</p>
<p>alter table 表名 drop 约束;</p>
<p>（对于主键约束可以直接用此方法，因为一张表中只有一个主键约束名, 注意如果主键此时还有其它表引用时删除主键时会出错）</p>
<p>alter table father drop primary key cascade; </p>
<p>(如果有子表引用主键时，要用此语法来删除主键,这时子表还存在只是子表中的外键约束被及联删除了）</p>
<p>alter table 表名 drop constraint 约束名;</p>
<p>(怎样取一个约束名：</p>
<p>a、人为的违反约束规定根据错误信息获取!</p>
<p>b、查询视图获取约束名!)</p>
<p>使约束失效或者生效</p>
<p>alter table 表名 disable from primary key; (相当于把一个表的主键禁用)</p>
<p>alter table 表名 enable primary key;</p>
<p>（enable 时会自动去检查表的记录是不是符合要求,如果有脏数据时必须要先删除脏数据才可以 enable）</p>
<p><strong>更改表名</strong></p>
<p>rename 旧表名 to 新表名;</p>
<p><strong>删除表</strong>：</p>
<p>trucate table 表名;</p>
<p>(表结构还在，数据全部删除，释放表所占的空间，不支持回退,常用删除大表)</p>
<p>关于oralce中产生序列(sequence)</p>
<p>create sequence 序列名;</p>
<p>(不带参数时默认为从1 开始每次递增 1，oracle中为了提高产生序列的效率一般一次性产生20个序列放入当前会话的序列池中备用以加快效率，序列会出现不连续的动作回退操作不会影响序列取值)</p>
<p><strong><span style="font-size: 12pt">sequence</span> </strong>的参数：</p>
<p>increment by n<span>   </span>起始值</p>
<p>start with n<span>     </span>递增量</p>
<p>maxvalue n<span>       </span>最大值 </p>
<p>minvalue n<span>       </span>最小值</p>
<p>cycle|no cycle<span>   </span>轮回 </p>
<p>cache n<span>          </span>缓存(第一次取时会一次取多少个id存起来)</p>
<p>查看sequence 视图：</p>
<p>desc<span>    user_sequences ;</span></p>
<p>select<span>   sequence_name , cache_size , last_number from user_sequences   where   sequence_name like &#8217;s_&#8217;;</span></p>
<p>select 序列名.currval from<span>   dual    </span>查看当前的序列数</p>
<p>select 序列名.nextval  from<span>   dual    </span>查看下一个序列数，它会自动给当前的序列加１</p>
<p>为列：nextval<span>          currval</span></p>
<p>(开另一个session时取当前值不成功时，应该先取下一个值，再取当前值)</p>
<p>清空当前会话的内存：</p>
<p>alter system flush<span>   shared_pool;</span>（执行此命令要有DBA权限，一般用户执行出错）</p>
<p>修改序列：(此命令不常用，只需了解就行不必深究)</p>
<p>alter sequence 序列名 修改项；</p>
<p>删除序列sequence</p>
<p>drop sequence 序列名;</p>
<p><strong>视图</strong></p>
<p>创建视图：</p>
<p>creating views 视图名;</p>
<p>视图就相当于一条select 语句,定义了一个视图就是定义了一个sql语句,视图不占空间,使用view 不会提高性能，但是能简单化sql语句</p>
<p>（扩展知识： oracle 8i 以后的新视图）</p>
<p>MV 物化视图(占存储空间，把select 结果存在一个空间，会提高查询视图,增强实时性，但是存在刷新问题，物化视图中的数据存在延迟问题，主要应用在数据仓库中用要用于聚合表)</p>
<p>使用视图的好处：控制数据访问权限。</p>
<p>如何创建一个视图的例子：</p>
<p>create or replace views test_vi as select * from test1 where c1=1;</p>
<p>or replace的意义，如果view存在就覆盖，不存在才创建。</p>
<p>force|no force ，基表存在是使用，不存在是则创建该表。</p>
<p>此时往表test1（base table 基表）中插入数据时：表中没能变化，视图中的数据发生改变</p>
<p>从视图中插数据时相对应的表会发生改变:</p>
<p>往视图中插数据时，会直接插进基表中，查看视图中的数据时，相当于就是执行创建时的select语句。</p>
<p>限制对数据库的访问，简化查询。</p>
<p>简单视图：来自于单表，且select语句中不能包括函数，能进行DML操作。</p>
<p>复杂视图：来源于多张表，不能执行DML操作。</p>
<p>视图的约束</p>
<p>with read only 视图只读约束(O)</p>
<p>with check option 不允许插入与where条件不符的记录，类似于check约束的功能(V)</p>
<p>在select from 后也可以使用子查寻，这个写法也叫做内嵌视图</p>
<p>例：</p>
<p>select first_name,salary,avgsal from s_emp e,(select dept_id,avg(salary) avgsal from s_emp group by dept_id) s where e.dept_id=s.dept_id and e.salary&gt;s.avgsal;</p>
<p>删除视图 drop views 视图名;</p>
<p><strong>行号（rownum</strong><strong>）</strong></p>
<p>关于rownum：</p>
<p>rownum 有个特点要么等于1 要么小于某个值， 不能直接等于某个值, 不能大于某个值。</p>
<p>rownum常用于分页显示。</p>
<p>rownum只用于读入内存的数据。</p>
<p><strong>关于同义词</strong>：</p>
<p>同义词:相当于别名的作用(***只需了解***）系统自建的同义词:</p>
<p>user_tables</p>
<p>create synonym asd_s_emp for asd_0606.s_emp ;</p>
<p>目的就是为了给asd_0606_s_emp表起另一个代替的名称asd.s_emp;注意这个同义词只能自己使用;</p>
<p>create public synonym p_s_emp fro asd_0606.s_emp; 创建公共的同义词，但是要权限.</p>
<p>删除同义词：</p>
<p>drop synonym<span>    </span>同义词名称</p>
<p><strong>索引（index</strong><strong>）</strong></p>
<p>创建索引：Creating indexes(概念很重要对系统的性能影响非常大）</p>
<p>建索引的目的就是为了加快查询速度。</p>
<p>索引就相于一本的书的目录。索引点系统空间，属于表的附属物。删除一个表时，相对应的索引也会删除。索引是会进行排序。</p>
<p>truncate 表时索引结构在，但是数据不存在。</p>
<p>full table scan 全表扫描</p>
<p>用索引就是为了快速定位数据：(理解时就以字典的目录为例)</p>
<p>创建索引就是创建key和记录的物理位置（rowid）组成的键值对。索引是有独立的存储空间,但是和表是逻辑关联的,索引和表的关系是依附关系,表被删除了,索引也没有存在的意义也就被删除了</p>
<p>在建表时会根据表中的PK或UK自动的建立唯一性索引。</p>
<p>查看表的rowid：</p>
<p>select rowid,first_name from s_emp;</p>
<p>rowid 定义的信息有：object block table</p>
<p>每条记录都有自己的rowid</p>
<p>索引由谁创建：用户,建索引后会使DML操作效率慢，但是对用户查询会提高效率,这就是我们建索引的最终目的。</p>
<p>创建一个索引：</p>
<p>create index 索引名 on 表名 (字段名);</p>
<p>create insex testindex on test(c1, c2);</p>
<p>索引分为唯一性索引，联合索引。索引中是不会维护空值的。</p>
<p>哪些字段应该建索引：创建索引就是为了减少物理读，索引会减少扫描的时间。</p>
<p>经常要用where的子句的地方，所以要用索引.用不用索引，关键要看所查询的数据与所有数据的百分比，表越大，查询的记录越少，索引的效率就越高.</p>
<p>替换变量：用&amp;符号来定义替换变量支持交互性提示,对于字符性的数字，一定要写在单引号之间</p>
<p>更改交互的提示信息：</p>
<p>accept p_dname prompt &#8216; 提示信息&#8217;;</p>
<p>定义变量：</p>
<p>define p_dname=&#8217;abc&#8217;;</p>
<p>set<span>    verify on</span></p>
<p>set<span>    verify off;</span></p>
<p>相当于开关变量，用于控制是否显示新旧的sql语句</p>
<p>select id,last_name,salary from s_emp where title=&#8217;&amp;job_title&#8217;;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronw.cn/static/17.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL语句集锦</title>
		<link>http://www.aaronw.cn/static/16.html</link>
		<comments>http://www.aaronw.cn/static/16.html#comments</comments>
		<pubDate>Fri, 07 Mar 2008 06:57:05 +0000</pubDate>
		<dc:creator>Aaron.wang</dc:creator>
				<category><![CDATA[DB]]></category>

		<guid isPermaLink="false">http://www.aaronw.cn/html/16_sql%e8%af%ad%e5%8f%a5%e9%9b%86%e9%94%a6.html</guid>
		<description><![CDATA[asc 按升序排列
desc 按降序排列
下列语句部分是Mssql语句，不可以在access中使用。
SQL分类：
DDL—数据定义语言(CREATE，ALTER，DROP，DECLARE)
DML—数据操纵语言(SELECT，DELETE，UPDATE，INSERT)
DCL—数据控制语言(GRANT，REVOKE，COMMIT，ROLLBACK)
首先,简要介绍基础语句：
1、说明：创建数据库
CREATE DATABASE database-name
2、说明：删除数据库
drop database dbname
3、说明：备份sql server
&#8212; 创建 备份数据的 device
USE master
EXEC sp_addumpdevice &#8216;disk&#8217;, &#8216;testBack&#8217;, &#8216;c:\mssql7backup\MyNwind_1.dat&#8217;
&#8212; 开始 备份
BACKUP DATABASE pubs TO testBack
4、说明：创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)
根据已有的表创建新表：
A：create table tab_new like tab_old (使用旧表创建新表)
B：create table tab_new as select col1,col2… from tab_old definition only
5、说明：删除新表drop table tabname
6、说明：增加一个列
Alter table tabname add column col type
注：列增加后将不能删除。DB2中列加上后数据类型也不能改变，唯一能改变的是增加varchar类型的长度。

7、说明：添加主键： Alter [...]]]></description>
			<content:encoded><![CDATA[<p>asc 按升序排列<br />
desc 按降序排列<br />
下列语句部分是Mssql语句，不可以在access中使用。</p>
<p>SQL分类：<br />
DDL—数据定义语言(CREATE，ALTER，DROP，DECLARE)<br />
DML—数据操纵语言(SELECT，DELETE，UPDATE，INSERT)<br />
DCL—数据控制语言(GRANT，REVOKE，COMMIT，ROLLBACK)</p>
<p>首先,简要介绍基础语句：<br />
1、说明：创建数据库<br />
CREATE DATABASE database-name<br />
2、说明：删除数据库<br />
drop database dbname<br />
3、说明：备份sql server<br />
&#8212; 创建 备份数据的 device<br />
USE master<br />
EXEC sp_addumpdevice &#8216;disk&#8217;, &#8216;testBack&#8217;, &#8216;c:\mssql7backup\MyNwind_1.dat&#8217;<br />
&#8212; 开始 备份<br />
BACKUP DATABASE pubs TO testBack<br />
4、说明：创建新表<br />
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)<br />
根据已有的表创建新表：<br />
A：create table tab_new like tab_old (使用旧表创建新表)<br />
B：create table tab_new as select col1,col2… from tab_old definition only<br />
5、说明：删除新表drop table tabname<br />
6、说明：增加一个列<br />
Alter table tabname add column col type<br />
注：列增加后将不能删除。DB2中列加上后数据类型也不能改变，唯一能改变的是增加varchar类型的长度。<br />
<span id="more-16"></span><br />
7、说明：添加主键： Alter table tabname add primary key(col)<br />
说明：删除主键： Alter table tabname drop primary key(col)<br />
8、说明：创建索引：create [unique] index idxname on tabname(col….)<br />
删除索引：drop index idxname<br />
注：索引是不可更改的，想更改必须删除重新建。<br />
9、说明：创建视图：create view viewname as select statement<br />
删除视图：drop view viewname<br />
10、说明：几个简单的基本的sql语句<br />
选择：select * from table1 where 范围<br />
插入：insert into table1(field1,field2) values(value1,value2)<br />
删除：delete from table1 where 范围<br />
更新：update table1 set field1=value1 where 范围<br />
查找：select * from table1 where field1 like ’%value1%’ &#8212;like的语法很精妙，查资料!<br />
排序：select * from table1 order by field1,field2 [desc]<br />
总数：select count as totalcount from table1<br />
求和：select sum(field1) as sumvalue from table1<br />
平均：select avg(field1) as avgvalue from table1<br />
最大：select max(field1) as maxvalue from table1<br />
最小：select min(field1) as minvalue from table1<br />
11、说明：几个高级查询运算词<br />
A： UNION 运算符<br />
UNION 运算符通过组合其他两个结果表（例如 TABLE1 和 TABLE2）并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时（即 UNION ALL），不消除重复行。两种情况下，派生表的每一行不是来自 TABLE1 就是来自 TABLE2。<br />
B： EXCEPT 运算符<br />
EXCEPT 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当 ALL 随 EXCEPT 一起使用时 (EXCEPT ALL)，不消除重复行。<br />
C： INTERSECT 运算符<br />
INTERSECT 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL)，不消除重复行。<br />
注：使用运算词的几个查询结果行必须是一致的。</p>
<p>12、说明：使用外连接<br />
A、left outer join：<br />
左外连接（左连接）：结果集几包括连接表的匹配行，也包括左连接表的所有行。<br />
<a href="http://blog.csdn.net/hanghwp" title="sql">sql</a>: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a =法一：select * into b from a where 1&lt;&gt;1<br />
法二：select top 0 * into b from a</p>
<p>2、说明：拷贝表(拷贝数据,源表名：a 目标表名：b) (Access可用)<br />
insert into b(a, b, c) select d,e,f from b;</p>
<p>3、说明：跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)<br />
insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件<br />
例子：..from b in &#8216;&#8221;&amp;Server.MapPath(&#8220;.&#8221;)&amp;&#8221;\data.mdb&#8221; &amp;&#8221;&#8216; where..</p>
<p>4、说明：子查询(表名1：a 表名2：b)<br />
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)</p>
<p>5、说明：显示文章、提交人和最后回复时间<br />
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b</p>
<p>6、说明：外连接查询(表名1：a 表名2：b)<br />
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c</p>
<p>7、说明：在线视图查询(表名1：a )<br />
select * from (SELECT a,b,c FROM a) T where t.a &gt; 1;</p>
<p>8、说明：between的用法,between限制查询数据范围时包括了边界值,not between不包括<br />
select * from table1 where time between time1 and time2<br />
select a,b,c, from table1 where a not between 数值1 and 数值2</p>
<p>9、说明：in 的使用方法<br />
select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)</p>
<p>10、说明：两张关联表，删除主表中已经在副表中没有的信息<br />
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )</p>
<p>11、说明：四表联查问题：<br />
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where &#8230;..</p>
<p>12、说明：日程安排提前五分钟提醒<br />
<a href="http://blog.csdn.net/hanghwp" title="sql">sql</a>: select * from 日程安排 where datediff(&#8216;minute&#8217;,f开始时间,getdate())&gt;5</p>
<p>13、说明：一条sql 语句搞定数据库分页<br />
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段</p>
<p>14、说明：前10条记录<br />
select top 10 * form table1 where 范围</p>
<p>15、说明：选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)<br />
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)</p>
<p>16、说明：包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表<br />
(select a from tableA ) except (select a from tableB) except (select a from tableC)</p>
<p>17、说明：随机取出10条数据<br />
select top 10 * from tablename order by newid()</p>
<p>18、说明：随机选择记录<br />
select newid()</p>
<p>19、说明：删除重复记录<br />
Delete from tablename where id not in (select max(id) from tablename group by col1,col2,&#8230;)</p>
<p>20、说明：列出数据库里所有的表名<br />
select name from sysobjects where type=&#8217;U&#8217;</p>
<p>21、说明：列出表里的所有的<br />
select name from syscolumns where id=object_id(&#8216;TableName&#8217;)</p>
<p>22、说明：列示type、vender、pcs字段，以type字段排列，case可以方便地实现多重选择，类似select 中的case。<br />
select type,sum(case vender when &#8216;A&#8217; then pcs else 0 end),sum(case vender when &#8216;C&#8217; then pcs else 0 end),sum(case vender when &#8216;B&#8217; then pcs else 0 end) FROM tablename group by type<br />
显示结果：<br />
type vender pcs<br />
电脑 A 1<br />
电脑 A 1<br />
光盘 B 2<br />
光盘 A 2<br />
手机 B 3<br />
手机 C 3</p>
<p>23、说明：初始化表table1</p>
<p>TRUNCATE TABLE table1</p>
<p>24、说明：选择从10到15的记录<br />
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc<br />
　　<br />
随机选择数据库记录的方法（使用Randomize函数，通过SQL语句实现）<br />
　　对存储在数据库中的数据来说，随机数特性能给出上面的效果，但它们可能太慢了些。你不能要求ASP“找个随机数”然后打印出来。实际上常见的解决方案是建立如下所示的循环：<br />
Randomize<br />
RNumber = Int(Rnd*499) +1<br />
　<br />
While Not objRec.EOF<br />
If objRec(&#8220;ID&#8221;) = RNumber THEN<br />
&#8230; 这里是执行脚本 &#8230;<br />
end if<br />
objRec.MoveNext<br />
Wend<br />
　<br />
　　这很容易理解。首先，你取出1到500范围之内的一个随机数（假设500就是数据库内记录的总数）。然后，你遍历每一记录来测试ID 的值、检查其是否匹配RNumber。满足条件的话就执行由THEN 关键字开始的那一块代码。假如你的RNumber 等于495，那么要循环一遍数据库花的时间可就长了。虽然500这个数字看起来大了些，但相比更为稳固的企业解决方案这还是个小型数据库了，后者通常在一个数据库内就包含了成千上万条记录。这时候不就死定了？<br />
　　采用SQL，你就可以很快地找出准确的记录并且打开一个只包含该记录的recordset，如下所示：<br />
Randomize<br />
RNumber = Int(Rnd*499) + 1<br />
　<br />
<a href="http://blog.csdn.net/hanghwp" title="sql">sql</a> = &#8220;SELECT * FROM Customers WHERE ID = &#8221; &amp; RNumber<br />
　<br />
set ōbjRec = ObjConn.Execute(SQL)<br />
Response.WriteRNumber &amp; &#8221; = &#8221; &amp; objRec(&#8220;ID&#8221;) &amp; &#8221; &#8221; &amp; objRec(&#8220;c_email&#8221;)<br />
　<br />
　　不必写出RNumber 和ID，你只需要检查匹配情况即可。只要你对以上代码的工作满意，你自可按需操作“随机”记录。Recordset没有包含其他内容，因此你很快就能找到你需要的记录这样就大大降低了处理时间。<br />
再谈随机数<br />
　　现在你下定决心要榨干Random 函数的最后一滴油，那么你可能会一次取出多条随机记录或者想采用一定随机范围内的记录。把上面的标准Random 示例扩展一下就可以用SQL应对上面两种情况了。<br />
　　为了取出几条随机选择的记录并存放在同一recordset内，你可以存储三个随机数，然后查询数据库获得匹配这些数字的记录：<br />
<a href="http://blog.csdn.net/hanghwp" title="sql">sql</a> = &#8220;SELECT * FROM Customers WHERE ID = &#8221; &amp; RNumber &amp; &#8221; OR ID = &#8221; &amp; RNumber2 &amp; &#8221; OR ID = &#8221; &amp; RNumber3<br />
　<br />
　　假如你想选出10条记录（也许是每次页面装载时的10条链接的列表），你可以用BETWEEN 或者数学等式选出第一条记录和适当数量的递增记录。这一操作可以通过好几种方式来完成，但是 SELECT 语句只显示一种可能（这里的ID 是自动生成的号码）：<br />
<a href="http://blog.csdn.net/hanghwp" title="sql">sql</a> = &#8220;SELECT * FROM Customers WHERE ID BETWEEN &#8221; &amp; RNumber &amp; &#8221; AND &#8221; &amp; RNumber &amp; &#8220;+ 9&#8243;</p>
<p>　　注意：以上代码的执行目的不是检查数据库内是否有9条并发记录。</p>
<p>　<br />
随机读取若干条记录，测试过<br />
Access语法：SELECT top 10 * From 表名 ORDER BY Rnd(id)<br />
<a href="http://blog.csdn.net/hanghwp" title="sql">sql</a>10 then left(field,10)+&#8217;&#8230;&#8217; else field end as news_name,news_id from tablename<br />
Access数据库：SELECT iif(len(field)&gt;2,left(field,2)+&#8217;&#8230;&#8217;,field) FROM tablename;<br />
　<br />
Conn.Execute说明<br />
Execute方法<br />
　　该方法用于执行SQL语句。根据SQL语句执行后是否返回记录集，该方法的使用格式分为以下两种：</p>
<p>1．执行SQL查询语句时，将返回查询得到的记录集。用法为：<br />
　　　　Set 对象变量名=连接对象.Execute(&#8220;SQL 查询语言&#8221;)<br />
　　　Execute方法调用后，会自动创建记录集对象，并将查询结果存储在该记录对象中，通过Set方法，将记录集赋给指定的对象保存，以后对象变量就代表了该记录集对象。</p>
<p>　　　　2．执行SQL的操作性语言时，没有记录集的返回。此时用法为：<br />
　　　　连接对象.Execute &#8220;SQL 操作性语句&#8221; [, RecordAffected][, Option]<br />
　　　　　　·RecordAffected 为可选项，此出可放置一个变量，SQL语句执行后，所生效的记录数会自动保存到该变量中。通过访问该变量，就可知道SQL语句队多少条记录进行了操作。<br />
　　　　　　·Option 可选项，该参数的取值通常为adCMDText，它用于告诉ADO，应该将Execute方法之后的第一个字符解释为命令文本。通过指定该参数，可使执行更高效。</p>
<p>·BeginTrans、RollbackTrans、CommitTrans方法<br />
　　这三个方法是连接对象提供的用于事务处理的方法。BeginTrans用于开始一个事物；RollbackTrans用于回滚事务；CommitTrans用于提交所有的事务处理结果，即确认事务的处理。<br />
　　事务处理可以将一组操作视为一个整体，只有全部语句都成功执行后，事务处理才算成功；若其中有一个语句执行失败，则整个处理就算失败，并恢复到处里前的状态。<br />
　　BeginTrans和CommitTrans用于标记事务的开始和结束，在这两个之间的语句，就是作为事务处理的语句。判断事务处理是否成功，可通过连接对象的Error集合来实现，若Error集合的成员个数不为0，则说明有错误发生，事务处理失败。Error集合中的每一个Error对象，代表一个错误信息。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aaronw.cn/static/16.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
