`

有关Sql order by 优化查询的建议

 
阅读更多
在使用左,右,或者内连接的时候,在需要使用排序的时候,不妨先以一个表为标准,先进行排序,这样可以提供语句的性能
比如:
   优化前:
      SELECT *
  FROM (SELECT a.*, ROW_NUMBER() OVER(ORDER BY createDate desc) row_num
          FROM (SELECT a.ID as id,
                       a.CODE as code,
                       a.LAST_STORE_JOB_ID as lastStoreJobId,
                       a.JOB_DATE as jobDate,
                       a.JOB_STORE_ID as jobStoreId,
                       c.NAME as jobStoreName,
                       a.TRANSFER_STORE_ID as transferStoreId,
                       d.NAME as transferStoreName,
                       a.STORE_COMPANY_ID as storeCompanyId,
                       e.COMPANY_FULLNAME as companyName,
                       a.EXTRACT_COMPANY_ID as extractCompanyId,
                       f.COMPANY_FULLNAME as extractCompanyName,
                       a.SOURCE_TYPE as sourceType,
                       a.EXTERNAL_CODE as externalCode,
                       a.REMARK as remark,
                       a.ALLOT_TYPE as allotType,
                       a.ALLOT_STATUS as allotStatus,
                       a.STATUS as status,
                       a.PDA_STATUS as pdaStatus,
                       a.JOB_TYPE_ID as jobTypeId,
                       a.ACTION_TYPE_ID as actionTypeId,
                       a.SOLVE_STATUS as solveStatus,
                       a.UPDATE_DATE as updateDate,
                       a.CREATE_DATE as createDate,
                       a.VEHICLE_CODE as vehicleCode,
                       a.USER_ID as userId,
                       g.USER_NAME as userName,
                       a.FLOW_STATUS as flowStatus,
                       a.TARGET_ALLOCATION_ID as targetAllocationId,
                       h.NAME as allocationName,
                       (select count(*)
                          FROM STORE_JOB_FLOW_NODES i
                          left join STORE_JOB_FLOW_MODES j
                            on j.id = i.JOB_FLOW_MODE_ID
                           and i.ACTION_TYPE_ID = 'HWMAN02'
                          left join STORE_JOB_FLOWS k
                            on k.job_flow_mode_id = j.id
                         where k.STORE_JOB_ID = a.ID) as nextIsPlan
                  FROM  STORE_JOBS  a                  LEFT JOIN STORE_JOBS b
                    on a.last_store_job_id = b.id
                  LEFT JOIN STORES c
                    on a.job_store_id = c.id
                  LEFT JOIN STORES d
                    on a.transfer_store_id = d.id
                  LEFT JOIN COMPANYS e
                    on a.store_company_id = e.id
                  LEFT JOIN COMPANYS f
                    on a.extract_company_id = f.id
                  LEFT JOIN USERS g
                    on a.user_id = g.id
                  LEFT JOIN ALLOCATIONS h
                    on a.target_allocation_id = h.id
                 where 1 = 1
                   AND a.ACTION_TYPE_ID = 'HWMAN01'
                   AND a.JOB_DATE between
                       to_date('2014-07-02 00:00:00', 'yyyy-mm-dd hh24:mi:ss') and
                       to_date('2014-08-02 23:59:59', 'yyyy-mm-dd hh24:mi:ss')
                   AND a.JOB_TYPE_ID = 'HWMSN02'
                  order by a.CREATE_DATE desc ) a
                   )
WHERE row_num BETWEEN 1 AND 30
ORDER BY createDate desc

优化后:
     SELECT *
  FROM (SELECT a.*, ROW_NUMBER() OVER(ORDER BY createDate desc) row_num
          FROM (SELECT a.ID as id,
                       a.CODE as code,
                       a.LAST_STORE_JOB_ID as lastStoreJobId,
                       a.JOB_DATE as jobDate,
                       a.JOB_STORE_ID as jobStoreId,
                       c.NAME as jobStoreName,
                       a.TRANSFER_STORE_ID as transferStoreId,
                       d.NAME as transferStoreName,
                       a.STORE_COMPANY_ID as storeCompanyId,
                       e.COMPANY_FULLNAME as companyName,
                       a.EXTRACT_COMPANY_ID as extractCompanyId,
                       f.COMPANY_FULLNAME as extractCompanyName,
                       a.SOURCE_TYPE as sourceType,
                       a.EXTERNAL_CODE as externalCode,
                       a.REMARK as remark,
                       a.ALLOT_TYPE as allotType,
                       a.ALLOT_STATUS as allotStatus,
                       a.STATUS as status,
                       a.PDA_STATUS as pdaStatus,
                       a.JOB_TYPE_ID as jobTypeId,
                       a.ACTION_TYPE_ID as actionTypeId,
                       a.SOLVE_STATUS as solveStatus,
                       a.UPDATE_DATE as updateDate,
                       a.CREATE_DATE as createDate,
                       a.VEHICLE_CODE as vehicleCode,
                       a.USER_ID as userId,
                       g.USER_NAME as userName,
                       a.FLOW_STATUS as flowStatus,
                       a.TARGET_ALLOCATION_ID as targetAllocationId,
                       h.NAME as allocationName,
                       (select count(*)
                          FROM STORE_JOB_FLOW_NODES i
                          left join STORE_JOB_FLOW_MODES j
                            on j.id = i.JOB_FLOW_MODE_ID
                           and i.ACTION_TYPE_ID = 'HWMAN02'
                          left join STORE_JOB_FLOWS k
                            on k.job_flow_mode_id = j.id
                         where k.STORE_JOB_ID = a.ID) as nextIsPlan
                  FROM (SELECT * FROM STORE_JOBS order by CREATE_DATE desc) a                  LEFT JOIN STORE_JOBS b
                    on a.last_store_job_id = b.id
                  LEFT JOIN STORES c
                    on a.job_store_id = c.id
                  LEFT JOIN STORES d
                    on a.transfer_store_id = d.id
                  LEFT JOIN COMPANYS e
                    on a.store_company_id = e.id
                  LEFT JOIN COMPANYS f
                    on a.extract_company_id = f.id
                  LEFT JOIN USERS g
                    on a.user_id = g.id
                  LEFT JOIN ALLOCATIONS h
                    on a.target_allocation_id = h.id
                 where 1 = 1
                   AND a.ACTION_TYPE_ID = 'HWMAN01'
                   AND a.JOB_DATE between
                       to_date('2014-07-02 00:00:00', 'yyyy-mm-dd hh24:mi:ss') and
                       to_date('2014-08-02 23:59:59', 'yyyy-mm-dd hh24:mi:ss')
                   AND a.JOB_TYPE_ID = 'HWMSN02') a)
WHERE row_num BETWEEN 1 AND 30
ORDER BY createDate desc

分享到:
评论

相关推荐

    SQL百万级数据库优化大全

    SQL百万级数据库优化大全,是对sql各方面优化的总结和案例引导,避免全表扫描等方面的性能优化。

    Microsoft_SQL_Server_2005技术内幕:T-SQL查询.pdf

    本书及其续篇——《Microsoft SQL Server 2005技术内幕:T-SQL程序设计》介绍了SQL Server 2005中高级T-SQL查询、查询优化及编程相关的知识。这两本书侧重于解决实践中的常见问题,并讨论了解决这些问题的方法。它们...

    sql学习 索引特性之有序优化order by.sql

    sql学习 索引特性之有序优化order by.sql

    SQL 优化原则

    任何在Order by语句的非索引项或者有计算表达式都将降低查询速度。  仔细检查order by语句以找出非索引项或者表达式,它们会降低性能。解决这个问题的办法就是重写order by语句以使用索引,也可以为所使用的列建立...

    优化sql的测试数据

    优化sql的数据。 select * from (select PI.ID AS ProductID,PI.SynapsID,PI.NameCode,PI.Name_cn,PI.Name_en,PP.PicName,PI.BarCode, PI.NewLevel,PI.`Status`,PI.HighPrice,CPM.SalesPlaceID, psi.WIID,psi....

    MySQL数据库查询优化

    预计时间2小时,每小时一个课程段(子查询是SQL查询优化的重点内容,务必掌握好) 第5课 查询优化技术理论与MySQL实践(三)------视图重写与等价谓词重写 什么是视图重写?哪些类型的视图可以被优化?MySQL是怎么...

    SQL优化通用类/特殊字符过滤/优化查询排序/异常记录

    SQL/SqlParameter特殊字符过滤/优化查询排序/异常记录row_number()over(order by {1})as row 排序 not in 排序 SQL查询、更新、插入、分页排序,存储过程调用

    对大量数据SQL查询的优化心得.docx

    对大量数据SQL查询的优化心得:1、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引;2、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而...

    SQL查询安全性及性能优化

     order by 后跟的字段尽量是索引字段,如果这个字段不是索引字段可以考虑时候可以给这个排序字段加上索引 使用存储过程优化 复杂的业务逻辑可以使用存储过程来实现 优点: 减少网络流量--将多种操作放在一个过程...

    mysql中提高Order by语句查询效率的两个思路分析

    在这篇文章中,笔者就谈谈提高Order By语句查询效率的两个思路,以供大家参考。 在MySQL数据库中,Order by语句的使用频率是比较高的。但是众所周知,在使用这个语句时,往往会降低数据查询的性能。因为可能需要对...

    MySQL SQL优化 .docx

    order by, group by,distinct … 都是消耗 CPU 的大户(这些操作基本上都是 CPU 处理内存中的数据比较运算)。当我们的 IO 优化做到一定阶段之后,降低 CPU 计算也就成为了我们 SQL 优化的重要目标

    SQL SERVER的优化建议与方法

    所以我们会写如下的SQL语句: select top 100 * from 表 order by Score desc 如果表非常大的话,那么这样的操作是非常消耗资源的,因为SQL SERVER要对整个表进行排序,然后取前N条记录.这样的造作是在Temdb

    MySQL中(JOIN/ORDER BY)语句的查询过程及优化方法

    在优化这个语句之前,我们先了解下SQL查询的基本执行过程: 1.应用通过MySQL API把查询命令发送给MySQL服务器,然后被解析 2.检查权限、MySQL optimizer进行优化,经过解析和优化后的查询命令被编译为CPU可运行的二...

    Microsoft SQL Server 2008技术内幕:T-SQL查询(第二卷)

    《Microsoft SQL Server 2008技术内幕:T-SQL查询》全面深入地介绍了Microsoft SQL Server 2008中高级T-SQL查询、性能优化等方面的内容,以及SQL Server 2008新增加的一些特性。主要内容包括SQL的基础理论、查询优化...

    MySQL order by性能优化方法实例

     当查询语句的 order BY 条件和查询的执行计划中所利用的 Index 的索引键(或前面几个索引键)完全一致,且索引访问方式为 rang,ref 或者 index 的时候,MySQL 可以利用索引顺序而直接取得已经排好序的数据。...

    30个mysql千万级大数据SQL查询优化技巧详解

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id ...

    MySQL 通过索引优化含ORDER BY的语句

    4、当你的程序和数据库结构/SQL语句已经优化到无法优化的程度,而程序瓶颈并不能顺利解决,那就是应该考虑使用诸如memcached这样的分布式缓存系统的时候了。 5、习惯和强迫自己用EXPLAIN来分析你SQL语句的性能。 一...

    【mysql知识点整理】— order by 、group by 出现Using filesort原因详解

    文章目录测试数据1 sql执行顺序2 order by 和 group by什么时候会出现Using filesort — 理论3 order by 和 group by什么时候会出现Using filesort — 实践3.1 不会出现 Using filesort的情况 — 符合最佳左前缀法则...

    提高SQL处理查询上百万条数据库的速度

    1. 对查询进行优化,尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 在优化查询时,避免全表扫描是非常重要的。全表扫描会使查询速度变得很慢,因为它需要遍历整个表。通过建立索引,可以...

    MySQL利用索引优化ORDER BY排序语句的方法

    创建表&创建索引 create table tbl1 ( id int unique, sname varchar(50), index tbl1_index_sname(sname desc...通过索引优化来实现MySQL的ORDER BY语句优化: 1、ORDER BY的索引优化 如果一个SQL语句形如: SELECT

Global site tag (gtag.js) - Google Analytics