oracle 单列索引 多列索引的性能测试

清除oralce 缓存:alter system flush buffer_cache;

环境:oracle 10g 、 400万条数据,频率5分钟一条

1.应用场景:  找出所有站点的最新一条数据。sql语句如下:

——————————————————————————————————————————————————

with aa as(
select t1.EQP_ID ,max(MEASURE_TIME) maxtm from PLU_WATER_DATA t1 where t1.MEASURE_TIME >= to_date(‘2014-01-28 00:00:00‘, ‘yyyy-MM-dd hh24:mi:ss‘)
and t1.MEASURE_TIME < to_date(‘2014-01-28 02:00:00‘, ‘yyyy-MM-dd hh24:mi:ss‘) group by t1.EQP_ID

)
, bb as
(
select T1.EQP_ID as STCD,
T1.MEASURE_TIME as TM,
T1.FLUX_VALUE as FLOW
from PLU_WATER_DATA T1
where t1.MEASURE_TIME >= to_date(‘2014-01-28 00:00:00‘, ‘yyyy-MM-dd hh24:mi:ss‘)
and t1.MEASURE_TIME < to_date(‘2014-01-28 02:00:00‘, ‘yyyy-MM-dd hh24:mi:ss‘)

)
select * from aa inner join bb on aa.EQP_ID = bb.stcd and aa.maxtm = bb.tm inner join vi_plustation cc on cc.stcd =aa.EQP_ID

——————————————————————————————————————————

执行结果:

a.创建tm+stcd多列索引、tm单列索引、stcd单列索引  (执行时间2秒)
b.创建tm+stcd多列索引、stcd单列索引 (执行时间20秒)
c.创建stcd单列索引 (执行时间N秒)
d.创建tm+stcd多列索引 (执行时间22秒)
e.创建tm+stcd+tn+tp+cod多列索引 (执行时间71秒)
f.创建tm单列索引 (执行时间2秒)

2.应用场景  :  找出单个站点的一段时间内的数据。sql语句如下:

select T1.EQP_ID as STCD,
T1.MEASURE_TIME as TM,
T1.FLUX_VALUE as FLOW
from PLU_WATER_DATA T1
where t1.MEASURE_TIME >= to_date(‘2014-01-28 00:00:00‘, ‘yyyy-MM-dd hh24:mi:ss‘)
and t1.MEASURE_TIME < to_date(‘2014-01-28 23:00:00‘, ‘yyyy-MM-dd hh24:mi:ss‘) and eqp_id = ‘1244‘

执行结果:

查询条件在 tm和stcd上
a. 创建tm单列索引 (执行时间17秒)
b. 创建tm单列索引、stcd单列索引 (执行时间 3秒)
c. 创建tm单列索引、stcd单列索引、tm+stcd多列索引 (执行时间 0.5秒)
d. 创建tm+stcd多列索引 (执行时间 0.7秒)

3.结论:查询条件中stcd或者tm是单独限制where条件,如果使用了stcd+tm的多列索引,效率降低。如果stcd和tm是作为联合where条件,建立stcd和tm的单列索引,效率明显低于使用stcd+tm的多列索引。

a.当一个sql语句有站点分组跟时间查询嵌套使用时,推荐将stcd和tm分开建立单列索引。列如:

select t1.EQP_ID ,max(MEASURE_TIME) maxtm from PLU_WATER_DATA t1 where t1.MEASURE_TIME >= to_date(‘2014-01-28 00:00:00‘, ‘yyyy-MM-dd hh24:mi:ss‘) and t1.MEASURE_TIME < to_date(‘2014-01-28 02:00:00‘, ‘yyyy-MM-dd hh24:mi:ss‘) group by t1.EQP_ID)

像这样的语句如果建立的是 stcd+tm的多列索引,那么读取速度是7m,而如果使用stcd和tm分开建立单列索引,速度在2m内。

b.当一个sql语句 指定“站点”和“时间”时,推荐建立stcd+tm多列索引。例如

select T1.EQP_ID as STCD,T1.MEASURE_TIME as TM,T1.FLUX_VALUE as FLOW from PLU_WATER_DATA T1 
where t1.MEASURE_TIME >= to_date(‘2014-01-28 00:00:00‘, ‘yyyy-MM-dd hh24:mi:ss‘)
and t1.MEASURE_TIME < to_date(‘2014-01-28 23:00:00‘, ‘yyyy-MM-dd hh24:mi:ss‘) and eqp_id = ‘1244‘

像这样的语句如果建立的是stcd和tm分开建立单列索引,速度在3m,但如果建立了stcd+tm的多列索引,速度在0.7m

c.当一个sql语句 制定“时间”查询时,推荐建立 tm单列索引。例如

select T1.EQP_ID as STCD,T1.MEASURE_TIME as TM,T1.FLUX_VALUE as FLOW from PLU_WATER_DATA T1 
where t1.MEASURE_TIME >= to_date(‘2014-01-28 00:00:00‘, ‘yyyy-MM-dd hh24:mi:ss‘)
and t1.MEASURE_TIME < to_date(‘2014-01-28 23:00:00‘, ‘yyyy-MM-dd hh24:mi:ss‘)

像这样的语句如果建立的是stcd+tm的复合索引,速度在5m,如果建立在tm的单列索引上,速度在1.5m

时间: 2024-10-08 13:54:23

oracle 单列索引 多列索引的性能测试的相关文章

数据库索引- 多列索引

对复合索引,按照字段在查询条件中出现的频度建立索引.在复合索引中,记录首先按照第一个字段排序.对于在第一个字段上取值相同的记录,系统再按照第二个字段的取值排序,以此类推.因此只有复合索引的第一个字段出现在查询条件中,该索引才可能被使用,因此将应用频度高的字段,放置在复合索引的前面,会使系统最大可能地使用此索引,发挥索引的作用. 二.多列索引适合的场景 1.全字段匹配 2.匹配部分最左前缀 3.匹配第一列 4.匹配第一列范围查询(可用用like a%,但不能使用like %b) 5.精确匹配某一列

索引笔记《二》确定需要建立索引的列

目录 确定需要建立索引的列 主键列和唯一键列的索引 外键列的索引 其他适合创建索引的列 索引指南 小结 确定需要建立索引的列 现在我们把注意力转到应为哪些列建立索引上.对于初学者来说,我们建议对于大多数应用程序,在下列情况下创建索引. 为每个表定义主键约束:这导致在主键指定的列上自动创建索引. 在要求唯一且不同于主键列的列上创建唯一键约束:每个唯一键约束导致在约束中指定的列上自动创建一个索引. 手动创建外键列上的索引:这是为了得到更好的性能,以避免某些特定的锁问题(有关完整的详细信息,请参阅第2

mysql 联合索引和唯一索引

一般来说.如果有where a=? and b=? and c=? 的语句. 如果表也有DML, 我一般只在a 上建索引.  这也是代价平衡的结果. 一方面 只在a 上建索引那么是 index range scan, 不像联合索引那样可以index  unique scan , 我觉得速度差的不多(数据量不大的情况). 另一方面,DML也会更新index,更新三个column肯定比更新一个column慢些. 所以我一般采取折中.只建单列或2列索引. 联合索引对于查询 where a=? and

oracle单列索引和组合索引性能测试

共有两张表t1,t2 t1的表结构 t2的表结构 t1和t2通过 insert into t1 values ('www','aaa','bbb'); insert into t1 values ('www1','aaa1','bbb1'); insert into t1 values ('www2','aaa2','bbb2'); insert into t1 values ('www3','aaa3','bbb3'); t2同理构建 insert into t1 select * from

mybatis查询oracle ’无效的列索引‘和ORA-00911’无效的字符‘错误

1.Caused by: java.sql.SQLException: 无效的列索引 参考文献:http://bbs.csdn.net/topics/300179772 配置的sql语句写错了 select distinct '#{pkgName}' as pkgName, '#{appName}' as appName, version as versionName from stat_dim_version where appkey=#{appKey} order by version de

Atitit.&#160;&#160;单列索引与多列索引&#160;多个条件的查询原理与设计实现

Atitit.  单列索引与多列索引 多个条件的查询原理与设计实现 1. MySQL只能使用一个索引1 1.1. 最左前缀1 1.2. 从另一方面理解,它相当于我们创建了(firstname,lastname,age).(firstname,lastname)以及(firstname)这些列组合上的索引.2 2. 一条 sql 可以使用多个索引2 2.1. 什么是索引合并2 2.2. 使用索引合并有啥收益3 2.3. 具体的索引合并流程 4 3. Referred.4 1. MySQL只能使用一

认识SQLServer索引以及单列索引和多列索引的不同

一.索引的概念 索引的用途:我们对数据查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍采用的优化方法. 索引是什么:数据库中的索引类似于一本书的目录,在一本书中使用目录可以快速找到你想要的信息,而不需要读完全书.在数据库中,数据库程序使用索引可以重啊到表中的数据,而不必扫描整个表.书中的目录是一个字词以及各字词所在的页码列表,数据库中的索引是表中的值以及各值存储位置的列表. 索引的利弊:查询执行的大部分开销是I/O,使用索引提高性能的一个主要目标是避免全表扫描

oracle里表、索引、列的统计信息

一.表的统计信息 表的统计信息用于描述表的详细信息,包括记录数(num_rows).表块的数量(blocks).平均行长度(avg_row_len)等典型维度.这些维度可以通过数据字典表DBA_TABLES.DBA_TAB_PARTITIONS和DBA_TAB_SUBPARTITIONS来分别查看表.分区表的分区和分区表的子分区的统计信息. 二.索引的统计信息 索引的统计信息描述了索引的详细信息,它包含了索引的层级(blevel).叶子块数量(leaf_blocks).聚簇因子(clusteri

MySQL使用单列索引和多列索引

讨论MySQL选择索引时单列单列索引和多列索引使用,以及多列索引的最左前缀原则. 1. 单列索引 在性能优化过程中,选择在哪些列上创建索引是最重要的步骤之一.可以考虑使用索引的主要有两种类型的列:在Where子句中出现的列,在join子句中出现的列.请看下面这个查询: Select age -- 不使用索引 FROM people Where firstname='Mike' -- 考虑使用索引 AND lastname='Sullivan' -- 考虑使用索引 这个查询属于简单查询.由于age