如何在没有提示的情况下防止查询并行执行

时间:2018-01-22 11:20:58

标签: oracle performance oracle11g parallel-processing

我正在尝试提高数据库中特定查询的性能。 查询中的一个表在dba_tables中具有大于1的并行度。

我创建了如果我添加一些

的提示
  

NO_PARALLEL

我的查询回来跑得很快。

问题在于我不想触摸和更改查询源。

所以我找到了这篇文章:

http://intermediatesql.com/oracle/how-to-add-a-hint-to-oracle-query-without-touching-its-text/

解释了如何使用块名称的别名来创建配置文件,并实际执行提示而不触及查询。

我之前使用它来使用索引,即使优化器决定执行FTS。

但是在平行的情况下 - 我只是不明白该怎么做。

我只想在整个查询中添加模拟no_parallel提示的操作。

此外,我不想设置并行参数或更改会话..只需更改此查询。

有人?

感谢。

2 个答案:

答案 0 :(得分:1)

强制单个查询使用/*+ NO_PARALLEL */很容易,因为它是一个语句级提示。无需添加查询块名称或找出Oracle的内部名称。

将NO_PARALLEL提示添加到查询中:

begin
    dbms_sqltune.import_sql_profile(
        sql_text => 'select /*+ parallel */ * from dba_objects',
        profile => sqlprof_attr('no_parallel'),
        name => '0ftu9j02g81b0_noparallel'
    );
end;
/

验证该语句是否具有配置文件且不并行运行:

explain plan for select /*+ parallel */ * from dba_objects;
select * from table(dbms_xplan.display);

结果:

...

Note
-----
   - Degree of Parallelism is 1 because of hint
   - SQL profile "0ftu9j02g81b0_noparallel" used for this statement
   - this is an adaptive plan

答案 1 :(得分:0)

所以你不想:

  • 更改查询本身
  • 更改表格上的程度
  • 更改会话级参数

看起来像是技术问题的能力问题。

如果您的查询已修复知道sql_id,您仍然可以使用sqlpatch在解析过程中强制提示。 sqlplatch与个人资料不同,也许它更适合您的需求。