`
wang_zhi_peng2007
  • 浏览: 250836 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

 
阅读更多

10g 的函数索引果然不错,好!

表中有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的改进吧,不错

分享到:
评论

相关推荐

    oracle_函数索引_oracle函数速查[参考].pdf

    `NVL`函数就是这样的例子,它接受两个参数,如果第一个参数为NULL,它会返回第二个参数的值,否则返回第一个参数。在处理薪水和奖金这类可能包含NULL值的数据时,`NVL`非常有用。例如,更新员工总薪酬的正确方式是:...

    oracle SQL优化技巧

    如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)。 8. 删除重复记录 最高效的删除重复记录方法(因为使用了 ROWID)。例子:DELETE FROM EMP E WHERE E.ROWID > (SELECT...

    Oracle SQL优化实例讲解.pdf

    Oracle数据库是一个功能强大且广泛使用的数据库系统,其中SQL查询优化是一个核心主题。在进行查询优化时,一个重要的方法是改写查询语句,以使得数据库执行计划更高效。改写技巧可能包括使用不同的SQL结构,如子查询...

    ORACLE表分区例子

    它将一个大表逻辑上划分为较小、更易管理和查询的部分,每个部分称为一个分区。表分区能够显著提升查询性能、优化存储效率,并简化大规模数据的维护工作。 在Oracle中,表分区有多种类型,包括: 1. **范围分区**...

    oracle常用函数.rar

    它允许用户从一个根节点开始,通过指定的连接条件递归地连接行,以构建树形结构。在"connectby.sql"文件中,可能包含了使用`CONNECT BY`创建组织结构、展示家族树或者分析数据依赖关系的例子。基本语法如下: ```sql...

    oracle 性能设计及优化

    对于大型数据库环境,了解如何使用Oracle并行服务器管理工具进行优化非常重要。 ##### 11.10 独立的工具 介绍一些第三方工具,这些工具可以在某些特定场景下提供额外的帮助。 #### 十一、数据访问方法 合理选择...

    ORACLE9i_优化设计与系统调整

    §13.2.1 使用函数索引 165 §13.2.2 使用位图索引- 166 §13.2.3 使用B树索引- 166 §13.2.4 使用反向键索引- 166 §13.2.5 使用索引组织表 166 §13.3 使用范围索引 166 §13.4 使用簇 - 167 §13.5 使用Hash 簇 -...

    ORACLE分析函数.pptx

    乙提出的解决方案是使用分析函数`dense_rank()`,它能够在一行数据流中为每一行分配一个排名,基于指定的排序标准。在这个例子中,排序标准是`trunc(created,'dd')`降序,这样就能找到最近创建的记录。新的分析函数...

    ORACLE分析函数1.ppt

    不过,使用分析函数的一个缺点是需要进行排序操作,这可能会带来额外的资源消耗。为了进一步优化,可以考虑为相关的列(如owner和trunc(created,'dd'))创建复合索引,这样不仅可以加速子查询的执行,还能减少排序的...

    利用GDAL2.1.2库 把shp文件导入 oracle数据库中 例子

    在IT行业中,地理信息系统(GIS)的处理与分析经常涉及到数据的导入与导出,而GDAL(Geospatial Data Abstraction Library)就是一个强大的开源工具,用于处理多种地理空间数据格式。本文将深入探讨如何利用GDAL ...

    ORACLE-SQL语句优化技术分析.docx

    可以使用一个函数,将变量 name 中的姓和名分开就可以了,但是有一点需要注意,这个函数是不能作用在索引列上。下面是 SQL 查询脚本:select * from employee where first_name = SUBSTR('&&name',1,INSTR('&&name',...

    oracle的例子 很实用

    通过这些例子,我们可以学习如何使用SELECT语句进行复杂的查询,包括JOIN操作、子查询、聚合函数(如COUNT, SUM, AVG)以及WHERE和HAVING子句的使用。 2. **PL/SQL编程**:Oracle提供了PL/SQL,一种嵌入式SQL编程...

    oracle自学包(内有例子)

    - 索引优化:提高查询速度,包括B树索引、位图索引和函数索引。 5. **SQL查询**: - SELECT语句:用于从表中提取数据,涉及子查询、连接、聚合函数等高级用法。 - DML操作:INSERT插入数据,UPDATE更新,DELETE...

    oracle SQL语句优化概述

    SQL语句的优化是数据库管理领域中的一个重要课题,尤其在Oracle数据库中更是如此。优化执行SQL语句不仅可以提高应用程序的性能,还可以提升用户体验。本文旨在从Oracle的角度出发,探讨SQL语句优化的基本原则和技术...

    Oracle数据库系统应用实例集锦与编程技巧(001)

    Oracle数据库系统是全球广泛使用的大型关系型数据库管理系统之一,尤其在企业级应用中占据着重要地位。本资源“Oracle数据库系统应用实例集锦与编程技巧(001)”旨在为开发者提供一系列实用的案例和编程技巧,帮助...

Global site tag (gtag.js) - Google Analytics