`
sandy_leen
  • 浏览: 70609 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Oracle 常用SQL

阅读更多

分页习惯用这样的SQL语句:

select * from

(select t.*,rownum row_num from mytable t order by t.id) b

where b.row_num between 1 and 10

结果发现由于该语句会先生成rownum 后执行order by 子句,因而排序结果根本不对,后来在GOOGLE上搜到一篇文章,原来多套一层select 就能很好的解决该问题,特此记录,语句如下:

select * from

(select a.*,rownum row_num from

(select * from mytable t order by t.id desc) a

) b where b.row_num between 1 and 10

 

 

 

 

-- 在Oracle中如何查找那个字段在哪些表中: 
select * from all_tab_cols where column_name = 'XXX'; 

 

1、查询出所有的用户表
select   *   from   user_tables   可以查询出所有的用户表


2、查询出用户所有表的索引
select   *   from   user_indexes


3、查询用户表的索引(非聚集索引):
select   *   from   user_indexes where   uniqueness='NONUNIQUE'


4、查询用户表的主键(聚集索引):
select   *   from   user_indexes where   uniqueness='UNIQUE'


5、查询表的索引
select t.*,i.index_type from user_ind_columns t,user_indexes i where t.index_name = i.index_name and t.table_name='NODE'


6、查询表的主键
select cu.* from user_cons_columns cu, user_constraints au where cu.constraint_name = au.constraint_name and au.constraint_type = 'P' AND cu.table_name = 'NODE'


7、查找表的唯一性约束(包括名称,构成列):
select column_name from user_cons_columns cu, user_constraints au where cu.constraint_name=au.constraint_name and cu.table_name='NODE'


8、查找表的外键
select * from user_constraints c where c.constraint_type = 'R' and c.table_name='STAFFPOSITION'
查询外键约束的列名:
select * from user_cons_columns cl where cl.constraint_name = 外键名称
查询引用表的键的列名:
select * from user_cons_columns cl where cl.constraint_name = 外键引用表的键名


9、查询表的所有列及其属性
select t.*,c.COMMENTS from user_tab_columns t,user_col_comments c where t.table_name='NODE'

-- 查看数据库链接数:
select * from v$session;

-- 查看那些用户在使用数据库
select distinct username from v$session;

-- 查看数据库的SID
select name from v$database;

-- 查看系统被锁的事务时间
select * from v$locked_object;

-- 监控正在执行的事务
select * from v$transaction;

-- 查看是不是采用了RAC
select * from gv$instance;


有两个简单例子,以说明 "exists"和"in"的效率问题
1) select * from T1 where exists(select 1 from T2 where T1.a=T2.a) ;
    T1数据量小而T2数据量非常大时,T1<<T2 时,1) 的查询效率高。
2) select * from T1 where T1.a in (select T2.a from T2) ;
     T1数据量非常大而T2数据量小时,T1>>T2 时,2) 的查询效率高。
 
Oracle在执行IN子查询时,首先执行子查询,将查询结果放入临时表再执行主查询。而EXIST则是首先检查主查询,然后运行子查询直到找到第一个匹配项。NOT EXISTS比NOT IN效率稍高。但具体在选择IN或EXIST操作时,要根据主子表数据量大小来具体考虑。

先讨论IN和EXISTS。
 select * from t1 where x in ( select y from t2 )
事实上可以理解为:
 select * from t1, ( select distinct y from t2 ) t2 where t1.x = t2.y
如果你有一定的SQL优化经验,从这句很自然的可以想到t2绝对不能是个大表,因为需要对t2进行全表的“唯一排序”,如果t2很大这个排序的性能是不可忍受的。但是t1可以很大,为什么呢?最通俗的理解就是因为t1.x=t2.y可以走索引。但这并不是一个很好的解释。试想,如果t1.x和t2.y都有索引,我们知道索引是种有序的结构,因此t1和t2之间最佳的方案是走merge join。另外,如果t2.y上有索引,对t2的排序性能也有很大提高。
 select * from t1 where exists ( select null from t2 where y = x )
可以理解为:
 for x in ( select * from t1 )
 loop
  if ( exists ( select null from t2 where y = x.x ) then
     OUTPUT THE RECORD!
  end if
 end loop
这个更容易理解,t1永远是个表扫描!因此t1绝对不能是个大表,而t2可以很大,因为y=x.x可以走t2.y的索引。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics