暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 将配置文件应用于相同但可悲的是独特的sql

ASKTOM 2021-02-25
253

问题描述

提前感谢团队提供的所有帮助,非常感谢!

我有一种情况,我正在使用的应用程序利用GTTs将数据加载到和过滤sql。问题是,在这样做的应用程序也注入一个基数提示到SQL的行数在GTT。例如:

select * 
from table1
where column1 in (select /*+ cardinality ( 150 ) */ gtt_column from gtt);


因此,将sql配置文件应用于该配置文件将正常工作,但不会捕获SQL的下一个化身,这可能是

select * 
from table1
where column1 in (select /*+ cardinality ( 200 ) */ gtt_column from gtt);


除了应用程序代码更改之外,是否有任何选项可以解决此问题?

谢谢!

显示唯一SQL id的简单测试用例

create global temporary table gtt_test (column1 number) on commit delete rows;
create table perm_test as
select level as column1 from dual connect by level <= 1000;

insert into gtt_test select level from dual connect by level <= 10;

select * from perm_test where column1 in (select /*+ cardinality (1) */ * from gtt_test);
select * from perm_test where column1 in (select /*+ cardinality (2) */ * from gtt_test);

select sql_text, sql_id, executions from v$sql where parsing_schema_name = user and sql_text like '%cardinality%'
order by first_load_time desc;


专家解答

据我所知没有。SQL配置文件的强制匹配属性仅适用于文字,不适用于提示。

请注意,通常,您将希望具有不同基数提示值的查询使用不同的计划。因此不同的配置文件。与基数 (99999) 相比,具有基数 (1) 的查询更有可能从索引中受益。

当您升级到最新版本时,值得调查GTTs的会话统计信息。这些可能使您完全放弃提示和配置文件。

https://oracle-base.com/articles/12c/session-private-statistics-for-global-temporary-tables-12cr1
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论