我正在尝试提高数据库中特定查询的性能。 查询中的一个表在dba_tables中具有大于1的并行度。
我创建了如果我添加一些
的提示NO_PARALLEL
我的查询回来跑得很快。
问题在于我不想触摸和更改查询源。
所以我找到了这篇文章:
http://intermediatesql.com/oracle/how-to-add-a-hint-to-oracle-query-without-touching-its-text/
解释了如何使用块名称的别名来创建配置文件,并实际执行提示而不触及查询。
我之前使用它来使用索引,即使优化器决定执行FTS。
但是在平行的情况下 - 我只是不明白该怎么做。
我只想在整个查询中添加模拟no_parallel提示的操作。
此外,我不想设置并行参数或更改会话..只需更改此查询。
有人?
感谢。
答案 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与个人资料不同,也许它更适合您的需求。