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

简介:

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

 

 
  1. 1)  
  2. Select *  
  3. From (Select *  
  4.              From V_Question_Head Vquest0_  
  5.              Where 1 = 1   
  6.              Order By Vquest0_.State Asc, Vquest0_.Ask_Time DescWhere Rownum <= 6;  
  7.  
  8. 2)  
  9. Select *  
  10.  
  11. From (Select *  
  12.              From V_Question_Head Vquest0_  
  13.              Where 1 = 1 And Rownum <= 6  
  14.              Order By Vquest0_.State Asc, Vquest0_.Ask_Time Desc);  
  15.  
  16. 3)  
  17. Select *  
  18. From (Select *  
  19.              From Question_Head Vquest0_  
  20.              Where 1 = 1   
  21.              Order By Vquest0_.State Asc, Vquest0_.Ask_Time DescWhere Rownum <= 6; 

 

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

 
  1. SELECT STATEMENT, GOAL = ALL_ROWS                                          Cost=1710    Cardinality=6    Bytes=27912 
  2.  COUNT STOPKEY                     
  3.   VIEW    Object owner=GAZA                                                Cost=1710    Cardinality=20237    Bytes=94142524 
  4.    SORT ORDER BY STOPKEY                                                   Cost=1710    Cardinality=20237    Bytes=5949678 
  5.     TABLE ACCESS FULL    Object owner=TEST    Object name=QUESTION_HEAD    Cost=421     Cardinality=20237    Bytes=5949678 
  6.  
  7.  
  8. SELECT STATEMENT, GOAL = ALL_ROWS                                          Cost=1710    Cardinality=6    Bytes=27912 
  9.  VIEW                    Object owner=TEST                                 Cost=1710    Cardinality=6    Bytes=27912 
  10.   SORT ORDER BY                                                            Cost=1710    Cardinality=6    Bytes=1764 
  11.    COUNT STOPKEY                     
  12.     TABLE ACCESS FULL    Object owner=TEST    Object name=QUESTION_HEAD    Cost=421     Cardinality=20237    Bytes=5949678 
  13.  
  14.  
  15. SELECT STATEMENT, GOAL = ALL_ROWS                                          Cost=1710    Cardinality=6    Bytes=28590 
  16.  COUNT STOPKEY                     
  17.   VIEW    Object owner=TEST                                                Cost=1710    Cardinality=20237    Bytes=96429305 
  18.    SORT ORDER BY STOPKEY                                                   Cost=1710    Cardinality=20237    Bytes=5949678 
  19.     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

 
  1. create or replace view v_question_head as
  2. Select t.Accept_Id, t.Industry_Id, t.Dept_Id, t.Title, t.Question, t.Requester, t.Requester_Name, t.Ask_Time, t.Answer, 
  3.              t.Answer_Man, t.Answer_Time, t.Is_Hot, t.Check_Man, t.Check_Time, t.Satisfaction, t.Satis_Reason, t.Telphone, 
  4.              t.Is_Display, t.Hot_Sort, t.Check_State, t.State, t.Bbs_Id, t.Acceptor, t.Accept_Time, t.Is_Anonymous, 
  5.              t.Anonymous_Email, t.Ip_Address, t.Is_Requester_Read, 
  6.              (Select Count(r1.Accept_Id) From Answer_Remind r1 Where t.Accept_Id = r1.Accept_Id) As Reminded_Count, 
  7.              (Select (Case 
  8.                                     When Count(r2.Accept_Id) > 0 Then 
  9.                                      1 
  10.                                     Else 
  11.                                      0 
  12.                                 End
  13.                  From Answer_Remind r2 
  14.                  Where t.Accept_Id = r2.Accept_Id) As Is_Reminded 
  15. From Question_Head t 
  16. Order By t.State Asc, t.Ask_Time Desc 

通过如上视图,我们不难发现虽然执行计划中没有体现COUNT的代价,但其中有行级的COUNT,也就是主表有多少行就要COUNT多少次,而这时一个很恐怖的数字。显然这是表结构设计上的问题。而要优化就是要更改表结构,在主表中及上需要COUNT的字段。

 

 


本文转自zylhsy 51CTO博客,原文链接:http://blog.51cto.com/yunlongzheng/617491,如需转载请自行联系原作者

 

相关文章
|
5月前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之可以通过配置Oracle数据库的schema注册表来监测表结构的变化吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
44 1
|
SQL Oracle 关系型数据库
Python 技术篇-操作oracle数据库执行SQL语句报错,提示ORA-00911: 无效字符解决方法
Python 技术篇-操作oracle数据库执行SQL语句报错,提示ORA-00911: 无效字符解决方法
544 0
Python 技术篇-操作oracle数据库执行SQL语句报错,提示ORA-00911: 无效字符解决方法
|
Oracle 关系型数据库 MySQL
mybatis执行批量更新batch update 的方法(oracle,mysql)
mybatis执行批量更新batch update 的方法(oracle,mysql)
1195 0
|
Oracle 关系型数据库
oracle 执行被锁表
oracle 执行被锁表
116 0
|
文字识别 Oracle 关系型数据库
Oracle rac重新执行root.sh脚本
Oracle rac重新执行root.sh脚本
856 0
|
自然语言处理 Oracle 架构师
Oracle 正式启动 “Leyden” 项目!在 Java 平台引入“静态映像”以解决运行缓慢等问题
Oracle 正式启动 “Leyden” 项目!在 Java 平台引入“静态映像”以解决运行缓慢等问题
246 0
Oracle 正式启动 “Leyden” 项目!在 Java 平台引入“静态映像”以解决运行缓慢等问题
|
SQL Oracle 关系型数据库
oracle学习48-oracle命令窗口执行sql语句
oracle学习48-oracle命令窗口执行sql语句
173 0
oracle学习48-oracle命令窗口执行sql语句
|
SQL 监控 Oracle
Oracle数据库---怎样获得sql语句执行时的绑定变量
绑定变量是oracle常用的优化技术,有时候我们需要获得sql运行时绑定变量的值,用10046事件跟踪会话即可获得
528 0

推荐镜像

更多
下一篇
无影云桌面