`
ah_fu
  • 浏览: 227936 次
  • 性别: 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秒。

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

相关推荐

    福建省电力公司oracle培训教材--PLSQL语言篇.pptx

    【Oracle入门——PL/SQL语言篇】 Oracle数据库系统是全球广泛使用的数据库管理系统之一,而PL/SQL(Procedural Language/SQL)是Oracle特有的一种编程语言,它结合了SQL的查询能力与过程化编程语言的特点,使得...

    Oracle_Database10g_性能调整与优化-第10章_使用PLSQL提高性能

    ### Oracle Database 10g 性能调整与优化——使用PL/SQL提高性能 #### 1. 使用 DBMS_APPLICATION_INFO 进行实时监控 DBMS_APPLICATION_INFO 包为用户提供了一个强大的机制来交换环境中执行处理的时间点信息。通过...

    PLSQL简介.pdf

    除了记录之外,PL/SQL还支持一种类似于数组的结构——**PL/SQL表**。这种表与传统的数组不同,它的大小是动态的,可以在运行时增加或减少元素。 ##### 表类型定义形式 PL/SQL表可以通过以下语法定义: ```sql ...

    oracle笔记——代码居多,已加注释

    - `SHARED_POOL_SIZE`用于改变共享池的大小,这包含PL/SQL编译的结果和SQL解析信息。 4. **SGA查询**: - `V$SGA`视图提供了系统全局区的所有组件的大小信息,如固定大小区域、可变大小区域、数据库缓冲区和重做...

    SQL Tuning - File IO Performance

    当共享SQL区域变得无效时,必须重新解析SQL语句才能执行,这一过程称为重载。 #### SQL区域性能指标分析 为了更直观地了解SQL区域的性能状况,可以通过以下查询来获取相关信息: - 使用`SELECT * FROM v$sgastat;...

    Oracle_PL-SQL入门教程(金典)

    SQL语言的重要性在于其通用性——几乎所有主流的关系型数据库管理系统(RDBMS),比如Oracle、Sybase、Microsoft SQL Server、Access等,都支持SQL标准。 #### SQL语言的核心功能 - **数据定义语言 (DDL)**:这...

    MLDN魔乐科技JAVA培训_Oracle课堂24_嵌套表、可变数组.rar

    本课程"MLDN魔乐科技JAVA培训_Oracle课堂24_嵌套表、可变数组"着重讲解了Oracle数据库中的两种特殊数据结构——嵌套表和可变数组,它们在处理复杂数据时非常有用。 嵌套表,也称为集合类型,允许在一个列中存储多个...

    oracle导入表导入数据实例

    本实例主要探讨如何使用Oracle的数据导入工具——SQL*Loader,通过控制文件(`.ctl`)来执行这一过程。以下是对"oracle导入表导入数据实例"的详细解析: 1. **SQL*Loader简介** SQL*Loader是Oracle提供的一种快速...

    收获不知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 删除...

    20194225144-杨子煜-实验2 Oracle常用工具的使用——预习题.docx

    2. **PL/SQL Developer**:这是一个集成开发环境,专为Oracle数据库的存储过程、函数、触发器等PL/SQL代码提供编写、调试和管理功能。它具有自动补全和语法高亮等特性,便于开发和维护。 3. **Toad for Oracle**:...

    Oracle应用项目——使用DBCA创建数据库实例.pdf

    总之,Oracle数据库的创建、管理和删除是一项复杂的工作,但通过DBCA工具,这个过程变得更加简单和直观。理解并熟练掌握DBCA的使用,对于任何Oracle数据库管理员来说都是至关重要的技能。通过学习《ORACLE数据库管理...

    Oracle_Database_11g完全参考手册.part3/3

    《Oracle Database 11g完全参考手册》全面详细地介绍了Oracle Database 11g的强大功能,阐述了如何使用所有的新增功能和工具,如何执行功能强大的SOL查询,如何编写PL/SQL和SQL*Plus语句,如何使用大对象和对象,...

    Oracle_Database_11g完全参考手册.part2/3

    《Oracle Database 11g完全参考手册》全面详细地介绍了Oracle Database 11g的强大功能,阐述了如何使用所有的新增功能和工具,如何执行功能强大的SOL查询,如何编写PL/SQL和SQL*Plus语句,如何使用大对象和对象,...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    SQL(Structured Query Language)结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。同时也是数据库脚本文件的扩展名。  SQL语言主要包含5个部分  数据定义...

    SqleditPlugs2.0.2

    对于Oracle用户,它提供了一流的PL/SQL支持,使得在处理复杂数据结构和存储过程时更加得心应手。对于MySQL爱好者,它支持InnoDB引擎,可以高效地管理事务和行级锁定。对于MSSQL用户,它支持T-SQL,允许用户充分利用...

    数据库调优

    - **库缓冲区组成**:库缓冲区由私有和共享SQL/PL/SQL区域组成。 - **库缓冲区命中率**:通过比较库缓冲区的命中率来判断是否需要调整其大小。 2. **活动统计信息查询** - 使用`v$librarycache`表来查询库缓冲区...

    商业源码-编程源码-phpBB v3.0.7 PL1 中文版.zip

    PL1(Point Release 1)表明这是该版本的一个小更新,通常涉及bug修复和性能优化。 在phpBB v3.0.7中,中文版的引入是为了满足中国用户的需求,使得非英语用户也能无障碍地使用和管理论坛。这涉及到本地化技术,...

Global site tag (gtag.js) - Google Analytics