`
ah_fu
  • 浏览: 223222 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

大表变小表,小表再连接————记一次PL/SQL优化过程

SQL 
阅读更多
     公司的业务系统中存在一个大的日志表,表大约是这样:
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(1as 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(1as times
FROM log INNER JOIN result1 ON 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(1AS 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 log
        
WHERE logtime>=sysdate - 1/24*2
    ),
    result2 
AS
    (
        
SELECT username, count(1AS 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秒。

    总结下来,这个查询优化的思路为:大表变小表,小表再连接。
    希望有高手能够提出更好的想法,谢谢!
分享到:
评论

相关推荐

    pl/sql develpment 8 下载

    pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl/sql 下载pl...

    pl/sql例题代码pl/sql例题代码pl/sql例题代码

    pl/sql例题代码pl/sql例题代码pl/sql例题代码

    DBAtools for PL/SQL表空间管理器

    PL/SQL Developer是Oracle数据库当前最流行的开发工具之一,它在ORACLE数据库开发设计方面功能强大,使用方便,但是数据库管理方面一直比较欠缺。 DBATools For PL/SQL Developer 是一款PL/SQL Developer的辅助插件...

    一个对数据库的操作工具PL/SQLpl/sqL工具

    一个对数据库的操作工具PL/SQL,能够对ORACLE\SQL进行很好的帮助操作!

    PL/SQL Developer v8.0.zip

    性能优化——使用PL/SQL Profiler,可以浏览每一执行的PL/SQL代码行的时序信息(Oracle8i或更高),从而优化您SQL和PL/SQL的代码性能。 更进一步,您还可以自动获取所执行的SQL语句和PL/SQL程序统计信息。该统计...

    PL/SQL Developer 6.05注册版-1

    <br>性能优化——使用PL/SQL Profiler,可以浏览每一执行的PL/SQL代码行的时序信息(Oracle8i或更高),从而优化您SQL和PL/SQL的代码性能。 更进一步,您还可以自动获取所执行的SQL语句和PL/SQL程序统计信息...

    pl/sql developer11.0

    pl/sql developer11.0下载 pl/sql developer11.0下载 pl/sql developer11.0下载

    sql pl/sql存储过程

    第一章 PL/SQL 简介 安装scott/tigger用户模式 Example1 标准的PL/SQL块结构 PL/SQL块类型 Example2:子程序,函数,程序包 PL/SQL代码的执行 第二章 PL/SQL数据类型 预定义数据类型 数值数据类型 字符数据类型 字符...

    PL/SQL Developer9.06

    如今,有越来越多的商业逻辑和应用逻辑转向了Oracle Server,因此,PL/SQL编程也成了整个开发过程的一个重要组成部分。PL/SQL Developer侧重于易用性、代码品质和生产力,充分发挥Oracle应用程序开发过程中的主要...

    PL/SQL Developer 客户端

    PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL把数据操作和查询语句组织在PL/SQL代码的...

    Oracle PL/SQL程序设计(第5版)(套装上下册)

    《Oracle PL/SQL程序设计(第5版)(套装上下册)》基于Oracle数据库11g,从PL/SQL编程、PL/SQL程序结构、PL/SQL程序数据、PL/SQL中的SQL、PL/SQL应用构建、高级PL/SQL主题这6个方面详细系统地讨论了PL/SQL以及如何...

    Pl/Sql程序设计

    1、PL/SQL简介 2、PL/SQL基础 3、记录和表 4、在PL/SQL中使用SQL 5、内置SQL函数 6、游标 7、过程和函数 ...

    pl/sql最新中文手册

    最新pl/sql7.0中文手册

    PL/SQL Developer 7.1.5 注册版-3

    <br>性能优化——使用PL/SQL Profiler,可以浏览每一执行的PL/SQL代码行的时序信息(Oracle8i或更高),从而优化您SQL和PL/SQL的代码性能。 更进一步,您还可以自动获取所执行的SQL语句和PL/SQL程序统计信息...

    Oracle PL SQL程序设计 上 第五版(代码示例)

    《oracle pl/sql程序设计(第5版)》基于oracle数据库11g,从pl/sql编程、pl/sql程序结构、pl/sql程序数据、pl/sql中的sql、pl/sql应用构建、高级pl/sql主题6个方面详细系统地讨论了pl/sql以及如何有效地使用它。...

    PL/SQL免安装版

    PL/SQL也是一种程序语言,叫做过程化SQL语言(Procedural Language/SQL)。PL/SQL是Oracle数据库对SQL语句的扩展。在普通SQL语句的使用上增加了编程语言的特点,所以PL/SQL把数据操作和查询语句组织在PL/SQL代码的...

    PL/SQL Developer

     性能优化——使用PL/SQL Profiler,可以浏览每一执行的PL/SQL代码行的时序信息(Oracle8i或更高),从而优化您SQL和PL/SQL的代码性能。  更进一步,您还可以自动获取所执行的SQL语句和PL/SQL程序统计信息。该...

    PL/SQL Developer V7.1.4

    PL/SQL Developer是一种集成的开发环境,专门用于开发、测试、调试和优化Oracle PL/SQL存储程序单元,比如触发器等。PL/SQL Developer功能十分全面,大大缩短了程序员的开发周期。强大的PL/SQL编辑器,完善的Debugger...

    PL/SQL 用户指南与参考

    第一章 PL/SQL一览 第二章 PL/SQL基础 第三章 PL/SQL数据类型 第四章 PL/SQL的控制结构 第五章 PL/SQL集合与记录 第六章 PL/SQL与Oracle间交互 第七章 控制PL/SQL错误 第八章 PL/SQL子程序 第九章 PL/SQL包...

    PL/SQL详细教程

    PL/SQL教程PL/SQL教程PL/SQL教程PL/SQL教程PL/SQL教程PL/SQL教程PL/SQL教程PL/SQL教程

Global site tag (gtag.js) - Google Analytics