数据查询读取优化

主要随着数据的增加,用到in的,消耗时间几何增长。由于在前期测试评估不到位,没有查看具体的代码。测试版数据量跟线上的数据差距很大,一般很难看出。对于涉及多表复杂查询的功能需要特别留意。

优化前 线上74.031秒,测试版0.031秒。随着数据量增加而增加。

select *
  from (select "Extent1".*,
               row_number() OVER(ORDER BY ID desc) as "row_number"
          from (select *
                  from (select s.id,
                               s.shipment_no,
                               s.order_no,
                               s.destination,
                               s.estimated_ship_date,
                               s.orig_warehouse_id
                          from ship_shipment s
                         Where is_deleted = 0
                           and not exists
                         (select sst.id
                                  from ship_shipment sst
                                  left join ship_picklist_item spi
                                    on spi.shipment_id = sst.id
                                  left join ship_picklist sp
                                    on sp.id = spi.picklist_id
                                 inner join (select te.type,
                                                   ti.work_effort_id,
                                                   ti.bill_id_to
                                              from trsf_work_effort te
                                             inner join trsf_work_effort_item ti
                                                on ti.work_effort_id = te.id
                                               and te.type = 13
                                             where ti.is_deleted = 0) t
                                    on t.bill_id_to = spi.id
                                 where spi.is_deleted = 0
                                   and sp.pick_type = 3
                                   and sst.id = s.id)
                           and not exists
                         (select pi.shipment_id
                                  from ship_picklist_item pi
                                  left join ship_picklist spp
                                    on spp.id = pi.picklist_id
                                  left join trsf_work_effort twe
                                    on twe.id = pi.work_effort_id
                                 where spp.pick_type = 3
                                   and twe.status != 3
                                   and pi.is_deleted = 0
                                   and pi.shipment_id = s.id
                                 group by pi.shipment_id)) ss
                 Where 1 = 1
                   and id in
                       (select i.shipment_id
                          from ship_picklist_item i
                         inner join ship_picklist sp
                            on sp.id = i.picklist_id
                           and sp.pick_type = 3
                         where i.is_deleted = 0
                         group by i.shipment_id
                        having sum(nvl(i.quantity_picked, 0)) = sum(nvl(i.quantity_sorted, 0)) and sum(nvl(i.quantity_picked, 0)) > 0)
                   and ss.ORIG_WAREHOUSE_ID = 170) "Extent1") "Extent2"
 where "row_number" > 0
   and rownum <= 20

优化后:线上0.359秒  测试版:0.047秒

select *
  from (select s.id,
               s.shipment_no,
               s.order_no,
               s.destination,
               s.estimated_ship_date,
               s.orig_warehouse_id
          from ship_shipment s
         Where is_deleted = 0
           and not exists
         (select sst.id
                  from ship_shipment sst
                  left join ship_picklist_item spi
                    on spi.shipment_id = sst.id
                  left join ship_picklist sp
                    on sp.id = spi.picklist_id
                 inner join (select te.type, ti.work_effort_id, ti.bill_id_to
                              from trsf_work_effort te
                             inner join trsf_work_effort_item ti
                                on ti.work_effort_id = te.id
                               and te.type = 13
                             where ti.is_deleted = 0) t
                    on t.bill_id_to = spi.id
                 where spi.is_deleted = 0
                   and sp.pick_type = 3
                   and sst.id = s.id)
           and not exists (select pi.shipment_id
                  from ship_picklist_item pi
                  left join ship_picklist spp
                    on spp.id = pi.picklist_id
                  left join trsf_work_effort twe
                    on twe.id = pi.work_effort_id
                 where spp.pick_type = 3
                   and twe.status != 3
                   and pi.is_deleted = 0
                   and pi.shipment_id = s.id
                 group by pi.shipment_id)
                 ) ss,
(select i.shipment_id
          from ship_picklist_item i
         inner join ship_picklist sp
            on sp.id = i.picklist_id
           and sp.pick_type = 3
         where i.is_deleted = 0
         group by i.shipment_id
        having sum(nvl(i.quantity_picked, 0)) = sum(nvl(i.quantity_sorted, 0))
        and sum(nvl(i.quantity_picked, 0)) > 0) spi
        where ss.id = spi.shipment_id and ss.orig_warehouse_id = 1
时间: 2024-11-08 02:55:00

数据查询读取优化的相关文章

SQL大量数据查询的优化 及 非用like不可时的处理方案

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0 3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放

sql大数据量查询的优化技巧

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from xuehi.com where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from xuehi.com where num=0 3.应尽量避免在 where 子句中使用

mysql 查询重复的(不区分大小写)数据的SQL优化

在mysql中查询不区分大小写重复的数据,往往会用到子查询,并在子查询中使用upper函数来将条件转化为大写.如: select * from staticcatalogue WHERE UPPER(Source) IN (SELECT UPPER(Source) FROM staticcatalogue GROUP BY UPPER(Source) having count(UPPER(Source))>1) ORDER BY upper(Source) DESC; 这条语句的执行效率是非常低

针对MySQL提高百万条数据的查询速度优化

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:   select id from t where num is null   可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:   select id from t where num=0 3.应尽量避免在 where 子句中使用!=或<>操作符,

基于 request cache 请求缓存技术优化批量商品数据查询接口_一点课堂(多岸学院)

基于 request cache 请求缓存技术优化批量商品数据查询接口 Hystrix command 执行时 8 大步骤第三步,就是检查 Request cache 是否有缓存. 首先,有一个概念,叫做 Request Context 请求上下文,一般来说,在一个 web 应用中,如果我们用到了 Hystrix,我们会在一个 filter 里面,对每一个请求都施加一个请求上下文.就是说,每一次请求,就是一次请求上下文.然后在这次请求上下文中,我们会去执行 N 多代码,调用 N 多依赖服务,有的

MYSQL查询性能优化

查询的基础知识 MySQL查询过程如下图所示: MySQL是通过查询语句的哈希查找来命中缓存的,需要注意的是如果查询语句大小写不一致或者有多余的空格,是不会命中缓存的. 一个查询通常有很多执行方式,查询优化器通过计算开销(随机读取次数)来选择最优的查询. MySQL把所以的查询都当做联接来处理,联接是按照循环嵌套的策略来执行的,如下图所示: 查询的优化和限制 我们需要知道查询优化器会做哪些优化,这样在写查询的时候就可以不需要考虑手动来做这些优化,把这些事情交给查询优化器去做是更好的选择,查询优化

mysql笔记03 查询性能优化

查询性能优化 1. 为什么查询速度会慢? 1). 如果把查询看作是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间.如果要优化查询,实际上要优化其子任务,要么消除其中一些子任务,要么减少子任务的执行次数,要么让子任务运行的更快. 2). 通常来说,查询的生命周期大致可以按照顺序来看:从客户端,到服务器端,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中"执行"可以认为是整个生命周期中最重要的阶段,这其中包括 大量为了检索数据到存储引擎的调用以及调用后

Redis数据导入工具优化过程总结

Redis数据导入工具优化过程总结 背景 使用C++开发了一个Redis数据导入工具 从oracle中将所有表数据导入到redis中: 不是单纯的数据导入,每条oracle中的原有记录,需要经过业务逻辑处理, 并添加索引(redis集合): 工具完成后,性能是个瓶颈: 优化效果 使用了2个样本数据测试: 样本数据a表8763 条记录: b表940279 条记录: 优化前,a表耗时11.417s: 优化后,a表耗时1.883s: 用到的工具 gprof, pstrace,time 使用time工具

SET STATISTICS IO和SET STATISTICS TIME 在SQL Server查询性能优化中的作用

原文:SET STATISTICS IO和SET STATISTICS TIME 在SQL Server查询性能优化中的作用 近段时间以来,一直在探究SQL Server查询性能的问题,当然也漫无目的的查找了很多资料,也从网上的大神们的文章中学到了很多,在这里,向各位大神致敬.正是受大神们无私奉献精神的影响,所以小弟也作为回报,分享一下关于SET STATISTICS IO和SET STATISTICS TIME这两条T_SQL命令,在查询优化性能中的作用. 首先我想说明一下这篇文章不是关于如何