oracle中SQL的CACHE

时间:2009-11-29 16:42:17

标签: oracle

oracle CACHE如何查询(SQL),查询执行包含以下步骤。 1. PARSE 2.执行 3.获取

在第一步中oracle检查CACHE(共享池)中是否存在查询(如果查询相同且基于LRU将存在),如果存在,则将跳过PARSING并开始执行。 因此,为了提高查询性能,我们必须使用绑定变量并使用相同的sql查询。

但是在Parsing oracle中验证身份验证(User Access),如果多个用户使用相同的查询,oracle如何跳过/使用解析?

3 个答案:

答案 0 :(得分:2)

查询的解析与用户无关,它取决于查询。请注意,需要用于字符匹配的确切字符。查询中的空白和注释将导致它错过共享池匹配。

然后,解析树用于生成执行计划。如果在新查询中使用相同的模式作为匹配的查询,则使用现有的执行计划。

您可以通过创建多个架构进行测试,一个架构包含少量数据,另一个架构包含大型架构 量。然后分析所有表格。查看具有大量不同数据的同一查询的执行计划。这将显示同一查询的不同执行计划。

现在大量运行查询并检查第一次查询所需的时间 然后是后续的执行。使用Oracle Trace并查看左手痛苦的​​“Re-Parse” 频率。这也可以从一些字典表中收集。

查看The Oracle documentation on using Oracle Trace

答案 1 :(得分:1)

  

第一步oracle检查CACHE(共享池)中是否存在查询(如果查询相同且基于LRU将存在),如果存在,则将跳过PARSING并开始执行。因此,为了提高查询性能,我们必须使用绑定变量并使用相同的sql查询。

这是在Oracle上执行查询时的实际过程:

  1. 解析步骤
    1. 语法检查
    2. 语义分析
    3. 查询是否已在其他会话中执行?
  2. 硬解析
    1. 解析
    2. 优化
    3. 生成查询计划。
  3. 如果对#1.3的回答是肯定的 - Oracle会跳过硬解析部分,并使用现有的查询计划。

    了解更多信息:
    * AskTom: Difference between soft parse and hard parse
    * Bind variables - The key to application performance

答案 2 :(得分:0)

Oracle中的常规做法是使用 definer权限创建存储过程,这意味着查询是以其定义者的权限执行的,尽管谁调用它们。这就是缓存运行良好的原因。

如果使用调用者权限authid current_user)创建过程或包,则将分别为每个调用者解析查询。

有关详细信息,请参阅Invoker Rights Versus Definer Rights