公司的业务系统中存在一个大的日志表,表大约是这样:
create table log
(
logtime date, -- PK
username varchar2(20)
);
现有需求如下:统计日志表中,两小时内使用过系统的用户在三天内的日志数。
最初编写的查询如下:
WITH
result1 AS
(
SELECT DISTINCT username
FROM log
WHERE logtime>=sysdate - 1/24*2
)
SELECT log.username, count(1) as times
FROM log INNER JOIN result1 ON log.username=result1.username
WHERE logtime>=sysdate - 3
GROUP BY log.username;
后来发现,log表记录达到300万后,查询非常慢。测试后发现是因为log表和临时视图result1连接的时候,采用NESTED LOOPS,于是增加提示,采用HASH连接:
WITH
result1 AS
(
SELECT DISTINCT username
FROM log
WHERE logtime>=sysdate - 1/24*2
)
SELECT /**+USE_HASH(log)*/ log.username, count(1) as times
FROM log INNER JOIN result1 ON
le="color: rgb(255, 0, 255);">log.username=result1.username
WHERE logtime>=sysdate - 3
GROUP BY log.username;
效率果然提高了很多,但是还是不令人满意。
测试的过程中发现,如果不先选取两小时内的用户,而直接选取三天内的所有用户来统计,效率非常高。看来,性能的瓶颈还是在表连接上。在已经选用HASH连接的情况下,只有想办法减少连接的记录数了。于是尝试写了如下查询:
WITH
result1 AS
(
SELECT DISTINCT username
FROM log
WHERE logtime>=sysdate - 1/24*2
),
result2 AS
(
SELECT username, count(1) AS times
FROM log
WHERE logtime>=sysdate - 3
GROUP BY username
)
SELECT result2.username, result1.times
FROM result1 INNER JOIN result2 ON result1.username=result2.username;
性能高了好多好多!!!
哦,还忘记了点东西:
WITH
result1 AS
(
SELECT DISTINCT username
FROM&nb
sp;log
WHERE logtime>=sysdate - 1/24*2
),
result2 AS
(
SELECT username, count(1) AS times
FROM log
WHERE logtime>=sysdate - 3
GROUP BY username
)
SELECT /**+USE_HASH(result1)*/ result2.username, result1.times
FROM result1 INNER JOIN result2 ON result1.username=result2.username;
测试一下,性能又高了一点点。
3天内的日志数是300万,第一个查询执行了1小时以上,优化后的最后一个查询只花了112秒。
总结下来,这个查询优化的思路为:大表变小表,小表再连接。
希望有高手能够提出更好的想法,谢谢!
发表评论
-
Oracle plsql后台程序建议
2011-03-02 12:03 696个人改进建议: 1、游标取数时,采用批量取数的方法: ... -
oracle10g 的一个问题
2011-03-02 11:39 640oracle10g 的一个问题: 创建主键的时候, 默 ... -
Oracle视图使用
2011-02-15 17:13 0Oracle视图使用经验谈: 1、如果视图仅仅是 ... -
Oracle 10g 中的递归查询(树型查询)
2011-01-27 01:35 924Oracle 10g 中的递归查询(树型查询) 一、树型表 ... -
PLSQL 中Merge into和Update的用法
2011-01-27 01:31 1478在oracle 中有个语法:merge 用法如下: ... -
Oracle培训的总结
2011-01-27 01:30 698前段时间,因为要升级系统到Oracle环境,公司请了一位在 ... -
Oracle 培训材料
2011-01-27 01:29 626前段时间给公司做个Oracle培训,一直在学oracl ... -
Oracle 简单的SQL调优
2011-01-27 01:27 728今天刚看到一篇简单的SQL调优,自己也试了一下优化。原文如下: ... -
PL/SQL最差实践
2011-01-27 01:15 5661. 超长的PL/SQL代码 影响:可维护性,性能 ... -
高效的PL/SQL程序设计--批量处理
2011-01-27 00:59 612批量处理一般用在ETL操作, ETL代表提取(extract) ... -
PL/SQL用户指南与参考--PL/SQL应用程序性能调优(转)
2011-01-27 00:57 623PL/SQL应用程序性能调优 <!-- Instanc ... -
PLSQL 中Merge into和Update的用法
2011-01-18 20:42 1280这两天一直在处理关于SQL server存储过程转换到Orac ... -
PL/SQL优化
2011-01-18 19:51 826PL/SQL优化 注:O代表比X 更优化的写法。 以 ... -
Oracle SQL 内置函数大全
2009-03-25 21:25 607SQL中的单记录函数 1.ASCI ... -
PL/SQL中用光标查询多条记录
2009-03-25 21:19 732一、 什么是光标 Oracle ... -
PL/SQL开发中动态SQL的使用方法
2009-03-25 21:11 1118一般的PL/SQL程序设计中,在DML和事务控制的语句中可 ...
相关推荐
【Oracle入门——PL/SQL语言篇】 Oracle数据库系统是全球广泛使用的数据库管理系统之一,而PL/SQL(Procedural Language/SQL)是Oracle特有的一种编程语言,它结合了SQL的查询能力与过程化编程语言的特点,使得...
### Oracle Database 10g 性能调整与优化——使用PL/SQL提高性能 #### 1. 使用 DBMS_APPLICATION_INFO 进行实时监控 DBMS_APPLICATION_INFO 包为用户提供了一个强大的机制来交换环境中执行处理的时间点信息。通过...
除了记录之外,PL/SQL还支持一种类似于数组的结构——**PL/SQL表**。这种表与传统的数组不同,它的大小是动态的,可以在运行时增加或减少元素。 ##### 表类型定义形式 PL/SQL表可以通过以下语法定义: ```sql ...
- `SHARED_POOL_SIZE`用于改变共享池的大小,这包含PL/SQL编译的结果和SQL解析信息。 4. **SGA查询**: - `V$SGA`视图提供了系统全局区的所有组件的大小信息,如固定大小区域、可变大小区域、数据库缓冲区和重做...
当共享SQL区域变得无效时,必须重新解析SQL语句才能执行,这一过程称为重载。 #### SQL区域性能指标分析 为了更直观地了解SQL区域的性能状况,可以通过以下查询来获取相关信息: - 使用`SELECT * FROM v$sgastat;...
SQL语言的重要性在于其通用性——几乎所有主流的关系型数据库管理系统(RDBMS),比如Oracle、Sybase、Microsoft SQL Server、Access等,都支持SQL标准。 #### SQL语言的核心功能 - **数据定义语言 (DDL)**:这...
本课程"MLDN魔乐科技JAVA培训_Oracle课堂24_嵌套表、可变数组"着重讲解了Oracle数据库中的两种特殊数据结构——嵌套表和可变数组,它们在处理复杂数据时非常有用。 嵌套表,也称为集合类型,允许在一个列中存储多个...
本实例主要探讨如何使用Oracle的数据导入工具——SQL*Loader,通过控制文件(`.ctl`)来执行这一过程。以下是对"oracle导入表导入数据实例"的详细解析: 1. **SQL*Loader简介** SQL*Loader是Oracle提供的一种快速...
7.5 大表砍成小表了 373 7.6 排重操作消失了 373 7.7 插入阻碍小多了 374 7.8 迁移事情不做了 375 第8章升级!靠技术改隐形刀 377 8.1 大表等同小表了 378 8.2 大表切成小表了 379 8.3 索引变身小表了 380 8.4 删除...
2. **PL/SQL Developer**:这是一个集成开发环境,专为Oracle数据库的存储过程、函数、触发器等PL/SQL代码提供编写、调试和管理功能。它具有自动补全和语法高亮等特性,便于开发和维护。 3. **Toad for Oracle**:...
总之,Oracle数据库的创建、管理和删除是一项复杂的工作,但通过DBCA工具,这个过程变得更加简单和直观。理解并熟练掌握DBCA的使用,对于任何Oracle数据库管理员来说都是至关重要的技能。通过学习《ORACLE数据库管理...
《Oracle Database 11g完全参考手册》全面详细地介绍了Oracle Database 11g的强大功能,阐述了如何使用所有的新增功能和工具,如何执行功能强大的SOL查询,如何编写PL/SQL和SQL*Plus语句,如何使用大对象和对象,...
《Oracle Database 11g完全参考手册》全面详细地介绍了Oracle Database 11g的强大功能,阐述了如何使用所有的新增功能和工具,如何执行功能强大的SOL查询,如何编写PL/SQL和SQL*Plus语句,如何使用大对象和对象,...
SQL(Structured Query Language)结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。同时也是数据库脚本文件的扩展名。 SQL语言主要包含5个部分 数据定义...
对于Oracle用户,它提供了一流的PL/SQL支持,使得在处理复杂数据结构和存储过程时更加得心应手。对于MySQL爱好者,它支持InnoDB引擎,可以高效地管理事务和行级锁定。对于MSSQL用户,它支持T-SQL,允许用户充分利用...
- **库缓冲区组成**:库缓冲区由私有和共享SQL/PL/SQL区域组成。 - **库缓冲区命中率**:通过比较库缓冲区的命中率来判断是否需要调整其大小。 2. **活动统计信息查询** - 使用`v$librarycache`表来查询库缓冲区...
PL1(Point Release 1)表明这是该版本的一个小更新,通常涉及bug修复和性能优化。 在phpBB v3.0.7中,中文版的引入是为了满足中国用户的需求,使得非英语用户也能无障碍地使用和管理论坛。这涉及到本地化技术,...