`
xpenxpen
  • 浏览: 711113 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

去掉对列的函数操作以及建立partition提高SQL执行效率

 
阅读更多
SQL很简单,查询一个表在日期区间内的记录条数。
原来是这么写的

SELECT COUNT(1) 
FROM TABLE_X A 
WHERE 1 = 1 
AND TO_CHAR(A.starttime, 'YYYYMMDDHH24MISS') >= '20010101121212'
AND TO_CHAR(A.endtime, 'YYYYMMDDHH24MISS') <= '20130101121212'


这张表1000万级数据,查询count用了15秒。

改成下面这样

SELECT COUNT(1) 
FROM TABLE_X A 
WHERE 1 = 1 
AND A.starttime >= TO_DATE('20010101121212', 'YYYYMMDDHH24MISS')
AND A.endtime  <= TO_DATE('20130101121212' , 'YYYYMMDDHH24MISS')

查询count只需要5秒了。


我们发现把左边字段的TO_CHAR函数去掉,SQL执行效率显著提高了。
为什么呢,以下是摘录自网络的一段:

任何对列的操作都可能导致全表扫描,这里所谓的操作包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等式的右边,甚至去掉函数。  
例:下列SQL条件语句中的列都建有恰当的索引,但30万行数据情况下执行速度却非常慢:  
select * from record where  substrb(CardNo,1,4)='5378'(13秒) 
select * from record where  amount/30< 1000(11秒) 
select * from record where  to_char(ActionTime,'yyyymmdd')='19991201'(10秒) 
由于where子句中对列的任何操作结果都是在SQL运行时逐行计算得到的,因此它不得不进行表扫描,而没有使用该列上面的索引;如果这些结果在查询编译时就能得到,那么就可以被SQL优化器优化,使用索引,避免表扫描,因此将SQL重写如下:
select * from record where CardNo like  '5378%'(< 1秒)(操作放在了右边)
select * from record where amount  < 1000*30(< 1秒)(操作放在了右边)
select * from record where ActionTime= to_date ('19991201' ,'yyyymmdd')(< 1秒)(操作放在了右边)
差别是很明显的!


另外我们表里已对endtime进行了partition,每2个小时段的数据分一个partition,这样可显著调高查询效率
  (
    PARTITION "PART_201201011400" VALUES LESS THAN (TO_DATE(' 2012-01-01 14:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))  ,
    PARTITION "PART_201201011600" VALUES LESS THAN (TO_DATE(' 2012-01-01 16:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))  ,
    PARTITION "PART_MAX" VALUES LESS THAN (MAXVALUE) 
  ) ;
分享到:
评论

相关推荐

    SQL窗口函数速查表.pdf

    ### SQL窗口函数速查表知识点概述 ...通过对窗口函数的深入理解,可以极大地提高数据处理和分析的效率,尤其是在处理复杂数据集时能够编写出更高效的查询语句。无论是初学者还是高级用户,都可以从中受益匪浅。

    精通sql,很好的sql教程

    3. 使用EXPLAIN分析查询计划:了解SQL执行的详细步骤,找出性能瓶颈。 4. 分区表:对大表进行分区,提高查询和维护性能。 5. 适当的数据类型:选择合适的数据类型可以节省存储空间,提高查询效率。 五、SQL安全性 1...

    sql去掉重复的数据 完全相同的数据去掉重复 及优化

    ### SQL去掉重复的数据及优化 在数据库管理与应用开发中,数据去重是一个常见的需求,尤其是在数据清洗、数据整合等场景下尤为重要。本文将详细探讨如何利用SQL查询语句来去除表中的重复记录,并在此基础上进一步...

    sql cookbook

    窗口函数(Window Functions)是SQL中的一个强大工具,用于在一组相关行上执行聚合计算。OVER(PARTITION BY)用于定义窗口函数的作用范围。 例如,可以使用ROW_NUMBER(), RANK(), DENSE_RANK()等函数来对每个部门内...

    Oracle分析函数详述

    总的来说,Oracle分析函数为数据处理提供了一种强大而灵活的方法,使得数据分析师和开发人员能够在单个SQL查询中完成复杂的分析任务,极大地提高了数据处理的效率和精度。通过熟练掌握这些函数,可以更好地利用...

    oracle-sql.rar_oracle

    4. 存储过程(STORED PROCEDURE)和函数(FUNCTION):封装SQL语句,提高代码复用性和效率。 5. 事务(TRANSACTION):确保数据的一致性和完整性,通过COMMIT提交和ROLLBACK回滚操作。 这些是Oracle SQL的一些基础...

    sql 2000 各语句

    通过学习和熟练掌握这些语句,可以有效地管理和操作数据库,提高工作效率。在实际项目中,根据具体需求,还可以结合T-SQL(Transact-SQL)的扩展功能,如事务处理、动态SQL、游标操作等,实现更复杂的业务逻辑。

    sql面试[参考].pdf

    这些示例展示了SQL在处理复杂查询时的灵活性和效率,对于软件开发人员来说,理解和熟练运用这些技巧是非常重要的。在面试中能够正确解答这些问题,将展示出你对SQL的强大掌握和解决问题的能力。

    T-SQL高级查询

    c、 要对其执行聚合函数的列 compute by适合做先分组后汇总的业务。compute by后面的列一定要是order by中出现的列。 3、 cube汇总 cube汇总和compute效果类似,但语法较简洁,而且返回的是一个结果集。 ...

    search-double-data.zip_sql重复查询_重复数据

    在SQL数据库管理中,重复数据有时会导致数据不一致性和效率问题。标题"search-double-data.zip_sql重复查询_重复数据"提示我们关注的重点是如何在数据库中查找并处理重复数据。描述指出,通过特定的SQL语句,我们...

    SQLSERVER笔记之行压缩和页压缩.docx

    行压缩和页压缩作为SQL Server 2021中的一项重要特性,对于提高数据存储效率、降低存储成本有着显著的作用。通过合理的使用这些压缩技术,可以有效减少数据库占用的空间,进而提高整体系统的性能表现。

    使用SQL语句去掉重复的记录【两种方法】

    在SQL数据库管理中,删除重复记录是一个常见的需求,特别是在处理...在实际操作中,务必确保在执行任何删除操作前备份数据,以免丢失重要信息。同时,测试不同策略的性能也至关重要,以找到最适合当前环境的解决方案。

    Python大数据处理库 PySpark实战-源代码.rar

    - 配置调优:合理设置executor数量、内存大小等参数,平衡资源利用率和任务执行效率。 8. PySpark实战项目: - 数据清洗:去除异常值,填充缺失值,数据格式转换等。 - 数据分析:统计分析,关联规则挖掘,聚类...

    oracle本表去重的语句优化

    然而,由于没有使用索引,执行效率极低,导致执行15小时仍未完成。 针对这个问题,可以采取以下几种优化策略: 1. **使用临时表**: - 首先创建一个临时表,插入`bao_mobile_temp`表中唯一不同的`mobile`值。 - ...

    learning pyspark

    - **Catalyst Optimizer**:Catalyst 是 Spark SQL 的查询优化器,它可以分析和优化 SQL 查询计划,提高执行效率。 - **Project Tungsten**:Tungsten 是 Spark 的性能优化项目之一,旨在减少 JVM 的开销,提升 ...

    oracle常用的数据库脚本

    在Oracle数据库管理中,脚本是执行特定任务的SQL或PL/SQL集合,它们极大地提高了DBA(数据库管理员)和开发人员的工作效率。本话题主要围绕"oracle常用的数据库脚本"展开,特别是针对如何处理重复数据的问题。我们将...

    oracle命令

    - **PARTITION BY**:用于对数据进行分区,可以在每个分区内应用排名函数。 #### 八、ROWID与ROWNUM - **ROWID**:Oracle中每个记录都有唯一的ROWID,表示该记录的物理地址。 - **ROWNUM**:生成行号,常用于限制...

    hadoop 开发规范

    本文档旨在详细介绍HiveSQL开发规范的各项规则,包括数据类型、运算符及函数、数据定义命令、数据操作命令以及数据查询SQL等方面的内容,并给出一些优化实例和解决常见问题的方法。 #### 二、HiveSQL语法规则 ####...

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

     数据定义语言Data Definition Language(DDL),用来建立数据库、数据对象和定义其列。例如:CREATE、DROP、ALTER等语句。  数据操作语言Data Manipulation Language(DML),用来插入、修改、删除、查询,可以...

Global site tag (gtag.js) - Google Analytics