﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-◎ヤ撧吥菔瀭o┊。&#x7;``。-随笔分类-Oracle</title><link>http://www.blogjava.net/hllwuxin/category/25995.html</link><description>刪除昨天啲煩惱.﹖選擇今天啲快樂.﹖設置明天啲幸福.﹖ </description><language>zh-cn</language><lastBuildDate>Thu, 18 Oct 2007 13:50:30 GMT</lastBuildDate><pubDate>Thu, 18 Oct 2007 13:50:30 GMT</pubDate><ttl>60</ttl><item><title>DBA必须熟悉的、最有用的DBA视图</title><link>http://www.blogjava.net/hllwuxin/archive/2007/10/12/152347.html</link><dc:creator>優雅Ｄě頽廢</dc:creator><author>優雅Ｄě頽廢</author><pubDate>Fri, 12 Oct 2007 06:48:00 GMT</pubDate><guid>http://www.blogjava.net/hllwuxin/archive/2007/10/12/152347.html</guid><wfw:comment>http://www.blogjava.net/hllwuxin/comments/152347.html</wfw:comment><comments>http://www.blogjava.net/hllwuxin/archive/2007/10/12/152347.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hllwuxin/comments/commentRss/152347.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hllwuxin/services/trackbacks/152347.html</trackback:ping><description><![CDATA[dba_data_files&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关于数据库文件的信息
<p>dba_db_links&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据库中的所有数据库链路</p>
<p>dba_extents&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据库中包括所有分区</p>
<p>dba_free_space&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所有表空间中自由分区</p>
<p>dba_indexes&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据库中所有索引的描述</p>
<p>dba_ind_columns&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在所有表及聚族上压缩索引的列</p>
<p>dba_objects&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据库中所有的对象</p>
<p>dba_rollback_segs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 回滚段的描述</p>
<p>dba_segments&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 为所有数据库段分配的存储空间</p>
<p>dba_sequences&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据库中所有顺序书的描述</p>
<p>dba_synonyms&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据库中所有同义词</p>
<p>dba_tables&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据库中所有表的描述</p>
<p>dba_tablespaces&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据库中所有表空间的描述</p>
<p>dba_tab_columns&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所有表描述、视图以及聚族的列</p>
<p>dba_tab_grants&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据库中对象所授的权限</p>
<p>dba_tab_privs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据库中对象所授的权限</p>
<p>dba_ts_quotas&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所有用户表空间限额</p>
<p>dba_users&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关于数据库的所有用户信息</p>
<p>dba_views&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数据库中所有视图</p>
<img src ="http://www.blogjava.net/hllwuxin/aggbug/152347.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hllwuxin/" target="_blank">優雅Ｄě頽廢</a> 2007-10-12 14:48 <a href="http://www.blogjava.net/hllwuxin/archive/2007/10/12/152347.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>execute immediate</title><link>http://www.blogjava.net/hllwuxin/archive/2007/10/11/152050.html</link><dc:creator>優雅Ｄě頽廢</dc:creator><author>優雅Ｄě頽廢</author><pubDate>Thu, 11 Oct 2007 07:21:00 GMT</pubDate><guid>http://www.blogjava.net/hllwuxin/archive/2007/10/11/152050.html</guid><wfw:comment>http://www.blogjava.net/hllwuxin/comments/152050.html</wfw:comment><comments>http://www.blogjava.net/hllwuxin/archive/2007/10/11/152050.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hllwuxin/comments/commentRss/152050.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hllwuxin/services/trackbacks/152050.html</trackback:ping><description><![CDATA[<div>EXECUTE IMMEDIATE代替了以前Oracle8i中DBMS_SQL package包.它解析并马上执行动态的SQL语句或非运行时创建的PL/SQL块.动态创建和执行SQL语句性能超前，EXECUTE IMMEDIATE的目标在于减小企业费用并获得较高的性能，较之以前它相当容易编码.尽管DBMS_SQL仍然可用，但是推荐使用EXECUTE IMMEDIATE,因为它获的收益在包之上。</div>
<div><br />
使用技巧</div>
<div><br />
1. EXECUTE IMMEDIATE将不会提交一个DML事务执行，应该显式提交<br />
如果通过EXECUTE IMMEDIATE处理DML命令，那么在完成以前需要显式提交或者作为EXECUTE IMMEDIATE自己的一部分. 如果通过EXECUTE IMMEDIATE处理DDL命令,它提交所有以前改变的数据</div>
<div><br />
2. 不支持返回多行的查询,这种交互将用临时表来存储记录(参照例子如下)或者用REF cursors.</div>
<div><br />
3. 当执行SQL语句时，不要用分号，当执行PL/SQL块时，在其尾部用分号.</div>
<div><br />
4. 在Oracle手册中，未详细覆盖这些功能。下面的例子展示了所有用到Execute immediate的可能方面.希望能给你带来方便.</div>
<div><br />
5. 对于Forms开发者,当在PL/SQL 8.0.6.3.版本中，Forms 6i不能使用此功能.</div>
<div><br />
EXECUTE IMMEDIATE用法例子</div>
<div><br />
1. 在PL/SQL运行DDL语句</div>
<div><br />
begin<br />
execute immediate 'set role all';<br />
end;</div>
<div><br />
2. 给动态语句传值(USING 子句)</div>
<div><br />
declare<br />
l_depnam varchar2(20) := 'testing';<br />
l_loc varchar2(10) := 'Dubai';<br />
begin<br />
execute immediate 'insert into dept values (:1, :2, :3)'<br />
using 50, l_depnam, l_loc;<br />
commit;<br />
end;</div>
<div><br />
3. 从动态语句检索值(INTO子句)</div>
<div><br />
declare<br />
l_cnt varchar2(20);<br />
begin<br />
execute immediate 'select count(1) from emp'<br />
into l_cnt;<br />
dbms_output.put_line(l_cnt);<br />
end;</div>
<div><br />
4. 动态调用例程.例程中用到的绑定变量参数必须指定参数类型.?]认为IN类型,其它类型必须显式指定</div>
<div><br />
declare<br />
l_routin varchar2(100) := 'gen2161.get_rowcnt';<br />
l_tblnam varchar2(20) := 'emp';<br />
l_cnt number;<br />
l_status varchar2(200);<br />
begin<br />
execute immediate 'begin ' || l_routin || '(:2, :3, :4); end;'<br />
using in l_tblnam, out l_cnt, in out l_status;</div>
<div>if l_status != 'OK' then<br />
dbms_output.put_line('error');<br />
end if;<br />
end;</div>
<div><br />
5. 将返回值传递到PL/SQL记录类型;同样也可用%rowtype变量</div>
<div><br />
declare<br />
type empdtlrec is record (empno number(4),<br />
ename varchar2(20),<br />
deptno number(2));<br />
empdtl empdtlrec;<br />
begin<br />
execute immediate 'select empno, ename, deptno ' ||<br />
'from emp where empno = 7934'<br />
into empdtl;<br />
end;</div>
<div><br />
6. 传递并检索值.INTO子句用在USING子句前</div>
<div><br />
declare<br />
l_dept pls_integer := 20;<br />
l_nam varchar2(20);<br />
l_loc varchar2(20);<br />
begin<br />
execute immediate 'select dname, loc from dept where deptno = :1'<br />
into l_nam, l_loc<br />
using l_dept ;<br />
end;</div>
<div><br />
7. 多行查询选项.对此选项用insert语句填充临时表，用临时表进行进一步的处理,也可以用REF cursors纠正此缺憾.</div>
<div>declare<br />
l_sal pls_integer := 2000;<br />
begin<br />
execute immediate 'insert into temp(empno, ename) ' ||<br />
' select empno, ename from emp ' ||<br />
' where sal &gt; :1'<br />
using l_sal;<br />
commit;<br />
end;</div>
<div><br />
对于处理动态语句,EXECUTE IMMEDIATE比以前可能用到的更容易并且更高效.当意图执行动态语句时，适当地处理异常更加重要.应该关注于捕获所有可能的异常.<br />
</div>
<img src ="http://www.blogjava.net/hllwuxin/aggbug/152050.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hllwuxin/" target="_blank">優雅Ｄě頽廢</a> 2007-10-11 15:21 <a href="http://www.blogjava.net/hllwuxin/archive/2007/10/11/152050.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DBA应遵循的oracle调优原则</title><link>http://www.blogjava.net/hllwuxin/archive/2007/10/11/152044.html</link><dc:creator>優雅Ｄě頽廢</dc:creator><author>優雅Ｄě頽廢</author><pubDate>Thu, 11 Oct 2007 07:00:00 GMT</pubDate><guid>http://www.blogjava.net/hllwuxin/archive/2007/10/11/152044.html</guid><wfw:comment>http://www.blogjava.net/hllwuxin/comments/152044.html</wfw:comment><comments>http://www.blogjava.net/hllwuxin/archive/2007/10/11/152044.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hllwuxin/comments/commentRss/152044.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hllwuxin/services/trackbacks/152044.html</trackback:ping><description><![CDATA[<p style="text-indent: 2em">Oracle 调优是一个复杂的主题。关于调优可以写整整一本书，不过，为了改善 Oracle 数据库的性能，有一些基本的概念是每个 Oracle DBA 都应该遵从的。
<p style="text-indent: 2em">
<p style="text-indent: 2em">在这篇简介中，我们将简要地介绍以下的 Oracle 主题：
<p style="text-indent: 2em">
<p style="text-indent: 2em">-- 外部调整：我们应该记住 Oracle 并不是单独运行的。因此我们将查看一下通过调整 Oracle 服务器以得到高的性能。
<p style="text-indent: 2em">
<p style="text-indent: 2em">--Row re-sequencing 以减少磁盘 I/O ：我们应该懂得 Oracle 调优最重要的目标是减少 I/O 。
<p style="text-indent: 2em">
<p style="text-indent: 2em">--Oracle SQL 调整。 Oracle SQL 调整是 Oracle 调整中最重要的领域之一，只要通过一些简单的 SQL 调优规则就可以大幅度地提升 SQL 语句的性能，这是一点都不奇怪的。
<p style="text-indent: 2em">
<p style="text-indent: 2em">-- 调整 Oracle 排序：排序对于 Oracle 性能也是有很大影响的。
<p style="text-indent: 2em">
<p style="text-indent: 2em">-- 调整 Oracle 的竞争：表和索引的参数设置对于 UPDATE 和 INSERT 的性能有很大的影响。
<p style="text-indent: 2em">
<p style="text-indent: 2em">我们首先从调整 Oracle 外部的环境开始。如果内存和 CPU 的资源不足的话，任何的 Oracle 调整都是没有帮助的。
<p style="text-indent: 2em">
<p style="text-indent: 2em"><strong>外部的性能问题</strong>
<p style="text-indent: 2em">
<p style="text-indent: 2em">Oracle 并不是单独运行的。 Oracle 数据库的性能和外部的环境有很大的关系。这些外部的条件包括有：
<p style="text-indent: 2em">
<p style="text-indent: 2em">． CPU--CPU 资源的不足令查询变慢。当查询超过了 Oracle 服务器的 CPU 性能时，你的数据库性能就受到 CPU 的限制。
<p style="text-indent: 2em">
<p style="text-indent: 2em">．内存 -- 可用于 Oralce 的内存数量也会影响 SQL 的性能，特别是在数据缓冲和内存排序方面。
<p style="text-indent: 2em">
<p style="text-indent: 2em">．网络 -- 大量的 Net8 通信令 SQL 的性能变慢。
<p style="text-indent: 2em">
<p style="text-indent: 2em">许多新手都错误的认为应该首先调整 Oracle 数据库，而不是先确认外部资源是否足够。实际上，如果外部环境出现瓶颈，再多的 Oracle 调整都是没有帮助的。
<p style="text-indent: 2em">
<p style="text-indent: 2em">在检查 Oracle 的外部环境时，有两个方面是需要注意的：
<p style="text-indent: 2em">
<p style="text-indent: 2em">1 、当运行队列的数目超过服务器的 CPU 数量时，服务器的性能就会受到 CPU 的限制。补救的方法是为服务器增加额外的 CPU 或者关闭需要很多处理资源的组件，例如 Oracle Parallel Query 。
<p style="text-indent: 2em">
<p style="text-indent: 2em">2 、内存分页。当内存分页时，内存容量已经不足，而内存页是与磁盘上的交换区进行交互的。补救的方法是增加更多的内存，减少 Oracle SGA 的大小，或者关闭 Oracle 的多线程服务器。
<p style="text-indent: 2em">
<p style="text-indent: 2em">可以使用各种标准的服务器工具来得到服务器的统计数据，例如 vmstat,glance,top 和 sar 。 DBA 的目标是确保数据库服务器拥有足够的 CPU 和内存资源来处理 Oracle 的请求。
<p style="text-indent: 2em">
<p style="text-indent: 2em">以下让我们来看一下 Oracle 的 row-resequencing 是如何能够极大地减少磁盘 I/O 的。
<p style="text-indent: 2em">
<p style="text-indent: 2em"><strong>Row-resequencing （行的重新排序）</strong>
<p style="text-indent: 2em">
<p style="text-indent: 2em">就象我们上面提到的，有经验的 Oracle DBA 都知道 I/O 是响应时间的最大组成部分。其中磁盘 I/O 特别厉害，因为当 Oracle 由磁盘上的一个数据文件得到一个数据块时，读的进程就必须等待物理 I/O 操作完成。磁盘操作要比数据缓冲慢 10,000 倍。因此，如果可以令 I/O 最小化，或者减少由于磁盘上的文件竞争而带来的瓶颈，就可以大大地改善 Oracle 数据库的性能。
<p style="text-indent: 2em">
<p style="text-indent: 2em">如果系统响应很慢，通过减少磁盘 I/O 就可以有一个很快的改善。如果在一个事务中通过按一定的范围搜索 primary-key 索引来访问表，那么重新以 CTAS 的方法组织表将是你减少 I/O 的首要策略。通过在物理上将行排序为和 primary-key 索引一样的顺序，就可以加快获得数据的速度。
<p style="text-indent: 2em">
<p style="text-indent: 2em">就象磁盘的负载平衡一样，行的重新排序也是很简单的，而且也很快。通过与其它的 DBA 管理技巧一起使用，就可以在高 I/O 的系统中大大地减少响应的时间。
<p style="text-indent: 2em">
<p style="text-indent: 2em">在高容量的在线事务处理环境中（ online transaction processing ， OLTP ），数据是由一个 primary 索引得到的，重新排序表格的行就可以令连续块的顺序和它们的 primary 索引一样，这样就可以在索引驱动的表格查询中，减少物理 I/O 并且改善响应时间。这个技巧仅在应用选择多行的时候有用，或者在使用索引范围搜索和应用发出多个查询来得到连续的 key 时有效。对于随机的唯一 primary-key （主键）的访问将不会由行重新排序中得到好处。
<p style="text-indent: 2em">
<p style="text-indent: 2em">让我们看一下它是如何工作的。考虑以下的一个 SQL 的查询，它使用一个索引来得到 100 行：
<p style="text-indent: 2em">
<p style="text-indent: 2em">select salary from employee where last_name like 'B%';
<p style="text-indent: 2em">
<p style="text-indent: 2em">这个查询将会使用 last_name_index ，搜索其中的每一行来得到目标行。这个查询将会至少使用 100 次物理磁盘的读取，因为 employee 的行存放在不同的数据块中。
<p style="text-indent: 2em">
<p style="text-indent: 2em">不过，如果表中的行已经重新排序为和 last_name_index 的一样，同样的查询又会怎样处理呢？我们可以看到这个查询只需要三次的磁盘 I/O 就读完全部 100 个员工的资料（一次用作索引的读取，两次用作数据块的读取），减少了 97 次的块读取。
<p style="text-indent: 2em">
<p style="text-indent: 2em">重新排序带来的性能改善的程度在于在你开始的时候行的乱序性如何，以及你需要由序列中访问多少行。至于一个表中的行与索引的排序键的匹配程度，可以查看数据字典中的 dba_indexes 和 dba_tables 视图得到。
<p style="text-indent: 2em">
<p style="text-indent: 2em">在 dba_indexes 的视图中，查看 clustering_factor 列。如果 clustering_factor 的值和表中的块数目大致一样，那么你的表和索引的顺序是一样的。不过，如果 clustering_factor 的值接近表中的行数目，那就表明表格中的行和索引的顺序是不一样的。
<p style="text-indent: 2em">
<p style="text-indent: 2em">行重新排序的作用是不可以小看的。在需要进行大范围的索引搜索的大表中，行重新排序可以令查询的性能提高三倍。
<p style="text-indent: 2em">
<p style="text-indent: 2em">一旦你已经决定重新排序表中的行，你可以使用以下的工具之一来重新组织表格。
<p style="text-indent: 2em">
<p style="text-indent: 2em">. 使用 Oracle 的 Create Table As Select (CTAS) 语法来拷贝表格
<p style="text-indent: 2em">
<p style="text-indent: 2em">. Oracle9i 自带的表格重新组织工具
<p style="text-indent: 2em">
<p style="text-indent: 2em"><strong>SQL 调优</strong>
<p style="text-indent: 2em">
<p style="text-indent: 2em">Oracle 的 SQL 调优是一个复杂的主题，甚至是需要整本书来介绍 Oracle SQL 调优的细微差别。不过有一些基本的规则是每个 Oracle DBA 都需要跟从的，这些规则可以改善他们系统的性能。 SQL 调优的目标是简单的：
<p style="text-indent: 2em">
<p style="text-indent: 2em">. 消除不必要的大表全表搜索：不必要的全表搜索导致大量不必要的 I/O ，从而拖慢整个数据库的性能。调优专家首先会根据查询返回的行数目来评价 SQL 。在一个有序的表中，如果查询返回少于 40% 的行，或者在一个无序的表中，返回少于 7% 的行，那么这个查询都可以调整为使用一个索引来代替全表搜索。对于不必要的全表搜索来说，最常见的调优方法是增加索引。可以在表中加入标准的 B 树索引，也可以加入 bitmap 和基于函数的索引。要决定是否消除一个全表搜索，你可以仔细检查索引搜索的 I/O 开销和全表搜索的开销，它们的开销和数据块的读取和可能的并行执行有关，并将两者作对比。在一些情况下，一些不必要的全表搜索的消除可以通过强制使用一个 index 来达到，只需要在 SQL 语句中加入一个索引的提示就可以了。
<p style="text-indent: 2em">
<p style="text-indent: 2em">. 在全表搜索是一个最快的访问方法时，将小表的全表搜索放到缓存中，调优专家应该确保有一个专门的数据缓冲用作行缓冲。在 Oracle7 中，你可以使用 alter table xxx cache 语句，在 Oracle8 或以上，小表可以被强制为放到 KEEP 池中缓冲。
<p style="text-indent: 2em">
<p style="text-indent: 2em">. 确保最优的索引使用 ：对于改善查询的速度，这是特别重要的。有时 Oracle 可以选择多个索引来进行查询，调优专家必须检查每个索引并且确保 Oracle 使用正确的索引。它还包括 bitmap 和基于函数的索引的使用。
<p style="text-indent: 2em">
<p style="text-indent: 2em">. 确保最优的 JOIN 操作：有些查询使用 NESTED LOOP join 快一些，有些则是 HASH join 快一些，另外一些则是 sort-merge join 更快。
<p style="text-indent: 2em">
<p style="text-indent: 2em">这些规则看来简单，不过它们占 SQL 调优任务的 90% ，并且它们也无需完全懂得 Oracle SQL 的内部运作。以下我们来简单概览以下 Oracle SQL 的优化。
<p style="text-indent: 2em">
<p style="text-indent: 2em">我们首先简要查看 Oracle 的排序，并且看一看排序操作是如何影响性能的。
<p style="text-indent: 2em">
<p style="text-indent: 2em">调整 Oracle 的排序操作
<p style="text-indent: 2em">
<p style="text-indent: 2em">排序是 SQL 语法中一个小的方面，但很重要，在 Oracle 的调整中，它常常被忽略。当使用 create index 、 ORDER BY 或者 GROUP BY 的语句时， Oracle 数据库将会自动执行排序的操作。通常，在以下的情况下 Oracle 会进行排序的操作：
<p style="text-indent: 2em">
<p style="text-indent: 2em"><strong>使用 Order by / Group by 的 SQL 语句</strong>
<p style="text-indent: 2em">
<p style="text-indent: 2em">在创建索引的时候:
<p style="text-indent: 2em">
<p style="text-indent: 2em">进行 table join 时，由于现有索引的不足而导致 SQL 优化器调用 MERGE SORT。
<p style="text-indent: 2em">
<p style="text-indent: 2em">当与 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 倍。
<p style="text-indent: 2em">
<p style="text-indent: 2em">上面我们已经提到，私有排序区域的大小是有 init.ora 中的 sort_area_size 参数决定的。每个排序所占用的大小由 init.ora 中的 sort_area_retained_size 参数决定。当排序不能在分配的空间中完成时，就会使用磁盘排序的方式，即在 Oracle 实例中的临时表空间中进行。
<p style="text-indent: 2em">
<p style="text-indent: 2em">磁盘排序的开销是很大的，有几个方面的原因。首先，和内存排序相比较，它们特别慢；而且磁盘排序会消耗临时表空间中的资源。 Oracle 还必须分配缓冲池块来保持临时表空间中的块。无论什么时候，内存排序都比磁盘排序好，磁盘排序将会令任务变慢，并且会影响 Oracle 实例的当前任务的执行。还有，过多的磁盘排序将会令 free buffer waits 的值变高，从而令其它任务的数据块由缓冲中移走。
<p style="text-indent: 2em">
<p style="text-indent: 2em">接着，让我们看一下 Oracle 的竞争，并且看一下表的存储参数的设置是如何影响 SQL UPDATE 和 INSERT 语句的性能的。
<p style="text-indent: 2em">
<p style="text-indent: 2em"><strong>调整 Oracle 的竞争</strong>
<p style="text-indent: 2em">
<p style="text-indent: 2em">Oracle 的其中一个优点时它可以管理每个表空间中的自由空间。 Oracle 负责处理表和索引的空间管理，这样就可以让我们无需懂得 Oracle 的表和索引的内部运作。不过，对于有经验的 Oracle 调优专家来说，他需要懂得 Oracle 是如何管理表的 extent 和空闲的数据块。对于调整拥有高的 insert 或者 update 的系统来说，这是非常重要的。
<p style="text-indent: 2em">
<p style="text-indent: 2em">要精通对象的调整，你需要懂得 freelists 和 freelist 组的行为，它们和 pctfree 及 pctused 参数的值有关。这些知识对于企业资源计划（ ERP ）的应用是特别重要的，因为在这些应用中，不正确的表设置通常是 DML 语句执行慢的原因。
<p style="text-indent: 2em">
<p style="text-indent: 2em">对于初学者来说，最常见的错误是认为默认的 Oracle 参数对于所有的对象都是最佳的。除非磁盘的消耗不是一个问题，否则在设置表的 pctfree 和 pctused 参数时，就必须考虑平均的行长和数据库的块大小，这样空的块才会被有效地放到 freelists 中。当这些设置不正确时，那些得到的 freelists 也是 &#8220;dead&#8221;块，因为它们没有足够的空间来存储一行，这样将会导致明显的处理延迟。
<p style="text-indent: 2em">
<p style="text-indent: 2em">Freelists 对于有效地重新使用 Oracle 表空间中的空间是很重要的，它和 pctfree 及 pctused 这两个存储参数的设置直接相关。通过将 pctused 设置为一个高的值，这时数据库就会尽快地重新使用块。
<p style="text-indent: 2em">当有一个请求需要插入一行到表格中时， Oracle 就会到 freelist 中寻找一个有足够的空间来容纳一行的块。你也许知道， freelist 串是放在表格或者索引的第一个块中，这个块也被称为段头（ segment header ）。 pctfree 和 pctused 参数的唯一目的就是为了控制块如何在 freelists 中进出。虽然 freelist link 和 unlink 是简单的 Oracle 功能，不过设置 freelist link (pctused) 和 unlink (pctfree) 对 Oracle 的性能确实有影响。
<p style="text-indent: 2em">
<p style="text-indent: 2em">由 DBA 的基本知识知道， pctfree 参数是控制 freelist un-links 的（即将块由 freelists 中移除）。设置 pctfree=10 意味着每个块都保留 10% 的空间用作行扩展。 pctused 参数是控制 freelist re-links 的。设置 pctused=40 意味着只有在块的使用低于 40% 时才会回到表格的 freelists 中。
<p style="text-indent: 2em">
<p style="text-indent: 2em">许多新手对于一个块重新回到 freelists 后的处理都有些误解。其实，一旦由于一个删除的操作而令块被重新加入到 freelist 中，它将会一直保留在 freelist 中即使空间的使用超过了 60% ，只有在到达 pctfree 时才会将数据块由 freelist 中移走。
<p style="text-indent: 2em">
<p style="text-indent: 2em"><strong>表格和索引存储参数设置的要求总结</strong>
<p style="text-indent: 2em">
<p style="text-indent: 2em">以下的一些规则是用来设置 freelists, freelist groups, pctfree 和 pctused 存储参数的。你也知道， pctused 和 pctfree 的值是可以很容易地通过 alter table 命令修改的，一个好的 DBA 应该知道如何设置这些参数的最佳值。
<p style="text-indent: 2em">
<p style="text-indent: 2em">有效地使用空间和高性能之间是有矛盾的，而表格的存储参数就是控制这个方面的矛盾：
<p style="text-indent: 2em">
<p style="text-indent: 2em">. 对于需要有效地重新使用空间，可以设置一个高的 pctused 值，不过副作用是需要额外的 I/O 。一个高的 pctused 值意味着相对满的块都会放到 freelist 中。因此，这些块在再次满之前只可以接受几行记录，从而导致更多的 I/O 。
<p style="text-indent: 2em">
<p style="text-indent: 2em">. 追求高性能的话，可以将 pctused 设置为一个低的值，这意味着 Oracle 不会将数据块放到 freelists 中直到它几乎是空的。那么块将可以在满之前接收更多的行，因此可以减少插入操作的 I/O 。要记住 Oracle 扩展新块的性能要比重新使用现有的块高。对于 Oracle 来说，扩展一个表比管理 freelists 消耗更少的资源。
<p style="text-indent: 2em">
<p style="text-indent: 2em">让我们来回顾一下设置对象存储参数的一些常见规则：
<p style="text-indent: 2em">
<p style="text-indent: 2em">．经常将 pctused 设置为可以接收一条新行。对于不能接受一行的 free blocks 对于我们来说是没有用的。如果这样做，将会令 Oracle 的性能变慢，因为 Oracle 将在扩展表来得到一个空的块之前，企图读取 5 个 &#8220;dead&#8221;的 free block 。
<p style="text-indent: 2em">
<p style="text-indent: 2em">．表格中 chained rows 的出现意味着 pctfree 太低或者是 db_block_size 太少。在很多情况下， RAW 和 LONG RAW 列都很巨大，以至超过了 Oracle 的最大块的大小，这时 chained rows 是不可以避免的。
<p style="text-indent: 2em">
<p style="text-indent: 2em">．如果一个表有同时插入的 SQL 语句，那么它需要有同时删除的语句。运行单一个一个清除的工作将会把全部的空闲块放到一个 freelist 中，而没有其它包含有任何空闲块的 freelists 出现。
<p style="text-indent: 2em">
<p style="text-indent: 2em">． freelist 参数应该设置为表格同时更新的最大值。例如，如果在任何时候，某个表最多有 20 个用户执行插入的操作，那么该表的参数应该设置为 freelists=20 。
<p style="text-indent: 2em">
<p style="text-indent: 2em">应记住的是 freelist groups 参数的值只是对于 Oracle Parallel Server 和 Real Application Clusters 才是有用的。对于这类 Oracle ， freelist groups 应该设置为访问该表格的 Oracle Parallel Server 实例的数目。</p>
<img src ="http://www.blogjava.net/hllwuxin/aggbug/152044.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hllwuxin/" target="_blank">優雅Ｄě頽廢</a> 2007-10-11 15:00 <a href="http://www.blogjava.net/hllwuxin/archive/2007/10/11/152044.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于oracle中的空值</title><link>http://www.blogjava.net/hllwuxin/archive/2007/10/11/151981.html</link><dc:creator>優雅Ｄě頽廢</dc:creator><author>優雅Ｄě頽廢</author><pubDate>Thu, 11 Oct 2007 03:14:00 GMT</pubDate><guid>http://www.blogjava.net/hllwuxin/archive/2007/10/11/151981.html</guid><wfw:comment>http://www.blogjava.net/hllwuxin/comments/151981.html</wfw:comment><comments>http://www.blogjava.net/hllwuxin/archive/2007/10/11/151981.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hllwuxin/comments/commentRss/151981.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hllwuxin/services/trackbacks/151981.html</trackback:ping><description><![CDATA[<p><span style="color: #000000">在 数 据 库 中， 空 值 用 来 表 示 实 际 值 未 知 或 无 意 义 的 情 况。 在一 个 表 中， 如 果 一 行 中 的 某 列 没 有 值， 那 么 就 称 它 为 空 值（NULL）。 任 何 数 据 类 型 的 列, 只 要 没 有 使 用 非 空（NOT NULL） 或 主 键（PRIMARY KEY） 完 整 性 限 制， 都 可 以 出 现 空 值。在 实 际 应 用 中， 如 果 忽 略 空 值 的 存 在， 将 会 造 成 造 成 不 必 要 的 麻 烦。 </span>
<p><span style="color: #000000">---- 例 如， 在 下 面 的 雇 员 表（EMP） 中， 雇 员 名（ENAME）为KING 的 行， 因 为KING 为 最 高 官 员（PRESIDENT）， 他 没 有 主 管（MGR）， 所 以 其MGR 为 空值。 因 为 不 是 所 有 的 雇 员 都 有 手 续 费（COMM）， 所 以 列COMM 允 许 有 空 值，除300、500、1400、0 以 外 的 其 它 各 行COMM 均 为 空 值。 </span></p>
<pre><span style="color: #000000">EMPNO ENAME    JOB       MGR HIREDATE    SAL   COMM  DEPTNO<br />
---- -------- -------- --------- -------- ------ ---------<br />
7369 SMITH     CLERK     7902 17-DEC-80  800           20<br />
7499 ALLEN     SALESMAN  7698 20-FEB-81  1600    300   30<br />
7521 WARD      SALESMAN  7698 22-FEB-81  1250    500   30<br />
7566 JONES     MANAGER   7839 02-APR-81  2975          20<br />
7654 MARTIN    SALESMAN  7698 28-SEP-81  1250   1400   30<br />
7698 BLAKE     MANAGER   7839 01-MAY-81  2850          30<br />
7782 CLARK     MANAGER   7839 09-JUN-81  2450          10<br />
7788 SCOTT     ANALYST   7566 09-DEC-82  3000          20<br />
7839 KING      PRESIDENT      17-NOV-81  5000          10<br />
7844 TURNER    SALESMAN  7698 08-SEP-81  1500      0   30<br />
7876 ADAMS     CLERK     7788 12-JAN-83  1100          20<br />
7900 JAMES     CLERK     7698 03-DEC-81   950          30<br />
7902 FORD      ANALYST   7566 03-DEC-81  3000          20<br />
7934 MILLER    CLERK     7782 23-JAN-82  1300          10<br />
</span></pre>
<p><span style="color: #000000">---- 本 文 将 以 上 述EMP 表 为 例， 具 体 讨 论 一 下 空 值 在 日 常 应 用 中 所 具 有 的 一 些 特 性。 </span></p>
<p><span style="color: #000000">---- 一、 空 值 的 生 成 及 特 点 </span></p>
<p><span style="color: #000000">---- 1. 空 值 的 生 成 </span></p>
<p><span style="color: #000000">---- 如 果 一 列 没 有 非 空（NOT NULL） 完 整 性 限 制， 那 么 其 缺 省 的 值 为 空 值， 即 如 果 插 入 一 行 时 未 指 定 该 列 的 值， 则 其 值 为 空 值。 </span></p>
<p><span style="color: #000000">---- 使 用SQL 语 句INSERT 插 入 行， 凡 未 涉 及 到 的列， 其 值 为 空 值； 涉 及 到 的 列， 如 果 其 值 确 实 为 空 值， 插 入 时 可 以 用NULL 来 表 示（ 对 于字 符 型 的 列， 也 可 以 用'' 来 表 示）。 </span></p>
<p><span style="color: #000000">---- 例： 插 入 一 行， 其EMPNO 为1、ENAME 为'JIA'、SAL 为10000、job 和comm 为 空 值。 </span></p>
<pre><span style="color: #000000">SQL &gt;insert into emp(empno,ename,job,sal,comm) <br />
values(1,'JIA',NULL,1000,NULL);<br />
SQL &gt;select * from emp where empno=1;<br />
EMPNO ENAME  JOB   MGR HIREDATE    SAL    COMM    DEPTNO<br />
--------- ---------- --------- --------- --------- ---------<br />
1 JIA         1000<br />
</span></pre>
<p><span style="color: #000000">---- 可 以 看 到 新 插 入 的 一 行， 除job 和comm 为 空 值 外，mgr、hiredate、deptno 三 列 由 于 插 入 时 未 涉 及， 也 为 空 值。 </span></p>
<p><span style="color: #000000">---- 使 用SQL 语 句UPDATE 来 修 改 数 据， 空 值 可 用NULL 来 表 示（ 对 于 字 符 型 的 列， 也 可 以 用'' 来 表 示）。 例: </span></p>
<pre><span style="color: #000000">SQL &gt;update emp set ename=NULL,sal=NULL where empno=1;<br />
</span></pre>
<p><span style="color: #000000">---- 2. 空 值 的 特 点 </span></p>
<p><span style="color: #000000">---- 空 值 具 有 以 下 特 点： </span></p>
<p><span style="color: #000000">---- * 等 价 于 没 有 任 何 值。 </span></p>
<p><span style="color: #000000">---- * 与 0、 空 字 符 串 或 空 格 不 同。 </span></p>
<p><span style="color: #000000">---- * 在where 条 件 中, Oracle 认 为 结 果 为NULL 的 条 件 为FALSE， 带 有 这 样 条 件 的select 语 句 不 返 回 行， 并 且 不 返 回 错 误 信 息。 但NULL 和FALSE 是 不 同 的。 </span></p>
<p><span style="color: #000000">---- * 排 序 时 比 其 他 数 据 都 大。 </span></p>
<p><span style="color: #000000">---- * 空 值 不 能 被 索 引。 </span></p>
<p><span style="color: #000000">---- 二、 空 值 的 测 试 </span></p>
<p><span style="color: #000000">---- 因 为 空 值 表 示 缺 少 数 据， 所 以 空 值 和 其 它 值没 有 可 比 性， 即 不 能 用 等 于、 不 等 于、 大 于 或 小 于 和 其 它 数 值 比 较， 当 然 也 包 括 空 值 本身（ 但 是 在decode 中 例 外， 两 个 空 值 被 认 为 是 等 价）。 测 试 空 值 只 能 用 比 较 操 作 符IS NULL 和IS NOT NULL。 如 果 使 用 带 有 其 它 比 较 操 作 符 的 条 件 表 达 式， 并 且 其 结 果 依 赖于 空 值， 那 么 其 结 果 必 定 是NULL。 在where 条 件 中，Oracle 认 为 结 果 为NULL 的 条 件为FALSE， 带 有 这 样 条 件 的select 语 句 不 返 回 行， 也 不 返 回 错 误 信 息。 </span></p>
<p><span style="color: #000000">---- 例 如 查 询EMP 表 中MGR 为NULL 的 行： </span></p>
<pre><span style="color: #000000">SQL &gt;select * from emp where mgr='';  <br />
no rows selected<br />
SQL &gt;select * from emp where mgr=null;  <br />
no rows selected<br />
SQL &gt;select * from emp where mgr is null;<br />
EMPNO ENAME  JOB  MGR HIREDATE   SAL  COMM  DEPTNO<br />
---------- --------- --------- --------- ---------<br />
7839 KING  PRESIDENT  17-NOV-81  5000        10<br />
</span></pre>
<p><span style="color: #000000">---- 第1、2 句 写 法 不 妥，WHERE 条 件 结 果 为NULL， 不 返 回 行。 第 三 句 正 确， 返 回MGR 为 空 值 的 行。 </span></p>
<p><span style="color: #000000">---- 三、 空 值 和 操 作 符 </span></p>
<p><span style="color: #000000">---- 1. 空 值 和 逻 辑 操 作 符 </span></p>
<p><span style="color: #000000">---- 逻 辑 操 作 符 </span></p>
<p><span style="color: #000000">---- 表 达 式 </span></p>
<p><span style="color: #000000">---- 结 果 </span></p>
<pre><span style="color: #000000">AND<br />
NULL AND TRUE<br />
NULL<br />
<br />
NULL AND FALSE<br />
FALSE<br />
<br />
NULL AND NULL<br />
NULL<br />
OR<br />
NULL OR TRUE<br />
TRUE<br />
<br />
NULL OR FALSE<br />
NULL<br />
<br />
NULL OR NULL<br />
NULL<br />
NOT<br />
NOT NULL<br />
NULL<br />
</span></pre>
<p><span style="color: #000000">---- 可 以 看 到， 在 真 值 表 中， 除NULL AND FALSE 结 果 为FALSE、NULL OR TRUE 结 果 为TRUE 以 外， 其 它 结 果 均 为NULL。 </span></p>
<p><span style="color: #000000">---- 虽 然 在where 条 件 中，Oracle 认 为 结 果 为NULL 的WHERE 条 件 为FALSE， 但 在 条 件 表 达 式 中NULL 不 同 于FALSE。 例 如 在NOT （ NULL AND FALSE ） 和NOT （ NULL AND NULL ） 二 者 中 仅 有 一 处FALSE 和TRUE 的 区 别， 但NOT （ NULL AND FALSE ） 的 结 果 为 TRUE， 而NOT （ NULL AND NULL ） 的 结 果 为NULL。 </span></p>
<p><span style="color: #000000">---- 下 面 举 例 说 明 空 值 和 逻 辑 操 作 符 的 用 法： </span></p>
<pre><span style="color: #000000">SQL &gt; select * from emp where not comm=null and comm!=0;<br />
no rows selected<br />
SQL &gt; select * from emp where not ( not comm=null and comm!=0 );<br />
EMPNO ENAME  JOB      MGR  HIREDATE  SAL  COMM  DEPTNO<br />
---------- --------- --------- --------- ---------<br />
7844 TURNER SALESMAN  7698 08-SEP-81 1500   0     30<br />
</span></pre>
<p><span style="color: #000000">---- 第 一 个Select 语 句， 条 件"not comm=null and comm!=0" 等 价 于NULL AND COMM!=0。 对 于 任 意 一 行， 如 果COMM 为 不 等 于0 的 数 值， 条件 等 价 于NULL AND TRUE， 结 果 为NULL； 如 果COMM 等 于0， 条 件 等 价 于NULL AND FALSE，结 果 为FALSE。 所 以， 最 终 结 果 不 返 回 行。 </span></p>
<p><span style="color: #000000">---- 第 二 个Select 语 句 的 条 件 为 第 一 个Select 语句 条 件 的" 非"（NOT）， 对 于 任 意 一 行， 如 果COMM 为 不 等 于0 的 数 值， 条 件 等 价 于NOT NULL， 结 果 为NULL； 如 果COMM 等 于0， 条 件 等 价 于NOT FALSE， 结 果 为TRUE。 所 以， 最 终结 果 返 回 行COMM 等 于0 的 行。 </span></p>
<p><span style="color: #000000">---- 2. 空 值 和 比 较 操 作 符 </span></p>
<p><span style="color: #000000">---- （1）IS [NOT] NULL： 是 用 来 测 试 空 值 的 唯 一 操 作 符（ 见" 空 值 的 测 试"）。 </span></p>
<pre><span style="color: #000000">（2）=、!=、&gt;=、&lt;=、&gt;、&lt;<br />
SQL &gt;select ename,sal,comm from emp where sal &gt;comm;<br />
ENAME            SAL      COMM<br />
---------- --------- ---------<br />
ALLEN           1600       300<br />
WARD            1250       500<br />
TURNER          1500         0<br />
</span></pre>
<p><span style="color: #000000">---- sal 或comm 为 空 值 的 行，sal&gt;comm 比 较 结 果 为NULL， 所 以 凡 是sal 或comm 为 空 值 的 行 都 没 有 返 回。 </span></p>
<p><span style="color: #000000">---- （3）IN 和NOT IN 操 作 符 </span></p>
<pre><span style="color: #000000">SQL &gt;select ename,mgr from emp where mgr in (7902,NULL);<br />
ENAME            MGR<br />
---------- ---------<br />
SMITH           7902<br />
</span></pre>
<p><span style="color: #000000">---- 在 上 述 语 句 中， 条 件"mgr in (7902,NULL)" 等 价于mgr=7902 or mgr=NULL。 对 于 表EMP 中 的 任 意 一 行， 如 果mgr 为NULL， 则 上 述 条 件 等价 于NULL OR NULL， 即 为NULL； 如 果mgr 为 不 等 于7902 的 数 值， 则 上 述 条 件 等 价于FALSE OR NULL， 即 为NULL； 如 果mgr 等 于7902， 则 上 述 条 件 等 价 于TRUE OR NULL， 即为TRUE。 所 以， 最 终 结 果 能 返 回mgr 等 于7902 的 行。 </span></p>
<pre><span style="color: #000000">SQL &gt;select deptno from emp where deptno not in ('10',NULL);<br />
no rows selected<br />
</span></pre>
<p><span style="color: #000000">---- 在 上 述 语 句 中， 条 件"deptno not in ('10',NULL)" 等 价 于deptno!='10' and deptno!=NULL， 对 于EMP 表 中 的 任 意 一 行，条 件 的 结 果 只 能 为NULL 或FALSE， 所 以 不 返 回 行。 </span></p>
<p><span style="color: #000000">---- （4）any,some </span></p>
<pre><span style="color: #000000">SQL &gt;select ename,sal from emp where sal &gt; any(3000,null);<br />
ENAME            SAL<br />
---------- ---------<br />
KING            5000<br />
</span></pre>
<p><span style="color: #000000">---- 条 件"sal &gt; any(3000,null)" 等 价 于sal &gt;3000 or sal &gt;null。 类 似 前 述（3） 第 一 句， 最 终 结 果 返 回 所 有sal &gt;3000 的 行。 </span></p>
<p><span style="color: #000000">---- （5）All </span></p>
<pre><span style="color: #000000">SQL &gt;select ename,sal from emp where sal &gt; all(3000,null);<br />
no rows selected<br />
</span></pre>
<p><span style="color: #000000">---- 条 件"sal&gt; all(3000,null)" 等 价 于sal &gt;3000 and sal &gt;null, 结 果 只 能 为NULL 或FALSE， 所 以 不 返 回 行。 </span></p>
<p><span style="color: #000000">---- （6）（not）between </span></p>
<pre><span style="color: #000000">SQL &gt;select ename,sal from emp where sal between null and 3000;<br />
no rows selected<br />
</span></pre>
<p><span style="color: #000000">---- 条 件"sal between null and 3000" 等 价 于sal &gt;=null and sal&lt; =3000, 结 果 只 能 为NULL 或FALSE， 所 以 不 返 回 行。 </span></p>
<pre><span style="color: #000000">SQL &gt;select ename,sal from emp where sal not between null and 3000;<br />
ENAME            SAL<br />
---------- ---------<br />
KING            5000<br />
</span></pre>
<p><font color="#a52a2a"><span style="color: #000000">---- 条 件"sal not between null and 3000" 等 价 于sal<null sal="" or="">3000, 类 似 前 述（3） 的 第 一 句， 结 果 返 回sal&gt;3000 的 行。 </null></span></font></p>
<p><span style="color: #000000">---- 下 表 为 比 较 操 作 符 和 空 值 的 小 结： </span></p>
<p><span style="color: #000000">---- 比 较 操 作 符 </span></p>
<p><span style="color: #000000">---- 表 达 式（ 例：A、B 是NULL、C=10） </span></p>
<p><span style="color: #000000">---- 结 果 </span></p>
<pre><span style="color: #000000">IS NULL、IS NOT NULL<br />
A IS NULL<br />
TRUE<br />
<br />
A IS NOT NULL<br />
FALSE<br />
<br />
C IS NULL<br />
FALSE<br />
<br />
C IS NOT NULL<br />
TRUE<br />
=、!=、&gt;=、&lt; =、&gt;、&lt; <br />
A = NULL<br />
NULL<br />
<br />
A &gt; NULL<br />
NULL<br />
<br />
C = NULL<br />
NULL<br />
<br />
C &gt; NULL<br />
NULL<br />
IN (=ANY)<br />
A IN (10,NULL)<br />
NULL<br />
<br />
C IN (10,NULL)<br />
TRUE<br />
<br />
C IN (20,NULL)<br />
NULL<br />
NOT IN <br />
( 等 价 于 ！=ALL)<br />
A NOT IN (20,NULL)<br />
NULL<br />
<br />
C NOT IN (20,NULL)<br />
FALSE<br />
<br />
C NOT IN (10,NULL)<br />
NULL<br />
ANY，SOME<br />
A &gt; ANY(5,NULL)<br />
NULL<br />
<br />
C &gt; ANY(5,NULL)<br />
TRUE<br />
<br />
C &gt; ANY(15,NULL)<br />
NULL<br />
ALL<br />
A &gt; ALL(5,NULL)<br />
NULL<br />
<br />
C &gt; ALL(5,NULL)<br />
NULL<br />
<br />
C &gt; ALL(15,NULL)<br />
FALSE<br />
(NOT)BETWEEN<br />
A BETWEEN 5 AND NULL<br />
NULL<br />
<br />
C BETWEEN 5 AND NULL<br />
NULL<br />
<br />
C BETWEEN 15 AND NULL<br />
FALSE<br />
<br />
A NOT BETWEEN 5 AND NULL<br />
NULL<br />
<br />
C NOT BETWEEN 5 AND NULL<br />
NULL<br />
<br />
C NOT BETWEEN 15 AND NULL<br />
TRUE<br />
</span></pre>
<p><span style="color: #000000">---- 3、 空 值 和 算 术、 字 符 操 作 符 </span></p>
<p><span style="color: #000000">---- （1） 算 术 操 作 符： 空 值 不 等 价 于0， 任 何 含 有 空 值 的 算 术 表 达 式 其 运 算 结 果 都 为 空 值， 例 如 空 值 加10 为 空 值。 </span></p>
<p><span style="color: #000000">---- （2） 字 符 操 作 符||： 因 为ORACLE 目 前 处 理 零个 字 符 值 的 方 法 与 处 理 空 值 的 方 法 相 同（ 日 后 的 版 本 中 不 一 定 仍 然 如 此）， 所 以 对于||， 空 值 等 价 于 零 个 字 符 值。 例： </span></p>
<pre><span style="color: #000000">SQL &gt;select ename,mgr,ename||mgr,sal,comm,sal+comm from emp;<br />
ENAME            MGR ENAME||MGR          SAL      COMM  SAL+COMM<br />
---------- --------- ------------- --------- --------- ---------<br />
SMITH           7902 SMITH7902           800 <br />
ALLEN           7698 ALLEN7698          1600       300      1900<br />
WARD            7698 WARD7698           1250       500      1750<br />
JONES           7839 JONES7839          2975 <br />
MARTIN          7698 MARTIN7698         1250      1400      2650<br />
BLAKE           7839 BLAKE7839          2850 <br />
CLARK           7839 CLARK7839          2450 <br />
SCOTT           7566 SCOTT7566          3000 <br />
KING                 KING               5000 <br />
TURNER          7698 TURNER7698         1500         0      1500<br />
ADAMS           7788 ADAMS7788          1100 <br />
JAMES           7698 JAMES7698           950 <br />
FORD            7566 FORD7566           3000 <br />
MILLER          7782 MILLER7782         1300 <br />
</span></pre>
<p><span style="color: #000000">---- 我 们 可 以 看 到， 凡mgr 为 空 值 的，ename||mgr 结 果 等 于ename； 凡 是comm 为 空 值 的 行，sal+comm 均 为 空 值。 </span></p>
<p><span style="color: #000000">---- 四、 空 值 和 函 数 </span></p>
<p><span style="color: #000000">---- 1 ． 空 值 和 度 量 函 数 </span></p>
<p><span style="color: #000000">---- 对 于 度 量 函 数， 如 果 给 定 的 参 数 为 空 值， 则 其（NVL、TRANSLATE 除 外） 返 回 值 为 空 值。 如 下 例 中 的ABS（COMM）， 如 果COMM 为 空 值，ABS(COMM) 为 空 值。 </span></p>
<pre><span style="color: #000000">SQL &gt; select ename,sal,comm,abs(comm) from emp where sal&lt; 1500;<br />
ENAME            SAL      COMM ABS(COMM)<br />
---------- --------- --------- ---------<br />
SMITH            800<br />
WARD            1250       500       500<br />
MARTIN          1250      1400      1400<br />
ADAMS           1100<br />
JAMES            950<br />
MILLER          1300<br />
</span></pre>
<p><span style="color: #000000">---- 2. 空 值 和 组 函 数 </span></p>
<p><span style="color: #000000">---- 组 函 数 忽 略 空 值。 在 实 际 应 用 中， 根 据 需 要 可 利 用nvl 函 数 用 零 代 替 空 值。 例： </span></p>
<pre><span style="color: #000000">SQL &gt;select count(comm),sum(comm),avg(comm) from emp;<br />
COUNT(COMM) SUM(COMM) AVG(COMM)<br />
----------- --------- ---------<br />
4      2200       550<br />
SQL &gt;select count(nvl(comm,0)),sum(nvl(comm,0)),avg(nvl(comm,0))<br />
from emp;<br />
COUNT(NVL(COMM,0)) SUM(NVL(COMM,0)) AVG(NVL(COMM,0))<br />
------------------ ---------------- ----------------<br />
14             2200        157.14286<br />
</span></pre>
<p><span style="color: #000000">---- 第 一 个SELECT 语 句 忽 略COMM 为 空 值 的 行， 第 二个SELECT 语 句 使 用NVL 函 数 统 计 了 所 有 的COMM， 所 以 它 们 统 计 的 个 数、 平 均 值 都 不 相同。 另 外 需 要 注 意 的 是， 在 利 用 组 函 数 进 行 数 据 处 理 时， 不 同 的 写 法 具 有 不 同 的 不 同含 义， 在 实 际 应 用 中 应 灵 活 掌 握。 例 如： </span></p>
<pre><span style="color: #000000">SQL &gt;select deptno,sum(sal),sum(comm), <br />
sum(sal+comm),sum(sal)+sum(comm),sum(nvl(sal,0)+nvl(comm,0)) <br />
from emp<br />
group by deptno;<br />
DEPTNO  SUM(SAL) SUM(COMM) SUM(SAL+COMM) SUM(SAL)<br />
+SUM(COMM) SUM(NVL(SAL,0)+NVL(COMM,0))<br />
--------- --------- --------- ------------- ------- <br />
10   8750                             8750<br />
20   10875                            10875<br />
30   9400      2200       7800        11600 11600<br />
</span></pre>
<p><span style="color: #000000">---- 可 以 看 到SUM(SAL+COMM)、SUM(SAL)+SUM(COMM)、 SUM(NVL(SAL,0)+NVL(COMM,0)) 的 区 别：SUM(SAL+COMM) 为 先 加 然 后 计 算 各 行 的 和，如 果SAL、COMM 中 有 一 个 为NULL， 则 该 行 忽 略 不 计；SUM(SAL)+SUM(COMM) 为 先 计 算 各 行的 合 计 然 后 再 加，SAL、COMM 中 的NULL 都 忽 略 不 计， 但 如 果 SUM(SAL)、SUM(COMM) 二 者的 结 果 之 中 有 一 个 为NULL， 则 二 者 之 和 为NULL； 在SUM(NVL(SAL,0)+NVL(COMM,0)) 里，SAL、COMM 中 的NULL 按0 处 理。 </span></p>
<p><span style="color: #000000">---- 五、 空 值 的 其 它 特 性 </span></p>
<p><span style="color: #000000">---- 1. 空 值 在 排 序 时 大 于 任 何 值。 例 如： </span></p>
<pre><span style="color: #000000">SQL &gt; select ename,comm from emp where deptno='30' order by comm；<br />
ENAME           COMM<br />
---------- ---------<br />
TURNER             0<br />
ALLEN            300<br />
WARD             500<br />
MARTIN          1400<br />
BLAKE <br />
JAMES<br />
</span></pre>
<p><span style="color: #000000">---- 2. 空 值 不 能 被 索 引。 虽 然 在 某 列 上 建 立 了 索 引，但 是 对 该 列 的 空 值 查 询 来 说， 因 为 空 值 没 有 被 索 引， 所 以 不 能 改 善 查 询 的 效 率。 例 如下 面 的 查 询 不 能 利 用 在MGR 列 上 创 建 的 索 引。 </span></p>
<pre><span style="color: #000000">SQL &gt;select ename from emp where mgr is null;<br />
ENAME<br />
----------<br />
KING<br />
</span></pre>
<p><span style="color: #000000">---- 另 外 正 是 因 为 空 值 不 被 索 引， 所 以 可 在 含 有 空 值 的 列 上 建 立 唯 一 性 索 引（UNIQUE INDEX）。 例 如， 可 以 在EMP 表 的COMM 列 上 建 立 唯 一 性 索 引： </span></p>
<pre><span style="color: #000000">SQL &gt;  create unique index emp_comm on emp(comm);<br />
Index created.</span></pre>
<img src ="http://www.blogjava.net/hllwuxin/aggbug/151981.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hllwuxin/" target="_blank">優雅Ｄě頽廢</a> 2007-10-11 11:14 <a href="http://www.blogjava.net/hllwuxin/archive/2007/10/11/151981.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle常用命令</title><link>http://www.blogjava.net/hllwuxin/archive/2007/09/19/146433.html</link><dc:creator>優雅Ｄě頽廢</dc:creator><author>優雅Ｄě頽廢</author><pubDate>Wed, 19 Sep 2007 05:18:00 GMT</pubDate><guid>http://www.blogjava.net/hllwuxin/archive/2007/09/19/146433.html</guid><wfw:comment>http://www.blogjava.net/hllwuxin/comments/146433.html</wfw:comment><comments>http://www.blogjava.net/hllwuxin/archive/2007/09/19/146433.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hllwuxin/comments/commentRss/146433.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hllwuxin/services/trackbacks/146433.html</trackback:ping><description><![CDATA[<p style="text-indent: 2em">用户登陆</p>
<p style="text-indent: 2em">Connect</p>
<p style="text-indent: 2em">查看当前用户</p>
<p style="text-indent: 2em">Show user;</p>
<p style="text-indent: 2em">查看所有用户</p>
<p style="text-indent: 2em">Select username from dba_users;</p>
<p style="text-indent: 2em">创建用户</p>
<p style="text-indent: 2em">Create user 'Name' identified by 'Password';</p>
<p style="text-indent: 2em">授BDA最高权限</p>
<p style="text-indent: 2em">Grant DBA to 'Name';</p>
<p style="text-indent: 2em">授所有普通权限</p>
<p style="text-indent: 2em">Grant connect,reource to 'Name';</p>
<p style="text-indent: 2em">授权登陆</p>
<p style="text-indent: 2em">Grant create session to 'Name';</p>
<p style="text-indent: 2em">授权建表</p>
<p style="text-indent: 2em">Grant create table BMW();</p>
<p style="text-indent: 2em">授权无限表空间</p>
<p style="text-indent: 2em">Grant create umlimited tablespace to 'Name';</p>
<p style="text-indent: 2em">授查询权限</p>
<p style="text-indent: 2em">Grant select on BMW to 'Name';</p>
<p style="text-indent: 2em">撤消查询权限</p>
<p style="text-indent: 2em">Revoke select on BMW to 'Name';</p>
<p style="text-indent: 2em">修改自己的密码(登陆自己的用户)</p>
<p style="text-indent: 2em">Alter user 'name' identified by 'password';</p>
<p style="text-indent: 2em">修改别人的密码(登陆超级用户)</p>
<p style="text-indent: 2em">Alter user 'name' identified by 'password';</p>
<p style="text-indent: 2em">不输入密码登陆(*只能登陆SYS用户)</p>
<p style="text-indent: 2em">Connect / as sysdba</p>
<p style="text-indent: 2em">数据库操作部分</p>
<p style="text-indent: 2em">建表</p>
<p style="text-indent: 2em">create table BMW(</p>
<p style="text-indent: 2em">2 SN number(10) constraint zph1 primary key,</p>
<p style="text-indent: 2em">3 Model varchar2(20) constraint zph2 not null,</p>
<p style="text-indent: 2em">4 Color varchar2(10) constraint zph3 references BMW(Color),</p>
<p style="text-indent: 2em">5 Barcode number(30) constraint zph4 unique,</p>
<p style="text-indent: 2em">6 Price number(7) constraint zph5 check(Price between 10 and 90));</p>
<p style="text-indent: 2em">添加字段</p>
<p style="text-indent: 2em">Alter table 'Apellation' add('fieldname' 'fieldtype');</p>
<p style="text-indent: 2em">删除字段</p>
<p style="text-indent: 2em">Alter table 'Apellation' drop column 'fieldname';</p>
<p style="text-indent: 2em">修改字段长度</p>
<p style="text-indent: 2em">Alter table 'Apellation' modify('fieldname' 'fieldtype');</p>
<p style="text-indent: 2em">修改字段类型</p>
<p style="text-indent: 2em">Alter table 'Apellation' modify('fieldname' 'fieldtype');</p>
<p style="text-indent: 2em">向表中插入一条记录(所有字段)</p>
<p style="text-indent: 2em">Insert into 'Apellation' values('data','data',data,);</p>
<p style="text-indent: 2em">向表中插入一条记录(部分字段)</p>
<p style="text-indent: 2em">Insert into 'Apellation'('fieldname') values('data');</p>
<p style="text-indent: 2em">修改表中一个字段</p>
<p style="text-indent: 2em">Updata 'Apellation' set 'fieldname'='xxx' where 'fieldname'='id';</p>
<p style="text-indent: 2em">删除表中所有记录</p>
<p style="text-indent: 2em">Delete from 'Apellation';</p>
<p style="text-indent: 2em">删除表的结构和记录</p>
<p style="text-indent: 2em">Drop table 'Apellation';</p>
<p style="text-indent: 2em">查看某个表所有记录</p>
<p style="text-indent: 2em">Select * from 'Apellation';</p>
<p style="text-indent: 2em">查看某个表指定记录</p>
<p style="text-indent: 2em">Select 'fieldname'，'fieldname' from 'Apellation';</p>
<p style="text-indent: 2em">查看别人的表的记录(在别人先授查表权情况下)</p>
<p style="text-indent: 2em">Select * from 'name'.'Apellation';</p>
<p style="text-indent: 2em">查看当前用户下所有表</p>
<p style="text-indent: 2em">Select * from tab;</p>
<p style="text-indent: 2em">查看表结构</p>
<p style="text-indent: 2em">desc 'Apellation';</p>
<p style="text-indent: 2em">控制不换行显示</p>
<p style="text-indent: 2em">Set linesize 'Parameter'</p>
<p style="text-indent: 2em">控制每页显示行数</p>
<p style="text-indent: 2em">Set pagesize 'Parameter'</p>
<p style="text-indent: 2em">升序排列显示</p>
<p style="text-indent: 2em">Select * from 'Apellation';</p>
<p style="text-indent: 2em">交互式插入记录</p>
<p style="text-indent: 2em">Insert into 'Apellation' values('&amp;data','&amp;data',&amp;data,);</p>
<p style="text-indent: 2em">转义字符</p>
<p style="text-indent: 2em">set escape on</p>
<p style="text-indent: 2em">Insert into 'Apellation' values('data','data',da\&amp;ta,);</p>
<p style="text-indent: 2em">特殊命令部分</p>
<p style="text-indent: 2em">清除屏幕</p>
<p style="text-indent: 2em">Clear screen</p>
<p style="text-indent: 2em">文件日志命令</p>
<p style="text-indent: 2em">Spool F:\zph.txt</p>
<p style="text-indent: 2em">Spool off</p>
<p style="text-indent: 2em">提交命令</p>
<p style="text-indent: 2em">Commit</p>
<p style="text-indent: 2em">回滚命令</p>
<p style="text-indent: 2em">Rollback</p>
<p style="text-indent: 2em">设置保存点</p>
<p style="text-indent: 2em">Savepoint 'zph1'</p>
<p style="text-indent: 2em">查当前日期格式</p>
<p style="text-indent: 2em">select * from nls_session_parameters;</p>
<p style="text-indent: 2em">更改日期格式</p>
<p style="text-indent: 2em">Alter session set nls_date_format='yyyy-mm-dd';</p>
<p style="text-indent: 2em">更改数字显示格式</p>
<p style="text-indent: 2em">Column barcode format 999999999999999999999999999999;</p>
<p style="text-indent: 2em">调整行宽</p>
<p style="text-indent: 2em">Set linesize 200</p>
<p style="text-indent: 2em">调整显示字数</p>
<p style="text-indent: 2em">Set pagesize 100</p>
<img src ="http://www.blogjava.net/hllwuxin/aggbug/146433.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hllwuxin/" target="_blank">優雅Ｄě頽廢</a> 2007-09-19 13:18 <a href="http://www.blogjava.net/hllwuxin/archive/2007/09/19/146433.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>