SQL> select distinct id from abc;
ID
1
2
4
SQL> select count( distinct id ) from abc;
COUNT(DISTINCTID)
3
SQL> select count(id) from abc;
COUNT(ID)
3
SQL> select count(*) from abc;
COUNT(*)
5
SQL> select *from abc;
ID NAME
1 asdf
2 sdfa
sdfa
4 fdas
asdf
SQL>
hint被忽略
如果CBO认为使用hint会导致错误的结果时,hint将被忽略,详见下例SQL> select /*+ index(t t_ind) */ count(*) from t;
Execution Plan
Plan hash value: 2966233522
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 1 | 57 (2)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | | |
| 2 | TABLE ACCESS FULL| T | 50366 | 57 (2)| 00:00:01 |
因为我们是对记录求总数,且我们并没有在建立索引时指定不能为空,索引如果CBO选择在索引上进行count时,但索引字段上的值为空时,结果将不准确,故CBO没有选择索引。 SQL> select /*+ index(t t_ind) */ count(id) from t;
Execution Plan
Plan hash value: 646498162
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 1 | 5 | 285 (1)| 00:00:04 |
| 1 | SORT AGGREGATE | | 1 | 5 | | |
| 2 | INDEX FULL SCAN| T_IND | 50366 | 245K| 285 (1)| 00:00:04 |
因为我们只对id进行count,这个动作相当于count索引上的所有id值,这个操作和对表上的id字段进行count是一样的(组函数会忽略null值)
/*+ INDEX_JOIN(TABLE INDEX_NAME1 INDEX_NAME2) */
当谓词中引用的列都有索引的时候,可以通过指定采用索引关联的方式,来访问数据select /*+ index_join(t t_ind t_bm) */ id from t where id=100 and object_name='EMPLOYEES'
/*+ no_use_nl(table_1,table_2) */在多表关联查询中,指定不使用nest loops方式进行多表关联。
select /*+ no_use_nl(t,t1) */ t.* from t,t1 where t.id=t1.id;
/*+ no_use_hash(table_1,table_2) */在多表关联查询中,指定不使用hash join方式进行多表关联。
select /*+ no_use_hash(t,t1) */ t.* from t,t1 where t.id=t1.id;
/*+ no_use_merge(table_1,table_2) */在多表关联查询中,指定不使用merge join方式进行多表关联。
select /*+ no_use_merge(t,t1) */ t.* from t,t1 where t.id=t1.id;
/*+ dynamic_sampling(table_name n) */
设置sql执行时动态采用的级别,这个级别为0~10select /*+ dynamic_sampling(t 4) */ * from t where id > 1234
NL_AJ
Use an anti-join in a sub-query. (depricated in Oracle 10g)