如题,下面的SQL怎么最优化?SELECT A.ROW_ID,G.CREATED FROM S_DOC_QUOTE A, 
(
SELECT MAX(B.REV_NUM) MAXREV,B.QUOTE_NUM  
FROM S_DOC_QUOTE B  
GROUP BY B.QUOTE_NUM
) C,
(
SELECT E.RECORD_ID AS RECORD_ID, MAX(E.CREATED) AS CREATED 
  FROM  S_AUDIT_ITEM E 
  WHERE  E.FIELD_NAME = 'Status'
GROUP BY  E.RECORD_ID
 ) G       
WHERE A.QUOTE_NUM = C.QUOTE_NUM AND A.REV_NUM = MAXREV AND A.ROW_ID = G.RECORD_ID

解决方案 »

  1.   

    那你觉得你现在的SQL有什么问题?
      

  2.   

    嵌套太多,取数据太慢
    S_AUDIT_ITEM中有400W条数据我拿出来的只是一个大SQL中的一部分,其实整个大SQL更慢,要不我贴出来看看?
      

  3.   

    SELECT C.ROW_ID,G.CREATED FROM  

    SELECT b.*, MAX(B.REV_NUM)(partition by B.QUOTE_NUM ) MAXREV
    FROM S_DOC_QUOTE B 
    ) C, 

    SELECT E.RECORD_ID AS RECORD_ID, MAX(E.CREATED) AS CREATED 
    FROM S_AUDIT_ITEM E 
      WHERE  E.FIELD_NAME = 'Status' 
    GROUP BY  E.RECORD_ID 
    ) G     
    WHERE C.ROW_ID = G.RECORD_ID
      

  4.   

    我能想到的也就是用RANK, KEEP之类的特殊语句了
    但是不知道是不是真的能快很多
      

  5.   

    SELECT A.ROW_ID, G.CREATED
      FROM S_DOC_QUOTE A,
           (SELECT MAX(B.REV_NUM) MAXREV, B.QUOTE_NUM FROM S_DOC_QUOTE B GROUP BY B.QUOTE_NUM) C,
           (SELECT E.RECORD_ID AS RECORD_ID, MAX(E.CREATED) AS CREATED
              FROM S_AUDIT_ITEM E
             WHERE E.FIELD_NAME = 'Status'
             GROUP BY E.RECORD_ID) G
     WHERE A.QUOTE_NUM = C.QUOTE_NUM
       AND A.REV_NUM = C.MAXREV
       AND A.ROW_ID = G.RECORD_ID
    1、针对 S_AUDIT_ITEM 建索引,并确认走了索引
    2、建临时表存储数据,在分步查询
      

  6.   

    S_AUDIT_ITEM 表的RECORD_ID 是唯一主键吗?感觉group by 用太多了,group by是对全表的
      

  7.   

    WHERE A.QUOTE_NUM = C.QUOTE_NUM AND A.REV_NUM = MAXREV AND A.ROW_ID = G.RECORD_ID里面的MAXREV 是哪个集合里面的字段?是A集合还是G集合还是C集合?
      

  8.   

    SELECT A.ROW_ID,( 
    SELECT  MAX(E.CREATED) CREATED 
    FROM S_AUDIT_ITEM E 
      WHERE  E.FIELD_NAME = 'Status'  and e.RECORD_ID=a.ROW_ID
    GROUP BY  E.RECORD_ID
    ) CREATED 
    from S_DOC_QUOTE A,

    SELECT MAX(B.REV_NUM) MAXREV,B.QUOTE_NUM 
    FROM S_DOC_QUOTE B 
    GROUP BY B.QUOTE_NUM 
    ) C
    WHERE A.QUOTE_NUM = C.QUOTE_NUM AND A.REV_NUM = MAXREV试试这个~~~
      

  9.   

    from 语句里面,A表放最后,C和G数据量哪个少哪个放第二。
    where语句里面,能过滤掉最多记录的条件放最后。关注。
      

  10.   

    算不上优化,真正的优化还需要考虑到可用资源的限制的.SELECT 
        A.ROW_ID,
        MAX(B.CREATED) AS CREATED
      FROM
    (
    SELECT ROW_ID,
    REV_NUM,
    MAX(REV_NUM) OVER(PARTITION BY QUOTE_NUM) AS MAX_REV
    FROM S_DOC_QUOTE
    ) A
      JOIN S_AUDIT_ITEM B ON A.ROW_ID=B.RECORD_ID
     WHERE A.REV_NUM=A.MAX_REV
      

  11.   


    SELECT 
        A.ROW_ID,
        MAX(B.CREATED) AS CREATED
      FROM
        (
        SELECT ROW_ID,
                        REV_NUM,
                        MAX(REV_NUM) OVER(PARTITION BY QUOTE_NUM) AS MAX_REV
        FROM S_DOC_QUOTE
        ) A
      JOIN S_AUDIT_ITEM B ON A.ROW_ID=B.RECORD_ID AND B.FIELD_NAME = 'Status' 
     WHERE A.REV_NUM=A.MAX_REV
      

  12.   

    你去网上找下基本SQL优化的技巧,试试看。想不出更好办法,也不能实践,你自己在机器上测试。
      

  13.   

              SQL语句全优化文档    http://download.csdn.net/source/1820881    
      

  14.   

    说实话,没有好答案
    我会另开一个帖子,把整个SQL贴出来
      

  15.   

    1、你建立的索引,最好是检查下索引是不是起用了
    2、查询的时候最好按需查询,比如分页的概念,或大表分离到多个小表
    3、查询SQL优化技巧,根据里面的一些技巧做进一步的优化,应该有用的,我同事尝试过,查询速度明星快,