sql语句的简化(r2第7天)

今天碰到一个sql语句简化的问题,虽然也不复杂,但是也值得从中学习一些东西

SELECT MOD(((SELECT TO_NUMBER(TO_CHAR(LOGICAL_DATE, 'YYYY'))
               FROM SMALL_TAB
              WHERE LOGICAL_DATE_TYPE = 'R'
                AND EXPIRATION_DATE IS NULL) * 365 +
           (SELECT TO_NUMBER((SELECT LOGICAL_DATE
                                 FROM SMALL_TAB
                                WHERE LOGICAL_DATE_TYPE = 'R'
                                  AND EXPIRATION_DATE IS NULL) -
                              TRUNC(SYSDATE, 'YYYY'))
               FROM DUAL)) + 1,
           (SELECT NVL(PARAMETER_VALUE+1,366)FROM SMALL_TAB2
                                 WHERE PARAMETER_NAME = 'DAY_PAR')                     
  FROM DUAL

我得到了这样一个sql语句,但是猛一看sql语句里面包含了不少dual。 这样的sql语句是比较臃肿的,感觉需要做一些工作来改动,首先就是需要明确需求,开发想实现什么样的功能,然后在保证结果集准确的前提下来进行简化工作。 大体上沟通以后,sql语句的实现功能类似下面的形式 SELECT MOD((2014 * 365 + (165)) + 1, 366) FROM DUAL 其实就是计算当前的年份,然后得到对应的天数和当年一月一日以来的天数。 在此基础上做计算得到一个对应的key 简单调整后,就成了下面的样子,把多余的dual全都去掉了。在测试中比较发现,对应的逻辑读一下子从128降低到了64,相应时间也有了一定的提升。

select mod(
            (SELECT TO_NUMBER(TO_CHAR(LOGICAL_DATE, 'YYYY')) * 365 +
                  TO_NUMBER(LOGICAL_DATE - TRUNC(SYSDATE, 'YYYY')) + 1
             FROM SMALL_TAB
            WHERE LOGICAL_DATE_TYPE = 'R'
              AND EXPIRATION_DATE IS NULL),
           (SELECT NVL(PARAMETER_VALUE + 1, 366)
              FROM SMALL_TAB2
             WHERE PARAMETER_NAME = 'DAY_PAR')
           )
  from dual;

其实性能的提升不够明显,但是简单清晰的sql语句,在日常的维护中也能省不少心。

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2014-06-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

Oracle 索引质量分析

      索引质量的高低对数据库整体性能有着直接的影响。良好高质量的索引使得数据库性能得以数量级别的提升,而低效冗余的索引则使得数据库性能缓慢如牛,即便是使用...

721
来自专栏Grace development

电商系统设计之订单

用户交易将经历一段艰辛的历程,一般用户感觉不到,实际程序是经历了一段生死离别。具体付款流程如下

1422
来自专栏从ORACLE起航,领略精彩的IT技术。

Oracle之SQL优化专题01-查看SQL执行计划的方法3.1 dbms_xplan.display_cursor(null,null,'allstats last')3.2 dbms_xplan.

4585
来自专栏芋道源码1024

电商系统设计之订单

1. 前言2. 付款2.1 成功2.2 人祸2.4 天灾2.4 注释2.5 表结构2.5.1 交易表2.5.2 支付记录表2.5.3 订单表3. 运输4. 收货...

1343
来自专栏Java帮帮-微信公众号-技术文章全总结

Oracle应用实战七——多表查询+PL/SQL

1 多表查询 内连接 使用一张以上的表做查询就是多表查询 语法: SELECT {DISTINCT} *|列名.. FROM 表名 别名,表名1 别名 {WH...

5674
来自专栏Java Web

模仿天猫实战【SSM版】——项目起步

3194
来自专栏杨建荣的学习笔记

关于查询转换的一些简单分析(三) (r3笔记第69天)

关于查询转换,已经讨论了视图合并和子查询解嵌套,还有谓词推进和物化视图查询重写也是查询转换中不可或缺的部分。 -->谓词推进 这个术语听起来高大上,有点故弄玄虚...

27811
来自专栏乐沙弥的世界

PL/SQL --> INSTEAD OF 触发器

INSTEAD OF 触发器常用于管理编写不可更新的视图,INSTEAD-OF触发器必须是行级的。

732
来自专栏数据和云

利用分析函数改写范围判断自关联查询

分析、定位数据库的主要负载是这条语句引起的过程相对简单,通过AWR报告就可以比较容易的完成定位,这里就不赘述了。

1084
来自专栏Java学习123

ORACLE数据库日常维护

4778

扫码关注云+社区