2009-11-29 36 views
1

oracle如何在一个查询(SQL)中执行一个查询,查询执行包含以下步骤。如果存在,那么 1. PARSE 2.执行 3.取oracle中SQL的CACHE

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

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

回答

2

查询的解析不绑定到用户,它依赖于查询。请注意,字符匹配的确切字符是必需的。查询中的空白和注释将导致它错过共享池匹配。

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

您可以通过创建多个模式来测试该模式,其中一个具有少量数据,另一个具有较大的数量。然后分析所有表格。查看具有大量不同数据量的相同查询的执行计划。这将显示相​​同查询的不同执行计划。

现在运行该查询大量的时间,并检查第一个 和后续执行所花费的时间量。使用Oracle跟踪并查看左侧的“重新解析” 频率。这也可以从一些字典表中搜集到。

看一看The Oracle documentation on using Oracle Trace

+0

+1:老鼠,打败我吧! –

+0

如果您需要更多详细信息或想获得更具体的信息,请在评论中提问。我会尽力帮助你。 –

+1

查询与解析模式名称和会话用户都有关系。因此,user_a可以执行ALTER SESSION SET CURRENT_SCHEMA = USER_B并运行SELECT * FROM EXAMPLE。该查询在USER_B中查找EXAMPLE的表/视图/同义词,但也检查USER_A是否对这些对象拥有特权。可以有多个具有相同文本的SQL,这些SQL在不同模式中引用具有相同名称的对象。 –

0

Oracle中的常规做法是使用定义者的权限来创建存储过程,这意味着尽管是谁调用它们,但查询仍以其定义者的特权执行。这就是缓存工作正常的原因。

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

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

+0

这不是过程/函数/包中查询,其简单的SELECT语句 –

+0

简单的SELECT语句相当于调用维权案。当两个不同的用户发出相同的查询时,该查询将被解析两次。您可以在V $ SQL中为此查询找到两行,它们具有相同的sql_text和sql_id,但具有不同的parsing_schema_name。 –

+0

我错了。如果两个查询在语义上和语义上相等(即两者使用相同的表),则该查询将仅被解析一次。 –

1

第一步Oracle检查如果在缓存中存在查询(共享池)否(这将是存在如果查询是相同的,并且基于LRU),如果存在,则解析将对被跳过并执行将开始。所以为了提高查询性能,我们必须使用绑定变量并使用相同的SQL查询。

这是实际的过程,当你执行Oracle上查询:

  1. 解析步骤
    1. 语法检查
    2. 语义分析
    3. 已查询了一些其他会话中执行?
  2. 硬解析
    1. 解析
    2. 优化
    3. 生成用于查询的计划。

如果答案#1.3是肯定的 - 甲骨文跳过硬解析部分,并使用现有的查询计划。

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