zoukankan      html  css  js  c++  java
  • 使用WITH提高查询效率

         前两天的业务需求里需要关联好几张表出一个详单报表,这个需求其实很简单,但是数据量大,源表又不是分区表,就变得很头疼了。

         最初我的代码大概是这样子的:

    select 
    a.id,
    a.name,
    a.code,
    b.type,
    (
    select p_name
    from C c
    where c.pid = b.pid
    )
    from A a, B b
    where a.id = b.id and a.id > 1000;

         这样的话如果三个表数据量小就没事儿了,一会儿就跑出来了。但是我们的A表上亿,A一个id对应B里的好多个id,那么B的数据量就更大了。C也差不多,这样一来就要老命了。这个时候我想到了用with这个办法来减小数据量。

         WITH这个东西主要是产生一个临时的表,可以通过各种条件见小数据量,挑选需要的列,如此这般,数据量就会小很多。WITH没有办法提高效率,但是就是降低数据量,靠硬件的优势。修改以后的代码如下:

    with AA as (select id, name, code, type from A where id > 1000),
    BB as (select type, pid from B),
    CC as (select p_name, pid from C)
    select AA.id, AA.name, AA.code, BB.type, C.p_name from AA, BB, CC
    where AA.id = BB.id
    and CC.pid = BB.pid;

         经过业务上跑了一遍,原本13个小时没有跑出来的过程,居然很快的跑出来了,我很欣慰。就在这里记录一下这个知识点,和大家分享。


  • 相关阅读:
    POJ 2154
    POJ 1286
    Polycarp's problems
    Greedy Change
    Goods transportation
    Ugly Problem
    Happy Matt Friends
    Dense Subsequence
    Ray Tracing
    Batch Sort
  • 原文地址:https://www.cnblogs.com/wingsless/p/2323060.html
Copyright © 2011-2022 走看看