当前位置:  数据库>oracle

Oracle不合理的表设结构计导致执行缓慢

    来源: 互联网  发布时间:2017-04-19

    本文导语: 收到开发这边的确认请求,如下三个语句,执行计划的COST均一样,但为什么实际执行效果相差很大(1)的查询速度很慢,2)和3)都正常)。   1)  Select *  From (Select *               From V_Question_Head Vquest0_         ...

收到开发这边的确认请求,如下三个语句,执行计划的COST均一样,但为什么实际执行效果相差很大(1)的查询速度很慢,2)和3)都正常)。

 

  • 1)  
  • Select *  
  • From (Select *  
  •              From V_Question_Head Vquest0_  
  •              Where 1 = 1   
  •              Order By Vquest0_.State Asc, Vquest0_.Ask_Time Desc) Where Rownum <= 6;  
  •  
  • 2)  
  • Select *  
  •  
  • From (Select *  
  •              From V_Question_Head Vquest0_  
  •              Where 1 = 1 And Rownum <= 6  
  •              Order By Vquest0_.State Asc, Vquest0_.Ask_Time Desc);  
  •  
  • 3)  
  • Select *  
  • From (Select *  
  •              From Question_Head Vquest0_  
  •              Where 1 = 1   
  •              Order By Vquest0_.State Asc, Vquest0_.Ask_Time Desc) Where Rownum <= 6; 
  •  

    看如下执行计划,显然2速度快可以理解,因为行数只有6,而1和3为什么有那么大的速度差距,要命的是执行计划看起来没有差距。

  • SELECT STATEMENT, GOAL = ALL_ROWS                                          Cost=1710    Cardinality=6    Bytes=27912 
  •  COUNT STOPKEY                     
  •   VIEW    Object owner=GAZA                                                Cost=1710    Cardinality=20237    Bytes=94142524 
  •    SORT ORDER BY STOPKEY                                                   Cost=1710    Cardinality=20237    Bytes=5949678 
  •     TABLE ACCESS FULL    Object owner=TEST    Object name=QUESTION_HEAD    Cost=421     Cardinality=20237    Bytes=5949678 
  •  
  •  
  • SELECT STATEMENT, GOAL = ALL_ROWS                                          Cost=1710    Cardinality=6    Bytes=27912 
  •  VIEW                    Object owner=TEST                                 Cost=1710    Cardinality=6    Bytes=27912 
  •   SORT ORDER BY                                                            Cost=1710    Cardinality=6    Bytes=1764 
  •    COUNT STOPKEY                     
  •     TABLE ACCESS FULL    Object owner=TEST    Object name=QUESTION_HEAD    Cost=421     Cardinality=20237    Bytes=5949678 
  •  
  •  
  • SELECT STATEMENT, GOAL = ALL_ROWS                                          Cost=1710    Cardinality=6    Bytes=28590 
  •  COUNT STOPKEY                     
  •   VIEW    Object owner=TEST                                                Cost=1710    Cardinality=20237    Bytes=96429305 
  •    SORT ORDER BY STOPKEY                                                   Cost=1710    Cardinality=20237    Bytes=5949678 
  •     TABLE ACCESS FULL    Object owner=TEST    Object name=QUESTION_HEAD    Cost=421     Cardinality=20237    Bytes=5949678 
  • 初步看看,无非1是查视图,3是直接查表的区别,但关键是去掉Order By Vquest0_.State Asc, vquest0_.ask_time Desc后两者的执行时间差不多,而加上排序后时间就有数十倍的差距,再来看看视图V_Question_Head

  • create or replace view v_question_head as
  • Select t.Accept_Id, t.Industry_Id, t.Dept_Id, t.Title, t.Question, t.Requester, t.Requester_Name, t.Ask_Time, t.Answer, 
  •              t.Answer_Man, t.Answer_Time, t.Is_Hot, t.Check_Man, t.Check_Time, t.Satisfaction, t.Satis_Reason, t.Telphone, 
  •              t.Is_Display, t.Hot_Sort, t.Check_State, t.State, t.Bbs_Id, t.Acceptor, t.Accept_Time, t.Is_Anonymous, 
  •              t.Anonymous_Email, t.Ip_Address, t.Is_Requester_Read, 
  •              (Select Count(r1.Accept_Id) From Answer_Remind r1 Where t.Accept_Id = r1.Accept_Id) As Reminded_Count, 
  •              (Select (Case 
  •                                     When Count(r2.Accept_Id) > 0 Then 
  •                                      1 
  •                                     Else 
  •                                      0 
  •                                 End) 
  •                  From Answer_Remind r2 
  •                  Where t.Accept_Id = r2.Accept_Id) As Is_Reminded 
  • From Question_Head t 
  • Order By t.State Asc, t.Ask_Time Desc 
  • 通过如上视图,我们不难发现虽然执行计划中没有体现COUNT的代价,但其中有行级的COUNT,也就是主表有多少行就要COUNT多少次,而这时一个很恐怖的数字。显然这是表结构设计上的问题。而要优化就是要更改表结构,在主表中及上需要COUNT的字段。


        
     
     
     
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 怎么写一个Shell来执行这样的功能,访问Oracle数据库,然后执行一个SQL脚本,生成一个文件。急!
  • mysql iis7站长之家
  • oracle 可以在crontab 中定时执行吗?
  • oracle sql执行过程(流程图)
  • linux能够通过执行脚本添加oracle数据库的用户吗
  • ORACLE安装时/tmp/orainstRoot.sh 执行发生错误
  • 求救:HPUNIX下的ORACLE7执行select * from tablename提示权限不足!!
  • 为什么 export ORACLE_SID=test写在程序里面就不会执行?
  • 请问在 Linux 下如何用代码实现连接oracle数据库 并 执行 SQL 语句?
  • shell调用oracle储存过程,怎么判断储存过程执行结果是否正确
  • shell 执行oracle sql脚本的问题
  • oracle单库彻底删除干净的执行步骤
  • 查看Oracle的执行计划一句话命令
  • 关于ORACLE中执行批处理的问题
  • oracle中得到一条SQL语句的执行时间的两种方式
  • oracle导出sql语句的结果集和保存执行的sql语句(深入分析)
  • Nagios check_oracle_health 关于执行SQL问题
  • 执行Commit时Oracle做哪些工作
  • RedHat AS 4 安装oracle9i的时候,执行Disk1下的runInstaller后提示正在初始化虚拟机,请等待后就再无反应
  • JBUILDER如何执行ORACLE的储存过程
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,