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的改进吧,不错
相关推荐
`NVL`函数就是这样的例子,它接受两个参数,如果第一个参数为NULL,它会返回第二个参数的值,否则返回第一个参数。在处理薪水和奖金这类可能包含NULL值的数据时,`NVL`非常有用。例如,更新员工总薪酬的正确方式是:...
如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)。 8. 删除重复记录 最高效的删除重复记录方法(因为使用了 ROWID)。例子:DELETE FROM EMP E WHERE E.ROWID > (SELECT...
Oracle数据库是一个功能强大且广泛使用的数据库系统,其中SQL查询优化是一个核心主题。在进行查询优化时,一个重要的方法是改写查询语句,以使得数据库执行计划更高效。改写技巧可能包括使用不同的SQL结构,如子查询...
它将一个大表逻辑上划分为较小、更易管理和查询的部分,每个部分称为一个分区。表分区能够显著提升查询性能、优化存储效率,并简化大规模数据的维护工作。 在Oracle中,表分区有多种类型,包括: 1. **范围分区**...
它允许用户从一个根节点开始,通过指定的连接条件递归地连接行,以构建树形结构。在"connectby.sql"文件中,可能包含了使用`CONNECT BY`创建组织结构、展示家族树或者分析数据依赖关系的例子。基本语法如下: ```sql...
对于大型数据库环境,了解如何使用Oracle并行服务器管理工具进行优化非常重要。 ##### 11.10 独立的工具 介绍一些第三方工具,这些工具可以在某些特定场景下提供额外的帮助。 #### 十一、数据访问方法 合理选择...
§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 簇 -...
乙提出的解决方案是使用分析函数`dense_rank()`,它能够在一行数据流中为每一行分配一个排名,基于指定的排序标准。在这个例子中,排序标准是`trunc(created,'dd')`降序,这样就能找到最近创建的记录。新的分析函数...
不过,使用分析函数的一个缺点是需要进行排序操作,这可能会带来额外的资源消耗。为了进一步优化,可以考虑为相关的列(如owner和trunc(created,'dd'))创建复合索引,这样不仅可以加速子查询的执行,还能减少排序的...
在IT行业中,地理信息系统(GIS)的处理与分析经常涉及到数据的导入与导出,而GDAL(Geospatial Data Abstraction Library)就是一个强大的开源工具,用于处理多种地理空间数据格式。本文将深入探讨如何利用GDAL ...
可以使用一个函数,将变量 name 中的姓和名分开就可以了,但是有一点需要注意,这个函数是不能作用在索引列上。下面是 SQL 查询脚本:select * from employee where first_name = SUBSTR('&&name',1,INSTR('&&name',...
通过这些例子,我们可以学习如何使用SELECT语句进行复杂的查询,包括JOIN操作、子查询、聚合函数(如COUNT, SUM, AVG)以及WHERE和HAVING子句的使用。 2. **PL/SQL编程**:Oracle提供了PL/SQL,一种嵌入式SQL编程...
- 索引优化:提高查询速度,包括B树索引、位图索引和函数索引。 5. **SQL查询**: - SELECT语句:用于从表中提取数据,涉及子查询、连接、聚合函数等高级用法。 - DML操作:INSERT插入数据,UPDATE更新,DELETE...
SQL语句的优化是数据库管理领域中的一个重要课题,尤其在Oracle数据库中更是如此。优化执行SQL语句不仅可以提高应用程序的性能,还可以提升用户体验。本文旨在从Oracle的角度出发,探讨SQL语句优化的基本原则和技术...
Oracle数据库系统是全球广泛使用的大型关系型数据库管理系统之一,尤其在企业级应用中占据着重要地位。本资源“Oracle数据库系统应用实例集锦与编程技巧(001)”旨在为开发者提供一系列实用的案例和编程技巧,帮助...