- 浏览: 1204195 次
- 性别:
- 来自: 上海
-
文章分类
- 全部博客 (361)
- java综合 (33)
- 项目管理 (10)
- 工作流 (6)
- spring (11)
- hibenate (17)
- struts (0)
- javascript,html,css,ajax,jquery (11)
- IDE (9)
- 生活 (0)
- 工作 (0)
- 杂记 (1)
- 数据库 (96)
- 服务器 (5)
- 可视编辑 (0)
- freemarker (6)
- 操作系统 windows (13)
- web页面 (6)
- jms (15)
- 调优 (4)
- 测试和bug管理 (2)
- 原理 (1)
- 項目-atf (17)
- 安全 (3)
- xml (4)
- 操作系统 liunx (21)
- 网络 (22)
- office (11)
- 设计 (2)
- 软件 (1)
- 数据库 mysql (6)
- 胖客户端-flex (1)
- 正则 (9)
- oracle- liunx (3)
- sql2000 (2)
- 模式 (1)
- 虚拟机 (2)
- jstl (2)
- 版本控制 打包工具 (0)
- AOP (1)
- demo (1)
- 小软件 (2)
- 感恩 (1)
- iphone 4 (1)
- 反欺诈业务经验整理 (0)
最新评论
-
sea0108:
mark
java内存模型 -
XingShiYiShi:
方便把:testPNR();具体实现发出来吗?谢谢
用正则表达式解析 航信的电子客票和pnr报文 -
wh359126613:
如果js和webservice不在同一个服务器上,有跨域问题如 ...
使用javascript调用webservice示例 -
雨飛雁舞:
...
oracle 动态性能(V$)视图 -
ouyang1224:
好东西
oracle 动态性能(V$)视图
本篇文章主要讨论rownum和排序以及索引的关系
问题1、rownum正序是指什么?
问题2、rownum和order by语句在一起时,执行的先后顺序是什么?order by语句如何影响rownum正序?
问题3、rownnum与索引之间的关系?
-- Create table
create table DAIMIN
( ID NUMBER not null,
PARENTID NUMBER
);
alter table daimin add constraint pk_daimin primary key(id);
SQL> select *from DAIMIN;
ID PARENTID
---------- ----------
1 6
2 3
5 1
3 2
问题1、rownum正序是指什么?
rownum正序是指rownum的返回,是按照1,2,3依次递增,如上面的查询显示的效果
问题2、rownum和order by语句在一起时,执行的先后顺序是什么?order by语句如何影响rownum正序?
下面执行两个语句进行比较:
SQL> select rownum as r, t.ID from daimin t order by t.ID;
R ID
---------- ----------
1 1
2 2
3 3
4 5
现象:是rownum是按照正序来返回的
该语句的执行计划如下:
--------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | |
| 1 | COUNT | | | | |
| 2 | INDEX FULL SCAN | PK_DAIMIN | | | |
--------------------------------------------------------------------
现象:使用了PK_DAIMIN这个主键索引,并且从执行计划中看出COUNT操作之后没有SORT ORDER BY操作
(Rownum事实上在COUNT (STOPKEY)时产生)
SQL> select rownum as r, t.parentid from daimin t order by t.parentid;
R PARENTID
---------- ----------
3 1
4 2
2 3
1 6
现象:是rownum没有按照正序来返回
该语句的执行计划如下:
--------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | |
| 1 | SORT ORDER BY | | | | |
| 2 | COUNT | | | | |
| 3 | TABLE ACCESS FULL | DAIMIN | | | |
--------------------------------------------------------------------
现象:没有使用索引查询 ,并且在COUNT操作之后有SORT ORDER BY操作
分析:为什么这两句SQL语句返回的rownum不一样呢?
主要是由于第一句使用了索引已经排好序,然后再产生Rownum,此时已经是按照parentid排好序的顺序,
再按照parentid排序之后原来的rownum标识不会被打乱,所以返回的rownum是正序;
而第二句则使用全表扫描,在全表扫面是查询出来的结果集是按照表中原有的记录的先后顺序来返回的,
然后在COUNT操作时给返回的记录标记1,2,3,在标好标记之后再按照parentid字段排序,这样就将原来
在COUNT时的顺序打乱,重新排序,所以返回的rownum不是正序。
问题3、rownnum与索引之间的关系?是不是建了某个字段的索引都会使用索引呢(在没有改字段的where条件的情况下)?
下面做测试试验:
给DAIMIN表中的PARENTID字段建索引
create index DM_PARENTID on DAIMIN (PARENTID);
select rownum as r, t.parentid from daimin t order by t.parentid;
其执行计划:
--------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
--------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | |
| 1 | SORT ORDER BY | | | | |
| 2 | COUNT | | | | |
| 3 | TABLE ACCESS FULL | DAIMIN | | | |
--------------------------------------------------------------------
查询结果:
SQL> select rownum as r, t.parentid from daimin t order by t.parentid;
R PARENTID
---------- ----------
3 1
4 2
2 3
1 6
分析:给parentid字段建了索引,但是该语句并没有使用索引,仍然采用的是全表扫描,所以返回的rownum仍然不是正序。
如果修改DAIMIN表中的PARENTID字段为not null
alter table DAIMIN modify PARENTID not null;
再次查询该语句的其执行计划:
---------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost |
---------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | |
| 1 | COUNT | | | | |
| 2 | INDEX FULL SCAN | DM_PARENTID | | | |
---------------------------------------------------------------------
查询结果:
SQL> select rownum as r, t.parentid from daimin t order by t.parentid;
R PARENTID
---------- ----------
1 1
2 2
3 3
4 6
分析:将parentid字段设置为not null字段之后,由于在order by parentid时会采用parentid字段的索引DM_PARENTID,
所以改语句查询出来的rownum的顺序是正序。
问题:为什么给parentid字段设置为not null字段之后,此时该查询语句会使用索引呢(在没有该字段的where条件时)?
这里主要是牵涉到order by使用索引的条件,什么情况下order by会使用索引?
order by 使用索引是有条件的:
1)ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.
2)ORDER BY中所有的列必须定义为非空.
3)另外,如果ORDER BY中的列在where 条件中出现,也会使用索引
上面的试验是满足了ORDER BY中列parentid为非空,所以order by parentid使用parentid字段的索引。
对于复合索引:
create index DM_INDEX on DAIMIN (ID, PARENTID);
以下几句都使用了索引:
Select rownum, t.* from DAIMIN t order by ID, PARENTID; --使用复合索引DM_INDEX
select rownum, t.* from DAIMIN t order by t.ID desc, t.PARENTID desc; --使用复合索引DM_INDEX
Select rownum, t.* from DAIMIN t order by ID; --使用主键索引
Select rownum, t.* from DAIMIN t order by ID desc; --使用主键索引
以下几句不使用索引:
select rownum, t.* from DAIMIN t order by t.ID asc, t.PARENTID desc; --不使用复合索引DM_INDEX,全表扫描
Select rownum, t.* from DAIMIN t order by PARENTID;
(该句parentid字段还没有设置为not null时,只有复合索引DM_INDEX,此时不使用复合索引)
总结:
1)默认情况是按顺序先取rownum,再order by
2)如果order by 满足使用索引的情况,则先order by,再取rownum
order by 使用索引是有条件的:
1)ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.
2)ORDER BY中所有的列必须定义为非空.
3)另外,如果ORDER BY中的列在where 条件中出现,也会使用索引
发表评论
-
并发行级锁超2秒报警监控sql
2010-07-20 16:18 1953并发行级锁超2秒报警监控sql -
数据设计规范v
2010-06-22 19:47 0数据设计规范v -
Oracle 有趣排序包括那些
2010-06-20 16:51 1463按拼音排序 select * from table ... -
Oracle sql 性能优化调整
2010-06-20 16:15 1407Oracle sql ... -
Delete、Drop、Truncate的比较(转)
2010-05-31 13:39 1488Delete、Drop、Truncate的比较 关键字: d ... -
Oracle误操作解决方案(转)
2010-05-31 13:35 1402Oracle误操作解决方案 文章分类:数据库 一.误删除数 ... -
一个递归调用的存储过程
2010-04-19 01:51 1860一个递归调用的存储过程 -
oracle index学习总结
2009-12-08 10:44 19660oracle index 1.index需要储存空间 ... -
Jdbc 和hibernate
2009-11-16 23:38 1891Jdbc 和hibernate 一、Jdbc是java ... -
去掉 powerDesigner 中表设计时的 name和code联动的功能
2009-11-16 17:04 3516去掉 powerDesigner 中表设计时的 name和co ... -
oracle数据库索引未被使用的问题及其解决2007
2009-11-15 01:42 2141一次,在进行WEB页面上进行历史数据文件检查时,发现数据库访问 ... -
RMAN配置及备份与恢复练习
2009-09-27 18:06 16331.创建表空间SQL>create tablespace ... -
误删除数据后怎么立即恢复(不考虑全库备份和利用归档日志)
2009-09-27 18:01 3394要达到删除数据,有以下几种方式都可以:1、delete2、dr ... -
IMP数据到指定的表空间
2009-09-27 12:47 9121IMP数据到指定的表空间 一直以来,我都认为只要指定用户的默 ... -
ORACLE UPDATE 语句语法与性能分析
2009-09-27 09:49 1891为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在 ... -
oracle job 例子
2009-09-22 12:38 3075一、设置初始化参 ... -
oracle 时间加减综合
2009-09-17 11:43 1991加法 select sysdate,add_mon ... -
详细介绍ORACLE sqlplus命令
2009-09-09 16:42 2073一、ORACLE的启动和关闭1、在单机环境下要想启动或关闭OR ... -
AWR介绍与SYSAUX空间关系 SYASAUX表空间满了 系统慢
2009-09-08 09:45 8010AWR介绍与SYSAUX空间关系 2007-11-05 14 ... -
to_char 'NLS_DATE_LANGUAG参数
2009-09-02 18:41 1501select to_char(sysdate, 'Day'), ...
相关推荐
select row_number() over(order by name) as rowNum,* from users ) as t where rowNum between 5000 and 5100 ``` 这种方法的缺点是需要查出所有数据,然后再进行排序和过滤,这将导致性能问题。 正确的使用...
rowid 是相对不变的,除非使用 order by 语句,否则 rowid 的值将保持不变。 二、rownum 概念 rownum 是 Oracle 数据库中的另一个虚列,用于标示 SQL 语句的输出结果排序。rownum 是一个动态的值,取决于 SQL 语句...
7. 使用ROWNUM进行分页查询,以及LEVEL、PRIOR和CONNECT BY … START WITH用于层次查询。 接下来,DDL基础涵盖了数据库结构的创建、修改和删除,例如: 1. 创建表(CREATE TABLE)、视图(CREATE VIEW)、索引...
ORDER BY子句用于对结果集进行排序,如`SELECT * FROM employees ORDER BY salary DESC`按薪水降序排列员工。 5. 分组(GROUP BY子句): GROUP BY用于根据一个或多个列对数据进行分组,常与聚合函数(如COUNT、...
- 当ROWNUM与ORDER BY结合使用时,应确保ORDER BY出现在内部子查询中,ROWNUM出现在外部查询中,以确保正确的排序和限制。 #### NULL **空值的生成及特点:** - NULL表示未知或不存在的值。 - 在Oracle中,NULL与...
SELECT ID, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY (SELECT NULL)) AS RowNum FROM YourTableName GROUP BY ID HAVING COUNT(*) > 1 ) SELECT * FROM Dupes WHERE RowNum > 1 ``` 这将展示每个重复...
配合`PARTITION BY`和`ORDER BY`,可以创建分组内的行号或全局行号。例如,获取第11到20行的数据: ```sql WITH CTE AS ( SELECT *, ROW_NUMBER() OVER (ORDER BY SomeColumn) AS RowNum FROM YourTable ) ...
1. **选择查询(SELECT)**:理解如何从一个或多个表中选择数据,包括使用WHERE子句进行条件过滤,使用GROUP BY和HAVING对数据进行分组和过滤,以及使用ORDER BY进行排序。 2. **联接查询(JOIN)**:包括内连接...
另一种更高效的方法是使用嵌套的TOP和ORDER BY: ```sql SELECT * FROM (SELECT TOP @PageSize * FROM (SELECT TOP (@PageSize*@PageIndex) @PrimaryKey, ROW_NUMBER() OVER (ORDER BY @PrimaryKey) AS ...
使用JDBC时,可以结合LIMIT和OFFSET子句(Oracle不支持LIMIT,但可以通过ROWNUM模拟)来实现分页,而在Hibernate中,可以使用Criteria API或HQL的`setFirstResult`和`setMaxResults`方法来实现相同的功能。...
Oracle数据库是全球广泛使用的大型关系型数据库管理系统,其SQL(结构化查询语言)在数据管理、分析和应用开发中扮演着核心角色。本篇将基于"Oracle常用SQL语句复习"这一主题,深入探讨Oracle SQL的基本语法和常用...
在Oracle中,SQL不仅可以用于查询数据,还可以用于插入、更新、删除数据,以及创建和管理数据库对象。以下是一些Oracle SQL查询的经典用法,这些技巧对于数据库管理员和开发人员来说都是十分实用的。 1. **基本查询...
- 采用ROWNUM分页查询: `SELECT * FROM (SELECT ROWNUM AS rownum, * FROM (SELECT * FROM employees ORDER BY salary DESC) WHERE ROWNUM ) WHERE rownum > 5;`. #### 十四、添加、修改和删除 - **数据操作**包括...
在IT行业中,SQL(Structured Query Language)是一种用于管理和处理关系数据库的强大语言,广泛应用于数据查询、更新、插入和删除等操作。本教程“SQL编写中文手册-详细教程”专为Oracle数据库系统设计,旨在帮助...
下面,我们将深入探讨Oracle SQL的一些经典查询语句,以及它们的基础和扩展应用。 一、基础SQL查询语句 1. SELECT语句:这是SQL中最基本的查询语句,用于从数据库表中获取数据。例如,`SELECT * FROM table_name;`...
1. 监控索引使用:`ALTER INDEX &index_name MONITORING USAGE` 和 `ALTER INDEX &index_name NOMONITORING USAGE` 用于开启或关闭对特定索引使用情况的监控。`SELECT * FROM v$object_usage WHERE index_name = &...
SQL(Structured Query Language)是用于管理和处理关系数据库的标准编程语言,而Oracle 9i SQL则在此基础上进行了扩展和优化,以适应更复杂的数据库应用场景。 1. SQL基础应用: - 数据查询:SQL的基础在于SELECT...
SELECT n.*, ROW_NUMBER() OVER (ORDER BY column_name) as row_num FROM table_name n ) WHERE row_num BETWEEN 10 AND 20; ``` ### 6. Oracle中的左连接与右连接 - **左连接**(LEFT JOIN)返回左表的所有行...
ORDER BY time_id DESC SET @MyCounter = @MyCounter + 1 END select userid insert into select * from person; select * insert into person values('a','b',20,'110') select * from emp where hiredate ...
- **数据库备份情况与可恢复性检查**:确保备份的有效性和完整性,以及在紧急情况下能够快速恢复数据。 #### 三、数据库性能监控管理 数据库性能监控管理是数据库管理的重要组成部分,其目的是为了预防风险事件的...