eygle.com   eygle.com
eygle.com  
 

« January 2006 | Blog首页 | March 2006 »

1 2 3 4 下一页


February 28, 2006

2月份的最后一天

作者:eygle

出处:http://blog.eygle.com

2月份的最后一天终于来临.这个月很短,但是感觉却极为漫长.也许是这个月经历了太多事情的缘故吧.

就让我简单的做一个回顾:

1.在家过年,2月5日回到北京

虽然回家极为艰难,回京的路相当曲折,但是这个新年过的很快乐.没有什么比和家人团聚在一起更让人开心的了.

2.去广州,见到了我的Julia

很多事情是不可预料的,爱情也是那么突如其来,也许是因为我从没放弃等待,所以上天愿意给我巨大的恩赐.

谢谢Julia,你的出现让我2006年的一大愿望不再遥不可及:)

3.公司联通平台的搬迁

平滑搬迁,再加上存储的升级,这个工作延续了近2个星期,同事们完成得非常出色,我非常的感谢他们.

然后在这个月底,我的领导辞职离开公司,去开创自己的事业,我祝福他在自己喜欢的领域里能够一帆风顺.

4.我的新DBA就要到任

在经历了漫长的招聘和一点小小的意外之后,我的DBA终于要到任了.明天Selina将来到公司报道.

这次招聘历时三个月,超长了.希望在这个新的环境里,Selina能够工作愉快,能够喜欢我们这里.

5.可爱的安安

今天,朋友发来了安安网页,安安的爸爸结婚,我是伴郎,现在下一代已经开始在追着我们老去了.可是看着这可爱的Baby,你会觉得老去是值得的.

我愿天下的有情人,都能够早成眷属.

这个月,值得纪念,新的一年,新的历程由此开始.

我愿大家永能享有快乐,好运相随!

Posted by eygle at 10:19 PM | Comments (11)


February 27, 2006

Oracle9i基于视图(view)的约束声名

作者:eygle

出处:http://blog.eygle.com

从Oracle9i开始,Oracle允许对于视图(view)进行主键、唯一键、外键约束的声名。NOT NULL约束可以从基表继承,所以不允许显示声明。
由于视图约束仅仅是声明而已,所以其状态只能是DISABLE NOVALIDATE。

以下是一个简单范例说明:

SQL> CREATE VIEW d10_emp
  2  ( empno, ename, job,deptno,
  3  CONSTRAINT pk_d10
  4  PRIMARY KEY (ename)
  5  RELY DISABLE NOVALIDATE
  6  ) AS
  7  SELECT empno, ename, job ,deptno
  8  FROM emp
  9  WHERE deptno = 10; 
View created.
SQL> select * from d10_emp;
     EMPNO ENAME      JOB           DEPTNO
---------- ---------- --------- ----------
      7782 CLARK      MANAGER           10
      7839 KING       PRESIDENT         10
      7934 MILLER     CLERK             10
SQL> select CONSTRAINT_NAME,TABLE_NAME,CONSTRAINT_TYPE from user_constraints
  2  where table_name='D10_EMP';
CONSTRAINT_NAME                TABLE_NAME                     C
------------------------------ ------------------------------ -
PK_D10                         D10_EMP                        P 

由于此约束仅仅为"约束声明",所以不具有实际约束力:

SQL> insert into d10_emp values(7777,'EYGLE','MANAGER',10);
1 row created.
SQL> insert into d10_emp values(8888,'EYGLE','MANAGER',10);
1 row created.
SQL> select * from d10_emp;
     EMPNO ENAME      JOB           DEPTNO
---------- ---------- --------- ----------
      7782 CLARK      MANAGER           10
      7839 KING       PRESIDENT         10
      7934 MILLER     CLERK             10
      7777 EYGLE      MANAGER           10
      8888 EYGLE      MANAGER           10 

Posted by eygle at 5:27 PM | Comments (6)


基于主键和唯一约束的显示索引控制

作者:eygle

出处:http://blog.eygle.com

从Oracle9i开始,主键创建时的索引和唯一性约束可以在建表时独立定义。
随后,约束可以被独立drop,而索引可以保留。这是Oracle9i中对于索引增强的几个特性之一。

SQL> CREATE TABLE employees
  2  (
  3    empno NUMBER(6),
  4    NAME VARCHAR2(30),
  5    dept_no NUMBER(2),
  6    CONSTRAINT emp_pk PRIMARY KEY(empno)
  7      USING INDEX
  8      (CREATE UNIQUE INDEX emp_pk_idx ON employees(empno))
  9  );
Table created.
SQL> select index_name,UNIQUENESS from user_indexes
  2  where table_name=upper('employees');
INDEX_NAME                     UNIQUENES
------------------------------ ---------
EMP_PK_IDX                     UNIQUE
SQL> select CONSTRAINT_NAME,CONSTRAINT_TYPE,INDEX_NAME from user_constraints
  2  where table_name=upper('employees');
CONSTRAINT_NAME                C INDEX_NAME
------------------------------ - ------------------------------
EMP_PK                         P EMP_PK_IDX 

Oracle9i中新增的命令可以用以DROP约束保留索引.

ALTER TABLE employees DROP PRIMARY KEY KEEP INDEX;

SQL> ALTER TABLE employees DROP PRIMARY KEY KEEP INDEX;
Table altered.
SQL> select index_name,UNIQUENESS from user_indexes
  2  where table_name=upper('employees');
INDEX_NAME                     UNIQUENES
------------------------------ ---------
EMP_PK_IDX                     UNIQUE 

对于隐式创建的主键索引,同样可以使用此种方式保留:

SQL> CREATE TABLE employees
  2  (
  3    empno NUMBER(6) primary key,
  4    NAME VARCHAR2(30),
  5    dept_no NUMBER(2)
  6  );
Table created.
SQL> ALTER TABLE employees DROP PRIMARY KEY KEEP INDEX;
Table altered.
SQL> select index_name,UNIQUENESS from user_indexes
  2  where table_name=upper('employees');
INDEX_NAME                     UNIQUENES
------------------------------ ---------
SYS_C004180                    UNIQUE

Posted by eygle at 12:18 PM | Comments (1)


February 26, 2006

Oracle HowTo:如何使用Leading提示改变表连接方式

作者:eygle

出处:http://blog.eygle.com

在多表联合查询中,当使用Ordered提示改变SQL执行计划之后,通常我们很难再次控制结果集中进一步Join的顺序.

这时候我们可以使用Oracle提供的另外一个Hints: Leading 提示.

这个Hints在Oracle9i中的含义为:

The LEADING hint causes Oracle to use the specified table as the first table in the join order.

If you specify two or more LEADING hints on different tables, then all of them are ignored. If you specify the ORDERED hint, then it overrides all LEADING hints.

通过Leading 和 use_hash 提示连用,我们可以巧妙的影响SQL中表和结果集的Join顺序.

我们通过如下示例看一下这个提示是如何影响SQL执行的:

SQL> SELECT /*+ leading(t_max) use_hash(t_max t_middle) */ COUNT (*)
  2    FROM t_small, t_max, t_middle
  3  WHERE t_small.object_id = t_middle.object_id
  4  AND t_middle.object_id = t_max.object_id
  5  /
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=262 Card=1 Bytes=12)
   1    0   SORT (AGGREGATE)
   2    1     HASH JOIN (Cost=262 Card=400 Bytes=4800)
   3    2       HASH JOIN (Cost=225 Card=113776 Bytes=910208)
   4    3         TABLE ACCESS (FULL) OF 'T_MAX' (Cost=151 Card=113792 Bytes=455168)
   5    3         TABLE ACCESS (FULL) OF 'T_MIDDLE' (Cost=39 Card=28447 Bytes=113788)
   6    2       TABLE ACCESS (FULL) OF 'T_SMALL' (Cost=2 Card=100 Bytes=400) 

我们看到,通过这两个Hints的联合使用,该查询首先对T_MAX和T_MIDDLE表进行HASH JOIN,再以这个结果集同T_SMALL进行HASH JION.

单纯通过Ordered和USE_HASH提示通常是达不到这个效果的:

SQL> SELECT /*+ ordered use_hash(t_max t_middle) */ COUNT (*)
  2    FROM  t_max, t_middle,t_small
  3  WHERE t_small.object_id = t_middle.object_id
  4  AND t_middle.object_id = t_max.object_id
  5  /
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=228 Card=1 Bytes=12)
   1    0   SORT (AGGREGATE)
   2    1     HASH JOIN (Cost=228 Card=400 Bytes=4800)
   3    2       TABLE ACCESS (FULL) OF 'T_SMALL' (Cost=2 Card=100 Bytes=400)
   4    2       HASH JOIN (Cost=225 Card=113776 Bytes=910208)
   5    4         TABLE ACCESS (FULL) OF 'T_MAX' (Cost=151 Card=113792 Bytes=455168)
   6    4         TABLE ACCESS (FULL) OF 'T_MIDDLE' (Cost=39 Card=28447 Bytes=113788)

这是Leading  Hints在Oracle9i中的一个特殊用法.

 

Posted by eygle at 12:21 PM | Comments (5)


February 25, 2006

逻辑严谨与数据安全

作者:eygle

出处:http://blog.eygle.com

这几天,一则消息在网上广为流传:黑客侵入北京移动充值中心,盗取密码谋利370万.主要内容说的是:

    UT斯达康有限公司深圳分公司某工程师利用互联网,多次侵入中国移动充值中心数据库修改密码后进行销售。自2005年3月以来,造成北京移动通信有限责任公司损害共计价值人民币370余万元。

据更详细报道称:

该工程师利用他为西藏移动做技术时使用的密码(此密码自其离开后一直没有更改),轻松进入了西藏移动的服务器。通过西藏移动的服务器,...又跳转到了北京移动数据库,取得了数据库的最高权限,并通过读取数据库日志文件,反推破译出密码。

我们看到,此次安全事件最主要的原因是因为工程密码从来就没有修改过,从而带来了安全漏洞.说这是黑客攻击,其实还算不上.只能说是因为管理不擅的人为原因导致了这次入侵及损失.

在这次事件中,我想说的是,也许受损失更大的并不是中国移动,而是UT斯达康的这位工程师.移动的损失可以被追回被弥补,可是这次事件给这位工程师带来的伤害可能是一生的.

如果大家不幸看过《无极》或者幸运的看过《一个馒头引发的血案》,你可能就可以理解:当陈满神拿一生的荣华富贵来引诱只有一个馒头的小女孩的时候,可怜的孩子上当了;当中国移动把保险箱的大门向这位工程师开放的时候,他犹豫了,他同样做出了错误的选择。

我并非为这个孩子开脱,只是我们可不可以责备一下呢:中国移动你为什么不把大门锁好?

话题扯远了,我其实想说说数据安全。

同以前我在DBA生存守则里表达的一样,8/2法则在这个领域同样适用,其实80%的安全问题全是由于人为的疏忽,原本可以轻易避免的,在疏忽之下就被无限放大。在任何时候我们都不能心存侥幸.

在关于数据库备份的文章中,我曾经提到:

备份重于一切
          系统总是要崩溃的,没有有效的备份只是等哪一天死!

在安全领域也是同样,如果你心里没有安全意识和忧患意识,那么系统被攻破或遭受损失只是早晚而已。

提高系统的安全性通常可以来自两个方面:

1.严谨的个人以及严谨的执行
2.可靠的制度和严格的执行

我们知道,可靠的制度通常来自严谨的思考和不断的探索,在未有制度之前,我们需要人才,他们可以通过自身的严密思考和稳健逻辑构建高效安全的系统;在系统逐渐成熟的过程中,制度得以建立。有了制度以后,后来人只需要贯彻执行就不会出太大的问题。汉代的约法三章萧规曹随;美国的大陆会议、独立宣言,莫不为一国奠定了立国之本。可见好的先行者和良好制度以及严格执行是多么的重要。

我相信中国移动的各项制度恐怕都是有的,只不过没有被有效的执行而已。形同虚设的制度有等若无。

在缺少天才的时代,我们需要规则来维持秩序。

 

Posted by eygle at 2:21 PM | Comments (7)


如何使用ordered提示改变SQL执行计划

作者:eygle

出处:http://blog.eygle.com

ORDERED提示强制Oracle按照From子句中表出现的顺序进行表连接。

通过ordered提示,可以避免CBO SQL解析过程中的表连接评估,从而避免Oracle产生错误的执行计划,或者强制Oracle按照我们指定的方式执行。

在很多时候,当我们清楚地了解数据结构和数据分布之后,就可以通过ORDERED提示来提高SQL性能。

通过以下例子我们来说明一下Ordered提示的作用.

1.不加Hints时SQL的执行计划

SQL> set autotrace trace explain
SQL>  SELECT COUNT (*)
  2    FROM t_small, t_max, t_middle
  3   WHERE t_small.object_id = t_middle.object_id
  4   AND t_middle.object_id = t_max.object_id;
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=194 Card=1 Bytes=12)
   1    0   SORT (AGGREGATE)
   2    1     HASH JOIN (Cost=194 Card=400 Bytes=4800)
   3    2       HASH JOIN (Cost=42 Card=100 Bytes=800)
   4    3         TABLE ACCESS (FULL) OF 'T_SMALL' (Cost=2 Card=100 Bytes=400)
   5    3         TABLE ACCESS (FULL) OF 'T_MIDDLE' (Cost=39 Card=28447 Bytes=113788)
   6    2       TABLE ACCESS (FULL) OF 'T_MAX' (Cost=151 Card=113792 Bytes=455168)
 

我们可以通过10053事件跟踪一下该SQL的解析:

SQL> alter session set events='10053 trace name context forever,level 1';
Session altered.
SQL> explain plan for
  2  SELECT COUNT (*)
  3    FROM t_small, t_max, t_middle
  4  WHERE t_small.object_id = t_middle.object_id
  5  AND t_middle.object_id = t_max.object_id;   
Explained. 

查看Trace文件可以看到,Oracle需要进行3! (6)次表连接顺序的评估:

bash-2.03$ cat testora9_ora_10862.trc |grep "Join order"
Join order[1]: T_SMALL [T_SMALL] T_MIDDLE [T_MIDDLE] T_MAX [T_MAX]
Join order[2]: T_SMALL [T_SMALL] T_MAX [T_MAX] T_MIDDLE [T_MIDDLE]
Join order[3]: T_MIDDLE [T_MIDDLE] T_SMALL [T_SMALL] T_MAX [T_MAX]
Join order[4]: T_MIDDLE [T_MIDDLE] T_MAX [T_MAX] T_SMALL [T_SMALL]
Join order[5]: T_MAX [T_MAX] T_SMALL [T_SMALL] T_MIDDLE [T_MIDDLE]
Join order[6]: T_MAX [T_MAX] T_MIDDLE [T_MIDDLE] T_SMALL [T_SMALL]  

2.当我们使用Ordered提示之后

SQL的执行计划如下(from子句后的表顺序作了调整):

SQL> SELECT /*+ ordered */ COUNT (*)
  2    FROM t_middle, t_small, t_max
  3  WHERE t_small.object_id = t_middle.object_id
  4  AND t_middle.object_id = t_max.object_id; 
Execution Plan
----------------------------------------------------------
   0      SELECT STATEMENT Optimizer=CHOOSE (Cost=197 Card=1 Bytes=12)
   1    0   SORT (AGGREGATE)
   2    1     HASH JOIN (Cost=197 Card=400 Bytes=4800)
   3    2       HASH JOIN (Cost=45 Card=100 Bytes=800)
   4    3         TABLE ACCESS (FULL) OF 'T_MIDDLE' (Cost=39 Card=28447 Bytes=113788)
   5    3         TABLE ACCESS (FULL) OF 'T_SMALL' (Cost=2 Card=100 Bytes=400)
   6    2       TABLE ACCESS (FULL) OF 'T_MAX' (Cost=151 Card=113792 Bytes=455168) 

再看10053的跟踪Trace文件:

bash-2.03$ grep "Join order" testora9_ora_10918.trc
Join order[1]: T_MIDDLE [T_MIDDLE] T_SMALL [T_SMALL] T_MAX [T_MAX]  

Oracle只需要按照表在From子句中的出现顺序进行连接,从而按照我们的意图进行解析或执行.

这就是Ordered提示的基本作用,本例只是一个示范说明,后者的执行计划使得Cost激增,在实际应用中,我们当然是不希望看到此类增长的.

 

Posted by eygle at 12:28 PM | Comments (0)


February 24, 2006

微软老矣 尚能变否?

作者:eygle

出处:http://blog.eygle.com

不知道这几天碰到了MS的哪根神经,cidaemon.exe进程开始狂耗CPU,系统CPU资源随时消耗在100%,极大的影响了俺的心情.

先看看相关的2个进程的作用:

cidaemon.exe
进程文件: cidaemon or cidaemon.exe
进程名称: Microsoft Indexing Service
描述: 在后台运行的Windows索引服务,用于帮助你搜索文件在下次变得更快。
是否为系统进程: 否

cisvc.exe
进程文件: cisvc or cisvc.exe
进程名称: Microsoft Index Service Helper
描述: Microsoft Index Service Helper监视Microsoft Indexing Service (cidaemon.exe) 的内存占用情况,如果cidaemon.exe内存使用超过了40M,则自动重新启动该进程。
是否为系统进程: 否

Kill该进程是没用的,最根本的方法是禁用Indexing Service服务.

可以按照以下步骤操作:

开始->运行->[键入]services.msc->[找到]indexing Service服务->禁用

这下CPU终于能清闲一下了.这个服务以前应该是手动启动,现在变成了自动,这是安装了Windows Defender之后的事情,不知是否是因此而变.

Indexing Service服务的作用是:
     本地和远程计算机上文件的索引内容和属性;通过灵活查询语言提供文件快速访问。

可是索引也没必要占这么多资源啊,Google的桌面搜索也允许自定义资源消耗的.对微软越来越无奈.

前几天试用了一下IE7,1天就卸载了;MSN8,也准备卸掉了,而Gtalk用的越来越多;Live Mail,没有任何吸引人的地方,根本就不曾使用(除了接收垃圾邮件);而Gmail不断的改进常常给我们惊喜.

不禁感叹,难道,微软真的老了么?

Posted by eygle at 4:02 PM | Comments (3)


February 23, 2006

要发现人家的优点你才会觉得幸福

作者:eygle

出处:http://blog.eygle.com

the_others.jpg刚才和Julia聊天,她偶然说:要发现人家的优点你才会觉得幸福.

这句话一下子就触动了我. 长久以来困扰我的一些问题因这句话而浮现,忽然觉得我应该反省了.

聊到的很多话题,很多道理,我说,其实并非不懂得,只是这些简单的道理放在脑子里久了,深了,无人提起了,在应该想到,用到或者应该使用这些道理的时候,它们没有出现.

这是我的问题.

而现在,当有人和我认真说起这些道理的时候,我终于认识到,懂得和做到之间其实还有天壤之别.

很多时候,自己是过于苛刻了.过分的苛求就是不现实;不能正视现状就是不理智.这么久以来没有人提醒我,以致我错了很久.

现在,有人能够指出我的不足,并且督促我改掉这些毛病.这是我的幸运.

再默读一次:

要发现人家的优点你才会觉得幸福,要发现别人的优点你才会变得快乐.

这些话可能别人并不懂得,写在这里给自己做为警示,兼且向Julia致谢

 

Posted by eygle at 11:14 PM | Comments (18)


February 22, 2006

索引与Null值对于Hints及执行计划的影响

作者:eygle

出处:http://blog.eygle.com

由于B*Tree索引不存储Null值,所以在索引字段允许为空的情况下,某些Oracle查询不会使用索引.

很多时候,我们看似可以使用全索引扫描(Full Index Scan)的情况,可能Oracle就会因为Null值的存在而放弃索引.

在此情况下即使使用Hints,Oracle也不会使用索引,其根本原因就是因为Null值的存在.

我们看以下测试.

username字段为Not Null时,Index Hints可以生效.

SQL> create table t as select username,password from dba_users;
Table created.
SQL> desc t
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 USERNAME                                  NOT NULL VARCHAR2(30)
 PASSWORD                                           VARCHAR2(30)
SQL> create index i_t on t(username);
Index created.
SQL> set autotrace trace explain
SQL> select * from t where username='EYGLE';
Execution Plan
----------------------------------------------------------
Plan hash value: 1601196873
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |    34 |     2   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T    |     1 |    34 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("USERNAME"='EYGLE')
Note
-----
   - dynamic sampling used for this statement
SQL> set linesize 120
SQL> select /*+ index(t,i_t) */ * from t where username='EYGLE';
Execution Plan
----------------------------------------------------------
Plan hash value: 2928007915
------------------------------------------------------------------------------------
| Id  | Operation                   | Name | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |      |     1 |    34 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T    |     1 |    34 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | I_T  |     1 |       |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("USERNAME"='EYGLE')
Note
-----
   - dynamic sampling used for this statement

当索引字段允许为Null时,Oracle放弃此索引:

SQL> alter table t modify (username null);
Table altered.
SQL> select /*+ index(t,i_t) */ * from t;
Execution Plan
----------------------------------------------------------
Plan hash value: 1601196873
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |    27 |   918 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS FULL| T    |    27 |   918 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------
Note
-----
   - dynamic sampling used for this statement 

当该字段为Not Null时,索引可以被强制使用:

SQL> alter table t modify (username not null);
Table altered.
SQL> select /*+ index(t,i_t) */ * from t;
Execution Plan
----------------------------------------------------------
Plan hash value: 3593393735
------------------------------------------------------------------------------------
| Id  | Operation                   | Name | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |      |    27 |   918 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T    |    27 |   918 |     2   (0)| 00:00:01 |
|   2 |   INDEX FULL SCAN           | I_T  |    27 |       |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------
Note
-----
   - dynamic sampling used for this statement
 

这就是Null值对于索引及查询的影响.

 

Posted by eygle at 5:19 PM | Comments (4)


February 21, 2006

使用Index提示 强制使用索引

作者:eygle

出处:http://blog.eygle.com

虽然索引并不总会快于全表扫描,但是很多时候我们希望Oracle使用索引来执行某些SQL,这时候我们可以通过index hints来强制SQL使用index.

Index Hints的格式如下:

/*+ INDEX ( table [index [index]...] ) */

我们简单看一下这个提示的用法(范例为Oracle10g数据库):

SQL> create table t as select username,password from dba_users;
Table created.
SQL> create index i_t on t(username);
Index created.
SQL> set autotrace trace explain
SQL> select /*+ index(t i_t) */ * from t where username='EYGLE';
Execution Plan
----------------------------------------------------------
Plan hash value: 2928007915
------------------------------------------------------------------------------------
| Id  | Operation                   | Name | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT            |      |     1 |    34 |     2   (0)| 00:00:01 |
|   1 |  TABLE ACCESS BY INDEX ROWID| T    |     1 |    34 |     2   (0)| 00:00:01 |
|*  2 |   INDEX RANGE SCAN          | I_T  |     1 |       |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   2 - access("USERNAME"='EYGLE')
Note
-----
   - dynamic sampling used for this statement 

这里的查询使用了索引.

需要注意的是使用CTAS方式创建数据表,新建表会继承原表的约束属性:

SQL> desc t
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 USERNAME                                  NOT NULL VARCHAR2(30)
 PASSWORD                                           VARCHAR2(30) 

 

如果不使用Hints,此处Oracle不会使用索引:

SQL> select * from t where username='EYGLE';
Execution Plan
----------------------------------------------------------
Plan hash value: 1601196873
--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |    34 |     2   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| T    |     1 |    34 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   1 - filter("USERNAME"='EYGLE')
Note
-----
   - dynamic sampling used for this statement 

索引和全表扫描的选择和取舍并非简单,本文不作进一步探讨.

Posted by eygle at 10:44 PM | Comments (5)


1 2 3 4 下一页


CopyRight © 2004-2008 eygle.com, All rights reserved.