oracle第二次快,Oracle SQL查询提高了第二次和第三次执行的性能(Oracle SQL query improves performance on second and third exe...

Oracle SQL查询提高了第二次和第三次执行的性能(Oracle SQL query improves performance on second and third execution)

我们正在分析Oracle 12c数据库上的sql语句。 我们注意到以下语句通过多次运行得到了改进。 如何解释它通过第二次和第三次执行而得到改善?

SELECT COUNT (*)

FROM asset

WHERE ( ( (status NOT IN ( 'x1', 'x2', 'x3'))

AND ( (siteid = 'xxx')))

AND (EXISTS

(SELECT siteid

FROM siteauth a, groupuser b

WHERE a.groupname = b.groupname

AND b.userid = 'xxx'

AND a.siteid = asset.siteid)))

AND ( (assetnum LIKE '5%'));

首次运行:24秒。

第二轮:17秒。

第三轮:7秒

第四轮:7秒

通过使用结果现金进行调整:0,003秒

We are analyzing sql statements on an Oracle 12c database. We noticed that the following statement improved by running several times. How can it be explained that it improves by executing it a second and third time?

SELECT COUNT (*)

FROM asset

WHERE ( ( (status NOT IN ( 'x1', 'x2', 'x3'))

AND ( (siteid = 'xxx')))

AND (EXISTS

(SELECT siteid

FROM siteauth a, groupuser b

WHERE a.groupname = b.groupname

AND b.userid = 'xxx'

AND a.siteid = asset.siteid)))

AND ( (assetnum LIKE '5%'));

First run: 24 Sec.

Second run: 17 Sec.

Third run: 7 Sec.

Fourth run:7 Sec.

Tuned by using result cash: 0,003 Sec.

原文:https://stackoverflow.com/questions/39978371

更新时间:2020-03-03 01:50

最满意答案

默认情况下,Oracle不会缓存查询结果,但会缓存查询使用的数据块。 此外,12c还具有“自适应执行计划”和“基数反馈”等功能,即使不重新计算表统计信息,也可能会在执行之间强制执行计划更改。

Oracle does not cache results of queries by default, but caches data blocks used by the query. Also 12c has features like "Adaptive execution plans" and "Cardinality feedback" which might enforce execution plan changes between executions even if table statistics were not re-calculated.

2016-11-10

相关问答

做一些追踪和研究执行计划,你就会知道。 阅读: http : //forums.oracle.com/forums/thread.jspa?threadID=501834 Do some tracing and study the execution plans and you will know. Read: http://forums.oracle.com/forums/thread.jspa?threadID=501834

首先,我不确定我理解代码在做什么。 在您发布的代码中(您可能已经减少了以简化操作), IF语句检查v_date_started IS NOT NULL是否v_date_started IS NOT NULL ,这是多余的,因为DATE_STARTED上有WHERE子句。 它检查(sysdate - v_date_started)*1440 > p_time_range是否只是DATE_STARTED列上WHERE子句的冗余重复。 并且它检查v_date_completed IS NULL是否v_d

...

首先检查您的统计信息是否已更新:优化程序在很大程度上取决于统计数据! 其次,您应该说明使用此查询获得的行数:根据每个条件选择的行数,完全扫描可能比索引搜索更好。 So, after closer reviewing of the code, of the data displayed based on columns listed in the SELECT part of the query, I observed that the last joined table does not brin

...

NOT IN通常很贵。 有时LEFT JOIN和过滤条件可以工作,但这取决于您的情况,因此性能明智我会敦促谨慎,并检查您的解释计划,特别是有许多行和表。 SELECT A.account_number

FROM ClientTable A

LEFT OUTER JOIN PatientTable B ON A.account_number = B.account_Number

LEFT OUTER JOIN BillingTable C ON A.account_number = C.acc

...

第二次加入可以提高性能。 Join可以用于过滤,这可以减少行数。 如果对连接键进行索引,则尤其如此,因此可以非常快速地进行过滤。 缩减的结果集还可以加速聚合和排序。 如果结果集完全相同,则第二个连接可以通过启用更好的执行计划来提高性能。 但是,可能还有其他方法可以实现相同的目标。 A second join can improve performance. Join's can be used for filtering, which reduces the number of rows. Thi

...

Oracle也有一个缓存执行工具。 查询被哈希并匹配到计划,如果它击中散列表。 您还可以使用此机制强制执行特定查询的计划。 与SQL Server一样,您需要使用参数化查询来执行此操作,而不是将值替换为字符串 - 因为后者会生成不同的哈希值。 Oracle also has a cached execution facility. The Query is hashed and matched to a plan if it hits on the hash table. You can also

...

当一个查询被缓存时,NHibernate会缓存查询产生的实体的ID。 非常重要的是,它不会缓存实体本身 - 只有它们的ID。 这意味着您几乎可以确定要确保这些实体在您的二级缓存中也被设置为可缓存。 否则,NHiberate将从查询缓存中获取实体的ID,但是随后会被迫去到数据库以获取实际的实体。 这可能比首先进入数据库更昂贵! 同样重要的是:查询基于其确切的SQL和参数值进行缓存。 这两者之间的任何差异都意味着数据库将被击中。 所以你可能只想缓存那些在输入方面有小差异的查询。 When a quer

...

默认情况下,Oracle不会缓存查询结果,但会缓存查询使用的数据块。 此外,12c还具有“自适应执行计划”和“基数反馈”等功能,即使不重新计算表统计信息,也可能会在执行之间强制执行计划更改。 Oracle does not cache results of queries by default, but caches data blocks used by the query. Also 12c has features like "Adaptive execution plans" and "C

...

“我知道这只是默认获取前五十行,但我能否至少确定1.8秒包含总执行时间加上将前50行传送到我的客户端的时间?” 不,是时候返回前50行了。 它不一定要求数据库确定整个结果集。 把这张桌子想成一本百科全书。 如果你想要一个名字以'A'或'Z'开头的动物列表,你可能会很快得到Aardvarks和Alligators。 因为你必须阅读整本书所以需要更长的时间才能获得斑马。 如果你的查询正在进行全表扫描,那么在读完整个表(或书)之后它就不会完成,即使在第一章之后没有任何东西可以被拾取(因为它不知道那里)在

...

当你使用预准备语句(即预编译语句)时,一旦DB获得此语句,它就会编译它并对其进行缓存,以便它可以使用最后编译的语句来连续调用同一语句。 因此,它会针对连续调用进行预编译。 您通常使用带有绑定变量的预准备语句,您可以在运行时提供变量。 现在,对于连续执行预准备语句会发生什么,您可以提供与先前调用不同的变量。 从DB的角度来看,它不必每次都编译语句,只会在朗姆酒时插入绑定变量。 所以变得更快。 预处理语句的其他优点是可以防止SQL注入攻击 所以这些值不必相同 When you use prepared

...

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值