gpt4 book ai didi

.net - Oracle - 参数化查询有 EXECUTIONS = PARSE_CALLS

转载 作者:行者123 更新时间:2023-12-02 06:00:08 25 4
gpt4 key购买 nike

我们有一个与 Oracle 10g 通信的 .NET 应用程序。我们的 DBA 最近提取了一个查询列表,其中执行次数等于 parse_calls。我们假设这将帮助我们找到代码中所有未参数化的查询。

出乎意料的是,以下查询出现在该列表的顶部附近,执行次数为 1,436,169 次,解析次数为 1,436,151 次:

SELECT bar.foocolumn
FROM bartable bar,
baztable baz
WHERE bar.some_id = :someId
AND baz.another_id = :anotherId
AND baz.some_date BETWEEN bar.start_date AND (nvl(bar.end_date, baz.some_date + (1/84600)) - (1/84600))

为什么此查询的执行次数等于 parse_calls?

最佳答案

解析查询的次数完全取决于调用应用程序。每次应用程序要求数据库解析查询时,都会解析一次查询。

服务器端,有different kinds of parse :

  • HARD parse -- the query has never been seen before, isn't in the shared pool. We must parse it, hash it, look in the shared pool for it, don't find it, security check it, optimize it, etc (lots of work).

  • SOFT parse -- the query has been seen before, is in the shared pool. We have to parse it, hash it, look in the shared pool for it and find it (less work then a hard parse but work none the less)

在您的情况下,您很可能在每个 session 中创建一次语句,然后将其丢弃,因此 Oracle 每次都必须解析它。然而,由于参数化,这种解析是一种软解析,Oracle 只进行一次优化它的昂贵步骤。

不过,您可以在应用程序中缓存该语句并重用它,以便每个 session 仅(软)解析一次。

关于.net - Oracle - 参数化查询有 EXECUTIONS = PARSE_CALLS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2811164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com