Oracle sql优化(二)

说明:1谓语,指查询条件

一Oracle架构基础

Oracle数据库指1硬盘上的数据库文件(数据库)2管理这些文件的内存结构(实例)

 1总览

2共享池

共享池通过最近最少使用算法保留使用最频繁以及最近使用的语句。

例1:查询v$sql

例2:sql语句使用绑定变量的效果

锁存器

3缓冲区缓存

注:接触计数器每个块都维护一个,表明该块被使用的频繁程度

当执行一个查询仅需要进行软解析并且从缓冲区缓存中读取数据块时,效率最高。

二查询转换

1查询流程

 

查询转换的目的是以某种方式转化你的sql语句以帮助优化器选出最高效的执行计划。

查询转换器可能会改变查询的结构,只要不会影响结果集。2

2、查询转换为查询块

3、怎么看查询计划是否发生了转换?

通过使用NO_QUERY_TRANSFORMATION提示,比较两次的执行计划,如果执行计划不一样就可能因为查询转换。当使用此提示时,除了谓语前推意外的查询转换都将被禁止。

4视图合并:

视图合并常常发生在当外部查询块的谓语包括下列项的时候。

大多数人相信视图总是被作为独立的查询块对待并总是有自己的子查询计划,并且会在与其他查询块联结之前执行。但由于查询转换的存在,有时视图会与查询的其他部分合并,这样对性能有很大的好处。

执行计划(注意每个步骤中计划操作的选择以及A-Rows的计数(计划中这一步所获取的实际行数)。)

一种误解:使用圆括号将某个查询块与其他部分分开并不能保证该查询块将会单独或首先执行。通过NO_MERGE提示会让查询转换器不合并视图。此外,如果一个查询块包含解析函数或聚合函数、集合运算(UNION、INTERSECT、MINUS),order by子句或使用了ROWNUM,视图合并将会被禁止或限制。如果没有发生视图合并,有可能是因为视图合并将会导致查询结果不同。可通过使用MERGE提示来强制执行视图合并,使用MERGE就表明你确认视图合并不会影响结果。

4子查询解嵌套?????(重看)

子查询解嵌套与视图合并的相似之处是子查询也是通过一个单独的查询块来表示的。可合并的视图和可解嵌套的子查询主要区别在于它们的为准不同 :子查询位于where子句。最典型的转换为子查询转变为表联结。如果子查询没有解嵌套,将为它生成一个独立的子计划。

5谓语前推?????(重看)

6使用物化视图进行查询重写??????(重看)

三执行计划

goal:什么是统计信息,它们为什么是重要的?如何检查它们?

1执行计划:返回查询结果oracle将会采用的一系列步骤。

2优化器:收集统计信息(针对对象(如表和索引),也可以收集系统统计信息(如数据库读取的平均速度)),然后计算不同执行计划的成本值。统计信息越准确,oracle也就越可能计算出最佳执行计划。

3统计信息,理解统计信息有助于你识别那些不是源于sql语句而是源于统计信息的性能问题(可能你做的所有事情都是正确的,但如果统计信息是错误的或者不够准确,你需要迅速查明——而不是花上好几个小时甚至几天时间在代码上试着解决一个实际不是代码问题的问题)。

有时是写的sql语句导致优化器不能恰当使用统计信息:

首先,优化器计算返回结果的行数,依赖于num_distinct列的统计信息,默认,总是假设所有值出现的比例与其他任何值都是一样的。例如:select * from widgets where color='BLUE'

查询返回的结果行数=(1/num_distinct)*num_rows。这个例子中就是统计信息中widgets表的行数(num_rows=1000)以及

例如:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值