分页习惯用这样的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的索引。
分享到:
相关推荐
Oracle 常用SQL技巧经典收藏 Oracle 常用SQL技巧经典收藏
ORACLE常用SQL语句大全.pdf
Oracle常用sql语句整理 Oracle常用sql语句整理 Oracle常用sql语句整理 Oracle常用sql语句整理 Oracle常用sql语句整理 Oracle常用sql语句整理
oracle 常用sql,dba常备,锁表查询、oracle的连接数查看和连接用户的查看等
oracle常用sql语句大全 注释完整 放心使用 包含所有常用语句
Oracle常用SQL查询语句,Oracle常用SQL查询语句,Oracle常用SQL查询语句
Oracle学习,常用sql语句汇总,适合新手使用。
oracle常用SQL脚本
oracle 常用SQL查询,里面有丰富的SQL查询命令
oracle常用sql语句 oracle常用sql语句 oracle常用sql语句 oracle常用sql语句 oracle常用sql语句
ORACLE常用SQL.txt ORACLE常用SQL.txt ORACLE常用SQL.txt
oracle常用sql
oracle常用SQL语句下载 oracle常用SQL语句下载 oracle常用SQL语句下载
oracle 常用SQL语法手册 oracle 常用SQL语法手册
oracle常用sql语句,数据库常用的sql语句!!!!
oracle常用sql优化oracle常用sql优化oracle常用sql优化
ORACLE 常用SQL语句,ORACLE数据库初使用者可以看看。
oracle常用sql查询.pdf.rar
Oracle常用SQL手册.chm