一个用 Oracle 函数索引进行优化的例子

表中有500万条记录,原来没有索引:

set timing on set autotrace traceonly SQL> select count(*), to_char(time,'hh24') from userloginlog 2 where trunc(time) = trunc(sysdate) - 1 3 group by to_char(time,'hh24') 4 order by to_char(time,'hh24');

24 rows selected. Elapsed: 00:00:06.70 Execution Plan ----------------------------------------------------------    0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=6179 Card=37215 Bytes=297720)    1    0   SORT (GROUP BY) (Cost=6179 Card=37215 Bytes=297720)    2    1     TABLE ACCESS (FULL) OF 'USERLOGINLOG' (TABLE) (Cost=6039 Card=37257 Bytes=298056) Statistics ----------------------------------------------------------           1  recursive calls           0  db block gets       25154  consistent gets       24470  physical reads           0  redo size         763  bytes sent via SQL*Net to client         514  bytes received via SQL*Net from client           3  SQL*Net roundtrips to/from client           1  sorts (memory)           0  sorts (disk)          24  rows processed

查询使用全表扫描,执行需6.7秒。

下面建立函数索引:

create index idx_time on userloginlog (to_char(time,'hh24')) tablespace indexes;  create index idx_time2 on userloginlog (trunc(time)) tablespace indexes;

执行同样的查询:

SQL> select count(*), to_char(time,'hh24') from userloginlog 2 where trunc(time) = trunc(sysdate) - 1 3 group by to_char(time,'hh24') 4 order by to_char(time,'hh24');

24 rows selected. Elapsed: 00:00:00.34 Execution Plan ----------------------------------------------------------    0      SELECT STATEMENT Optimizer=ALL_ROWS (Cost=323 Card=37215 Bytes=297720)    1    0   SORT (GROUP BY) (Cost=323 Card=37215 Bytes=297720)    2    1     TABLE ACCESS (BY INDEX ROWID) OF 'USERLOGINLOG' (TABLE) (Cost=183 Card=37257 Bytes=298056)    3    2       INDEX (RANGE SCAN) OF 'IDX_TIME2' (INDEX) (Cost=64 Card=16143)  Statistics ----------------------------------------------------------         197  recursive calls           0  db block gets         341  consistent gets           1  physical reads           0  redo size         763  bytes sent via SQL*Net to client         514  bytes received via SQL*Net from client           3  SQL*Net roundtrips to/from client           6  sorts (memory)           0  sorts (disk)          24  rows processed

查询使用索引扫描,执行需0.34秒,快了20倍。

还有一点,建立索引后并没有执行 analyze table userloginlog compute statistics; 进行分析,索引就生效了,这是10g的改进吧。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏遊俠扎彪

CentOS 5.6 安装 Oracle 10g 基本步骤

尝试安装了不下10次,只成功两次,很奇怪。安装Oracle是我接触Linux以来,最糟糕的经历之一。现总结一下,主要参考列表如下:

227100
来自专栏遊俠扎彪

Linux下安装Oracle SQL*Plus加强工具rlwrap

Linux的SQL*Plus不太好用,通过安装rlwrap可以提高用户体验,这样就可以使用光标上下键来查找历史命令,使用退格键backspace了。

22080
来自专栏惨绿少年

Oracle Database 12c Release 2安装详解

第1章 Oracle Database 12c Release 2安装详解 1.1 下载方法 oracle官网https://www.oracle.com 1)...

41700
来自专栏别先生

oracle创建用户和密码以及授权登录问题

创建有户名和密码 CREATE USER 用户名 IDENTIFIED BY 密码; 分配权限 GRANT connect,dba to 用户名;  1:使用...

21580
来自专栏王小雷

Oracle12C用户创建、授权、登录

Oracle12C用户创建、授权、登录 1.以系统用户登录 C:\Users\LEI>sqlplus sys/dwh as sysdba; SQL*Plus:...

22690
来自专栏王小雷

Oracle创建用户、表(1)

1. 连接 C:\Users\LEI>sqlplus / as sysdba SQL*Plus: Release 12.1.0.2.0 Production ...

67650
来自专栏遊俠扎彪

Linux 下Oracle 10.2.0.1升级到10.2.0.4

ftp://updates.oracle.com/6810189/p6810189_10204_Linux-x86.zip

22280
来自专栏王小雷

Oracle Data Integrator 12c 安装(ODI安装)

Oracle Data Integrator 12c 安装(ODI安装) 企业版安装步骤(包含独立安装步骤) 官网下载Oracle Data Inte...

352100
来自专栏别先生

Oracle的登陆问题和初级学习增删改查(省略安装和卸载)

1:学习Oracle首先需要安装Oracle,网上已经有很多很多教程了,这里不做叙述,自己百度即可,这里安装的标准版,个人根据需求安装学习或者企业开发即可。如果...

21660
来自专栏遊俠扎彪

Oracle EM在网页中出现乱码的解决方案

CentOS 5.6 + Oracle 10g 10.2.0.4

22650

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励