文档章节

SQL --动态SQL优化

求是科技
 求是科技
发布于 2015/10/19 17:42
字数 490
阅读 69
收藏 1
点赞 0
评论 0

我写的SQL如下

        SELECT
        tall.LOCATION_ID,
        tall.LOCATION_NAME,
        tall.JOB_ID,
        tall.JOB_NAME,
        tall.NEGOTIABLE_FLAG,
        tall.SALARY_MAX,
        tall.SALARY_MIN,
        tall.ADD_TIME,
        tall.ENTERPRISE_ID,
        tall.ENTERPRISE_NAME,
        tall.ENTERPRISE_LOGO,
        tall.WORK_YEARS_ID,
        tall.WORK_YEARS_INFO,
        IFNULL( tujf.FOCUS_FLAG,0) as flag
        FROM
        (SELECT
        tj.JOB_ID,
        tj.LOCATION_ID,
        tl.LOCATION_NAME,
        tj.JOB_NAME,
        tj.NEGOTIABLE_FLAG,
        tj.SALARY_MAX,
        tj.SALARY_MIN,
        tj.ADD_TIME,
        tj.ENTERPRISE_ID,
        te.ENTERPRISE_NAME,
        te.ENTERPRISE_LOGO,
        twy.WORK_YEARS_ID,
        twy.WORK_YEARS_INFO
        FROM
        t_job
        tj,t_location tl,t_enterprise te,t_hr th,t_work_years
        twy,t_job_category tjc,t_job_type tjt,t_salary ts
        WHERE tj.LOCATION_ID
        = tl.LOCATION_ID
        AND tl.LOCATION_LEVEL = 2
        AND tl.USE_FLAG = 1
        AND
        tj.ENTERPRISE_ID = te.ENTERPRISE_ID
        AND te.USE_FLAG = 1
        AND tj.HR_ID =
        th.HR_ID
        AND th.USE_FLAG = 1
        AND tj.WORK_YEARS_ID = twy.WORK_YEARS_ID
        AND tj.JOB_CATEGORY_ID = tjc.JOB_CATEGORY_ID
        AND tjc.USE_FLAG = 1
        AND
        tj.JOB_TYPE_ID = tjt.JOB_TYPE_ID
        AND tjt.USE_FLAG = 1
        AND ts.SALARY_ID =
        #{salaryId}
        AND ts.SALARY_MAX >=tj.SALARY_MAX
        AND ts.SALARY_MIN <=
        tj.SALARY_MIN
        <if test="jobCategoryId != null">
            AND
            tjc.JOB_CATEGORY_ID = #{jobCategoryId}
        </if>
        <if test="locationId != null">
            AND
            tl.LOCATION_ID = #{locationId}
        </if>
        <if test="workYearId != null">
            AND
            twy.WORK_YEARS_ID = #{workYearId}
        </if>
        <if test="jobTypeId != null">
            AND
            tjt.JOB_TYPE_ID = #{jobTypeId}
        </if>
        <if test="lastTime != null">
            AND
            tj.ADD_TIME &lt;= #{lastTime}
        </if>
        GROUP BY
        tj.JOB_ID
        ORDER BY
        tj.ADD_TIME DESC) tall
        left join
        (select JOB_ID
        as
        FOCUS_JOB_ID,'1' as FOCUS_FLAG from
        t_user_job_focus where
        user_id =
        #{userId} and TYPE = '01') tujf
        on
        tall.JOB_ID = tujf.FOCUS_JOB_ID
        LIMIT
        #{pageIndex}

优化后的SQL如下

        SELECT
        tallTwo.JOB_ID,
        tallTwo.LOCATION_ID,
        tallTwo.LOCATION_NAME,
        tallTwo.JOB_NAME,
        tallTwo.NEGOTIABLE_FLAG,
        tallTwo.SALARY_MAX,
        tallTwo.SALARY_MIN,
        tallTwo.ADD_TIME,
        tallTwo.ENTERPRISE_ID,
        tallTwo.ENTERPRISE_NAME,
        tallTwo.ENTERPRISE_LOGO,
        tallTwo.WORK_YEARS_ID,
        tallTwo.WORK_YEARS_INFO,
        tallTwo.HR_ID,
        tallTwo.JOB_CATEGORY_ID,
        IFNULL( tujf.FOCUS_FLAG,0) as flag
        FROM
        (SELECT
        tall.JOB_ID,
        tall.LOCATION_ID,
        tl.LOCATION_NAME,
        tall.JOB_NAME,
        tall.NEGOTIABLE_FLAG,
        tall.SALARY_MAX,
        tall.SALARY_MIN,
        tall.ADD_TIME,
        tall.ENTERPRISE_ID,
        te.ENTERPRISE_NAME,
        te.ENTERPRISE_LOGO,
        tall.WORK_YEARS_ID,
        twy.WORK_YEARS_INFO,
        tall.HR_ID,
        tall.JOB_CATEGORY_ID,
        tall.JOB_TYPE_ID
        FROM
        (
        SELECT
        tj.JOB_ID,
        tj.LOCATION_ID,
        tj.JOB_NAME,
        tj.NEGOTIABLE_FLAG,
        tj.SALARY_MAX,
        tj.SALARY_MIN,
        tj.ADD_TIME,
        tj.ENTERPRISE_ID,
        tj.WORK_YEARS_ID,
        tj.HR_ID,
        tj.JOB_CATEGORY_ID,
        tj.JOB_TYPE_ID
        FROM
        t_job tj
        <if test="salaryId != null">
            ,t_salary ts
        </if>
        WHERE
        1 = 1
        <if test="salaryId != null">
            AND ts.SALARY_ID = #{salaryId}
            AND ts.SALARY_MAX
            &gt;=tj.SALARY_MAX
            AND ts.SALARY_MIN &lt;= tj.SALARY_MIN
        </if>
        <if test="locationId != null">
            AND
            tj.LOCATION_ID = #{locationId}
        </if>
        <if test="workYearId != null">
            AND
            tj.WORK_YEARS_ID = #{workYearId}
        </if>
        <if test="jobCategoryId != null">
            AND
            tj.JOB_CATEGORY_ID =
            #{jobCategoryId}
        </if>
        <if test="jobTypeId != null">
            AND
            tj.JOB_TYPE_ID = #{jobTypeId}
        </if>
        <if test="lastTime != null">
            AND
            tj.ADD_TIME &lt;= #{lastTime}
        </if>
        GROUP BY tj.JOB_ID
        ORDER BY tj.ADD_TIME DESC
        ) tall
        LEFT JOIN t_location
        tl ON tall.LOCATION_ID = tl.LOCATION_ID
        AND tl.LOCATION_LEVEL = 2
        AND
        tl.USE_FLAG = 1
        LEFT JOIN t_enterprise te ON tall.ENTERPRISE_ID =
        te.ENTERPRISE_ID
        AND te.USE_FLAG = 1
        LEFT JOIN t_hr th ON tall.HR_ID =
        th.HR_ID
        AND th.USE_FLAG = 1
        LEFT JOIN t_work_years twy ON
        tall.WORK_YEARS_ID = twy.WORK_YEARS_ID
        LEFT JOIN t_job_category tjc ON
        tall.JOB_CATEGORY_ID = tjc.JOB_CATEGORY_ID
        AND tjc.USE_FLAG = 1
        LEFT JOIN t_job_type tjt ON
        tall.JOB_TYPE_ID = tjt.JOB_TYPE_ID
        AND tjt.USE_FLAG = 1)
        tallTwo
        LEFT JOIN (select JOB_ID as FOCUS_JOB_ID,'1' as FOCUS_FLAG from
        t_user_job_focus where user_id = #{userId} and TYPE = '01') tujf
        ON
        tallTwo.JOB_ID = tujf.FOCUS_JOB_ID
        LIMIT #{pageIndex}

思路对比

我的思路:先关联所有需要的表查出所有的数据,再根据条件过滤。

项目经理思路:先查出基本数据,根据条件过滤,再关联需要的表。

© 著作权归作者所有

共有 人打赏支持
求是科技
粉丝 89
博文 453
码字总数 228281
作品 0
成都
后端工程师
Guzz1.2.8 beta2--支持动态加载在线调试SQL

guzz是一套用来解决ORM、多数据源管理、以及通用数据计算的数据层框架,为系统在数据层的设计提供一站式解决方案。guzz可以看作是 ibatis/hibernate的一大的延伸,并可以取代这2个东西。 gu...

谷子发布 ⋅ 2010/05/26 ⋅ 0

guzz 1.2.8 正式版发布--支持注解与动态SQL

Guzz 是一种用来进行快速开发和高性能网站设计的框架,用于替代或者补充hibernate或ibatis的持久化实现,并提供更多的大型系统架构设计 支持。guzz的目标是使得大型化网站设计更加简单,团队...

红薯 ⋅ 2010/06/21 ⋅ 0

Oracle 12C优化器的巨大变化,上生产必读(上)

序言 优化器是Oracle数据库最吸引人的部件之一,因为它对每一个SQL语句的处理都必不可少。优化器为每个SQL语句确定最有效的执行计划,这是基于给定的查询的结构,可用的关于底层对象的统计信...

苏旭辉 ⋅ 2016/04/27 ⋅ 0

mybatis-plus 2.1.6 发布,模块分离,代号:小秋秋之吻

mybatis-plus 是一款 mybatis 动态 SQL 自动注入 mybatis 增删改查 CURD 操作中间件。让 mybatis 拥有 hibernate 的单表高效,也保留 xml sql 的灵动, 减少你的开发周期优化动态维护 xml 实...

青苗 ⋅ 2017/11/22 ⋅ 19

数据库sql优化经验总结

数据库sql优化经验总结 1.sql语句用索引,先聚集,后非聚集 sql语句查询中,能够使用聚集索引,就将聚集索引查询条件放最前面,然后是对应的非聚集索引 2.游标的用法 游标的快慢和游标的属性有...

陈小扁 ⋅ 2016/10/08 ⋅ 1

oracle笔记整理14——性能调优之oracle执行计划

1) 优化器(optimizer) a) RBO(rule-based optimizer)方式:基于规划的优化方式 所遵循的是oracle内部预定的一些规则. b) CBO(cost-based optimizer)方式:看语句的执行代价(cost),这里的代...

thinkpadshi ⋅ 2016/01/16 ⋅ 0

mybatis-plus 2.1.1-SNAPSHOT,代号:小锅盖

mybatis-plus 是一款 mybatis 动态 SQL 自动注入 mybatis 增删改查 CURD 操作中间件。让 mybatis 拥有 hibernate 的单表高效,也保留 xml sql 的灵动。 代号: 真正身份是改变社会风气,风魔...

青苗 ⋅ 2017/09/04 ⋅ 8

Apache Spark SQL自适应执行实践

本文作者:汪愈舟 俞育才 郭晨钊 程浩(英特尔),李元健(百度) Spark SQL是Apache Spark最广泛使用的一个组件,它提供了非常友好的接口来分布式处理结构化数据,在很多应用领域都有成功的...

Spark ⋅ 01/11 ⋅ 0

mybatis-plus 2.1.7 发布,代号:清风徐来

mybatis-plus 是一款 mybatis 动态 SQL 自动注入 mybatis 增删改查 CURD 操作中间件。让 mybatis 拥有 hibernate 的单表高效,也保留 xml sql 的灵动, 减少你的开发周期优化动态维护 xml 实...

青苗 ⋅ 2017/12/11 ⋅ 22

每周一书《Oracle 12 c PL(SQL)程序设计终极指南》

本周为大家送出的书是《Oracle 12 c PL(SQL)程序设计终极指南》,此书由机械工业出版社出版, 孙风栋,王澜,郭晓惠 著。 内容简介: 《Oracle 12c PL/SQL程序设计终极指南》志在打造PL/SQL领...

zting科技 ⋅ 2017/12/11 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 56分钟前 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 1

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

CentOS开机启动subversion

建立自启动脚本: vim /etc/init.d/subversion 输入如下内容: #!/bin/bash## subversion startup script for the server## chkconfig: 2345 90 10# description: start the subve......

随风而飘 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部