首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL查询有点慢

SQL查询有点慢
EN

Stack Overflow用户
提问于 2011-11-30 22:39:36
回答 3查看 226关注 0票数 0

我在几周前写了这个查询,它完成了工作,只是没有那么快。我通常写前端JAVA,所以SQL不是我的thing...can,你可以在这个脚本中看到任何可以改进的地方,可以让它运行得更快……我很感谢你的帮助。

代码语言:javascript
复制
FUNCTION rollup_like_item_history_data (
   p_tamcn        IN VARCHAR2,  
   p_nsn          IN VARCHAR2, 
   p_work_year    IN VARCHAR2,  
   p_work_type_id IN NUMBER
)
  RETURN sys_refcursor
IS
  stmt       VARCHAR2(4000);
  result_cur sys_refcursor;  
BEGIN

    OPEN result_cur FOR
    SELECT DISTINCT 
           jp.id,jp.line_header.mwslin AS mwslin,  
           jp.sor_code, 
           jp.workload_year, 
           jp.line_header.fiscal_year AS fiscal_year,
           nsns.sac, 
           tamcns.tamcn, 
           nsns.nsn,
           DECODE(jp.line_header.nsn_id, 
                 NULL, jp.line_header.nomenclature, 
                 nsns.nomenclature) AS nomenclature,
           jp.line_header.sup AS sup,
           jp.line_header.work_type_id AS work_type_id
      FROM schedules sch, 
           job_plans JP, 
           master_nsn nsns, 
           master_tamcn tamcns, 
           TABLE(tamcns.pgd_group_id) (+) ntab, 
           pgd_groups pgds
     WHERE (nsns.nsn = p_nsn OR p_nsn IS NULL) 
       AND (UPPER(tamcns.tamcn) LIKE UPPER(p_tamcn) OR p_tamcn IS NULL)
       AND (jp.line_header.work_type_id = p_work_type_id OR p_work_type_id IS NULL)
    -- AND p_work_year = ntab.fiscal_year(+)
       AND ntab.pgd_group_id = pgds.id(+) 
       AND jp.line_header.nsn_id = nsns.id(+) 
       AND nsns.tamcn_id = tamcns.id(+)
       AND (    
            (p_work_year IS NULL         
             AND jp.workload_year < TO_CHAR(ADD_MONTHS(CURRENT_DATE, -24), 'YYYY')                   
             AND jp.line_header.fiscal_year < TO_CHAR(ADD_MONTHS(CURRENT_DATE, -24), 'YYYY')     
           )     
           OR    
              (        
               p_work_year is not NULL        
            -- AND p_work_year = ntab.fiscal_year(+)                      
               AND jp.workload_year =  p_work_year                      
               AND jp.line_header.fiscal_year = p_work_year       
              )
           )
       AND JP.REVISION = (select MAX(jp2.revision) 
                            from job_plans jp2
                           WHERE JP.CONTROL_NUMBER = JP2.CONTROL_NUMBER)
       AND  job_plan_pkg.get_last_job_plan_state_type(jp.id) != 1; 
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-09 00:46:25

当我更快地从clause...went中删除"schedules sch“时,我忘记了我删除了它的引用。

你们SQL的家伙居然没有注意到……:)

票数 0
EN

Stack Overflow用户

发布于 2011-11-30 23:58:29

  • 查看是否可以去掉WHERE子句中索引列上的任何大写(),
  • 考虑用DENSE_RANK() =1 DENSE_RANK()替换结尾的SELECT MAX()
票数 1
EN

Stack Overflow用户

发布于 2011-12-02 21:33:25

这部分

代码语言:javascript
复制
AND JP.REVISION = (select MAX(jp2.revision) 
                            from job_plans jp2
                           WHERE JP.CONTROL_NUMBER = JP2.CONTROL_NUMBER)

将对每条记录求值,请使用inner而不是这样:

代码语言:javascript
复制
join (select control_number, max(revision) 
      from job_plans
      group by control_number) jp2
on jp.control_number = jp2.control_number 

你也可以在SQL Developer中使用你的查询和创建执行计划,查看索引的用法,也许你的查询在选择性较低的查询中使用了全表扫描。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8327613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档