- 浏览: 415381 次
- 性别:
- 来自: 厦门
文章分类
- 全部博客 (202)
- Oracle (35)
- MsSQL (10)
- MySQL (8)
- Jsp (7)
- Java 基础 (21)
- 零星点缀 (20)
- PowerDesigner (3)
- dotNet (5)
- Hibernate (8)
- 搜索技术 (3)
- Linux (18)
- jQuery (4)
- POI/excel/word (2)
- javascript (6)
- PHP (4)
- JSTL (3)
- winows 操作系统 (6)
- HTML基础 (2)
- 网络兼职 (3)
- spring (7)
- 人生 (2)
- 网络协议之Http (3)
- JDBC (1)
- FSO(FileSystemObject)技术 (3)
- css样式 (1)
- EnterpriseDb (2)
- VMware (1)
- Android (1)
- 数据转换工具=》 (1)
- Oracle-->statspack (2)
- Oracle==>性能 (1)
- Greenplum (1)
- 库的转换 (1)
- DOS (1)
最新评论
-
青春的、脚步:
xingmei_ok 写道解密失败。。。。原始:aMD5后:0 ...
java的MD5加密、解密 -
xingmei_ok:
New_Mao_Er 写道看着标题我就蛋疼了,md5 是一个摘 ...
java的MD5加密、解密 -
New_Mao_Er:
看着标题我就蛋疼了,md5 是一个摘要算法,是无法解密的,如果 ...
java的MD5加密、解密 -
xingmei_ok:
解密失败。。。。
原始:a
MD5后:0cc175b9c0f ...
java的MD5加密、解密 -
yinxueyuan122:
[b][/b][size=xx-small][/siz ...
java的MD5加密、解密
order by 使用索引的情况
參考http://pub.itpub.net/post/26/2862?SelectActiveLayout=a
1)默认情况是按顺序先取rownum,再order by
2)如果order by 满足使用索引的情况,则先order by,再取rownum
order by 使用索引是有条件的:
1)ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.
2)ORDER BY中所有的列必须定义为非空.
3)另外,如果ORDER BY中的列在where 条件中出现,也会使用索引
问题:
id为PK
select a,b,id from adf where rownum<7
A B ID
---------------------- ---------------------- ------
0 a 1
0 d 2
0 c 333
0 b 4
0 a 5
1 a 66
6 rows selected
select a,b,id from adf where rownum<7 order by id
A B ID
---------------------- ---------------------- ------
0 a 1
0 d 2
0 b 4
0 a 5
1 b 7
1 c 8
6 rows selected
结果是先order by ,再执行rownum<7
但如果是这样:
select a,b,id from adf where rownum<7 order by b
A B ID
---------------------- ---------------------- ------
0 a 1
0 a 5
1 a 66
0 b 4
0 c 333
0 d 2
6 rows selected
结果是先执行rownum<7,再order by
这是为什么???
难道是因为id是PK,所以就不同。
~~~~~~~~~~~~~~~~~~~~~~
解答:
跟主健及其上面的索引有关系:
ID是主健.
SQL> select * from t;
ID ID1
---------- ----------
1 2
2 4
4 3
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (FULL) OF 'T'
SQL> select * from t where rownum<3 order by id desc;
ID ID1
---------- ----------
4 3
2 4
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 COUNT (STOPKEY)
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'T'
3 2 INDEX (FULL SCAN DESCENDING) OF 'PK' (UNIQUE)
'因为是主健,先进行索引的排序全表扫描,然后在 count 2'
SQL> select * from t where rownum<3 order by id1;
ID ID1
---------- ----------
1 2
2 4
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (ORDER BY)
2 1 COUNT (STOPKEY)
3 2 TABLE ACCESS (FULL) OF 'T'
'没有使用索引,先进行全表扫描,然后再count 2,再排序'
为什么会使用pk的索引呢?一般的索引行吗?
我们看看:
1)在id1上创建索引
SQL> create index id1idx on t(id1);
索引已创建。
SQL> select * from t where rownum<3 order by id1;
ID ID1
---------- ----------
1 2
2 4
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (ORDER BY)
2 1 COUNT (STOPKEY)
3 2 TABLE ACCESS (FULL) OF 'T' '还是全表扫描'
SQL> select * from t where id1>0 and rownum<3 order by id1;
'加了id1>0 ,这样会使用到id1的索引'
ID ID1
---------- ----------
1 2
4 3
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 COUNT (STOPKEY)
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'T'
3 2 INDEX (RANGE SCAN) OF 'ID1IDX' (NON-UNIQUE)
2)pk的索引是因为有order by 而使用的。order by 使用索引是有条件的:
ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.
ORDER BY中所有的列必须定义为非空.
因为id1是可以为空的,所以order by 不会使用它。而pk的索引是非空的,所以order by 会使用。
我们将id1设为非空看看。
SQL> alter table t
2 modify (id1 int not null);
表已更改。
SQL> select * from t where rownum<3 order by id1;
ID ID1
---------- ----------
1 2
4 3
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 COUNT (STOPKEY)
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'T'
3 2 INDEX (FULL SCAN) OF 'ID1IDX' (NON-UNIQUE)
'这次,order by id1 使用了id1上的索引!'
參考http://pub.itpub.net/post/26/2862?SelectActiveLayout=a
1)默认情况是按顺序先取rownum,再order by
2)如果order by 满足使用索引的情况,则先order by,再取rownum
order by 使用索引是有条件的:
1)ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.
2)ORDER BY中所有的列必须定义为非空.
3)另外,如果ORDER BY中的列在where 条件中出现,也会使用索引
问题:
id为PK
select a,b,id from adf where rownum<7
A B ID
---------------------- ---------------------- ------
0 a 1
0 d 2
0 c 333
0 b 4
0 a 5
1 a 66
6 rows selected
select a,b,id from adf where rownum<7 order by id
A B ID
---------------------- ---------------------- ------
0 a 1
0 d 2
0 b 4
0 a 5
1 b 7
1 c 8
6 rows selected
结果是先order by ,再执行rownum<7
但如果是这样:
select a,b,id from adf where rownum<7 order by b
A B ID
---------------------- ---------------------- ------
0 a 1
0 a 5
1 a 66
0 b 4
0 c 333
0 d 2
6 rows selected
结果是先执行rownum<7,再order by
这是为什么???
难道是因为id是PK,所以就不同。
~~~~~~~~~~~~~~~~~~~~~~
解答:
跟主健及其上面的索引有关系:
ID是主健.
SQL> select * from t;
ID ID1
---------- ----------
1 2
2 4
4 3
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (FULL) OF 'T'
SQL> select * from t where rownum<3 order by id desc;
ID ID1
---------- ----------
4 3
2 4
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 COUNT (STOPKEY)
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'T'
3 2 INDEX (FULL SCAN DESCENDING) OF 'PK' (UNIQUE)
'因为是主健,先进行索引的排序全表扫描,然后在 count 2'
SQL> select * from t where rownum<3 order by id1;
ID ID1
---------- ----------
1 2
2 4
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (ORDER BY)
2 1 COUNT (STOPKEY)
3 2 TABLE ACCESS (FULL) OF 'T'
'没有使用索引,先进行全表扫描,然后再count 2,再排序'
为什么会使用pk的索引呢?一般的索引行吗?
我们看看:
1)在id1上创建索引
SQL> create index id1idx on t(id1);
索引已创建。
SQL> select * from t where rownum<3 order by id1;
ID ID1
---------- ----------
1 2
2 4
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 SORT (ORDER BY)
2 1 COUNT (STOPKEY)
3 2 TABLE ACCESS (FULL) OF 'T' '还是全表扫描'
SQL> select * from t where id1>0 and rownum<3 order by id1;
'加了id1>0 ,这样会使用到id1的索引'
ID ID1
---------- ----------
1 2
4 3
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 COUNT (STOPKEY)
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'T'
3 2 INDEX (RANGE SCAN) OF 'ID1IDX' (NON-UNIQUE)
2)pk的索引是因为有order by 而使用的。order by 使用索引是有条件的:
ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.
ORDER BY中所有的列必须定义为非空.
因为id1是可以为空的,所以order by 不会使用它。而pk的索引是非空的,所以order by 会使用。
我们将id1设为非空看看。
SQL> alter table t
2 modify (id1 int not null);
表已更改。
SQL> select * from t where rownum<3 order by id1;
ID ID1
---------- ----------
1 2
4 3
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 COUNT (STOPKEY)
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'T'
3 2 INDEX (FULL SCAN) OF 'ID1IDX' (NON-UNIQUE)
'这次,order by id1 使用了id1上的索引!'
发表评论
-
闪回数据库
2010-07-16 15:31 1267如何启用Oracle10g闪回数据库特性 1.确认当前模式 ... -
http://itlife365.com/?post=212
2010-07-16 15:07 1022处理ORACLE单个sql执行出现多个session的心得: ... -
从public回收SELECT ANY TABLE权限(或其他类似权限)将导致数据库中所有的procedure、function和package失效。
2010-07-16 14:50 2042从public回收SELECT ANY TABLE权限(或其他 ... -
Oracle数据库定期自动备份
2010-06-01 17:13 1574近期经常遇到Oracle备份与还原的问题,总是做些重复的工 ... -
利用Oracle CRS搭建应用的高可用集群(部份)
2010-06-01 10:38 1321前言:CRS的简介和由来 从Oracle 10gR1 RAC ... -
ORACLE RAC原理
2010-05-31 23:54 1433RAC体系结构 在一个应 ... -
批量更新
2010-05-28 10:41 878有如下两个表: table1: f ... -
如何找出Oracle中需要或值得重建的索引
2010-05-26 14:22 1180This script determines whether ... -
oracle10g for linux 4 自动启动及脚本
2010-05-25 12:49 1036关于oracle在linux系统下安装后,如何在系统重启的情况 ... -
SQL中随机选取行
2010-05-11 17:40 1991Mssql : SELECT TOP 10 OrderID, ... -
ORACLE sql 使用列别名
2010-04-21 16:22 3014如果希望在别名中使用空格,并要保留空格,就必须使用双引号将别名 ... -
Oracle行列转换总结
2010-04-19 21:08 721oracle行列转换总结 最近论坛很多人提的问题都与行列转 ... -
Oracle ==>SQL 查询根据字符串的长度排序
2010-04-13 17:06 2986select * from student s wh ... -
sql中使用: case
2010-04-02 17:23 1058sql中使用: case Store_Information ... -
关于数据库中使用 left join on ...and ...和 left join on ....where ...区别,和使用group by 要注意的情
2010-04-02 17:21 1387关于数据库中使用 left join on ...and .. ... -
sql多表连接查询inner join, left join , right join ,full join ,cross join 学习
2010-04-02 17:18 1993浅显易懂: inner join,ful ... -
Oracle - 一个sequence重置的方法
2010-04-01 14:20 1106Oracle - 一个sequence重置的方法 收藏 ... -
oracle主键自动增长的设置
2010-04-01 13:25 12211建立数据表 create table Test_Incr ... -
PL/SQL DEVELOPER 基本用法详解
2010-03-25 11:33 1699PL/SQL DEVELOPER 基本用法详解(建议写过第一个 ... -
解除oracle表锁定
2010-03-23 17:00 2428--================首先查找阻塞的用户 ...
相关推荐
以下是一些能够使用索引优化`ORDER BY`的例子: 1. 查询按索引完全顺序排列的数据: ```sql SELECT * FROM t1 ORDER BY key_part1, key_part2, ...; ``` 2. 当`WHERE`子句中包含索引的一部分,且`ORDER BY`按照...
反之,如果查询涉及的行数过多、使用了不同索引、索引列既有升序又有降序排列,或者WHERE和ORDER BY使用了不同索引,或者使用了列的表达式或函数,MySQL则可能使用FileSort。 例如,`SELECT * FROM friends WHERE ...
3. **使用`EXPLAIN`分析SQL性能**:通过`EXPLAIN`关键字,可以查看MySQL如何执行SQL语句,从而了解索引的使用情况和查询优化的可能性。 4. **避免无意义的索引**:在选择的列上创建索引不一定能优化查询,如在`...
创建表&创建索引 ...MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作。 通过索引优化来实现MySQL的ORDER BY语句优化: 1、ORDER BY的索引优化 如果一个SQL语句形如: SELECT
- 经常需要进行排序或分组(如`GROUP BY`或`ORDER BY`)的列应建立索引,这样在执行这些操作时能减少数据排序的时间。 - 在条件表达式中出现频率高且具有较多不同值的列上创建索引,以减少全表扫描的次数。相反,...
在描述中提到的问题中,当使用`ORDER BY`对包含非唯一值的列进行排序,并结合分页查询时,发现不同页码的数据可能会有重复。这进一步证实了`ORDER BY`在Oracle中的不稳定特性。在没有唯一索引或主键约束的情况下,...
* 某列常用于 join,orderby,group by。 * 查寻出的数据不超过表中数据量的 20%。 三、覆盖索引(Covering Indexes) 覆盖索引是指那些索引项中包含查寻所需要的全部信息的非聚簇索引,这种索引之所以比较快也正是...
1.3 ORDER BY 中用索引:在 ORDER BY 语句中使用索引,可以提高查询效率和性能。 1.4 索引列的类型:选择合适的索引列类型,例如 B-Tree 索引、位图索引、函数索引等,根据实际情况选择合适的索引类型。 1.5 WHERE...
例如,主键列、按范围存取的列、在 group by 或 order by 中使用的列是好的候选。避免在频繁修改或单调递增的列上建立聚簇索引,因为这可能导致频繁的行移动和锁定冲突。 2. 非聚簇索引 (Nonclustered Indexes) 非...
5. 需要注意的是,在ORDER BY语句中混合使用ASC和DESC排序模式,或者在ORDER BY的字段中使用表达式,都会导致无法使用索引进行排序优化。因此,在设计数据库和编写查询语句时,应尽量避免这些情况。 总结来说,有效...
此外,了解GROUP BY和ORDER BY操作使用索引的原理和条件也是相似的。在设计表的索引时,应该考虑到未来SQL查询的模式,包括哪些字段将用于过滤(WHERE子句)、排序(ORDER BY)以及分组(GROUP BY)。通过合理设计两...
sql学习 索引特性之有序优化order by.sql
- **降序索引**:数据按照降序排列,有助于优化ORDER BY子句的反向排序查询。 - **反向键索引**:用于解决连续值导致的索引块竞争问题,通过字节反转使索引条目更均匀分布,减少热点块的出现。 2. **位图索引**:...
当你在查询中同时使用LIKE和ORDER BY时,LIKE通常是用于筛选数据,而ORDER BY则是为了确定返回结果的顺序。例如,如果你只关心以"J"开头且按名字降序排列的客户: ```sql SELECT * FROM Customers WHERE Name LIKE ...
然而,在某些情况下,使用 ORDER BY 和 LIMIT 两个关键字可能会出现一些坑,今天我们就来讨论其中的一个坑。 问题的描述是这样的:当我们使用 ORDER BY 对某个字段进行排序,然后使用 LIMIT 限制返回的记录数时,...
- **特殊情况**:如果`WHERE`子句中`age`被设定为常量,例如`WHERE age = 10`,即使不直接使用`ORDER BY age`,MySQL仍然可以使用索引。 4. **会出现`Using filesort`的情况** 当`ORDER BY`的列不是索引的左前缀...
因为可能需要对数据库的记录进行重新排序。在这篇文章中,笔者就谈谈提高Order By语句查询效率的两个...在条件允许的情况下,笔者建议最好使用一个索引来满足Order By子句。如此的话,就可以避免额外的排序工作。这里笔
- **加速排序**:对于ORDER BY等操作,索引可以帮助加速排序过程。 - **减少磁盘I/O操作**:索引可以减少磁盘I/O操作次数,提高查询速度。 ##### 2、索引的缺点 - **占用额外空间**:每个索引都需要占用一定的磁盘...
#### 三、使用Order by和distinct后,如何创建覆盖索引 1. **包含Order by操作时的覆盖索引**: - 当查询涉及`ORDER BY`时,被排序的字段应作为索引的一部分。这样可以避免额外的排序操作,从而提高查询性能。 - ...