Sam*_*han 6 performance oracle optimization oracle-12c query-performance performance-tuning
如何调整以下查询,因为它大约需要 8 秒:
select constraint_name,table_name
from all_constraints
where r_constraint_name in
(select constraint_name
from all_constraints
where table_name='SUPPLIER');
Run Code Online (Sandbox Code Playgroud)
SUPPLIER
是一个示例表名。
mir*_*173 11
在查询字典视图时,规则提示通常会有所帮助。
select /*+ RULE */ constraint_name,table_name
from all_constraints
where r_constraint_name in
(select constraint_name
from all_constraints
where table_name='SUPPLIER');
Run Code Online (Sandbox Code Playgroud)
但是您的查询并不准确。对象也有所有者。
select /*+ RULE */ owner, constraint_name,table_name
from all_constraints
where (r_owner, r_constraint_name) in
(select owner,constraint_name
from all_constraints
where table_name='SUPPLIER'
and owner='SOMEONE');
Run Code Online (Sandbox Code Playgroud)
但是这个查询可以被表述为一个连接。
select /*+ RULE +*/ ref.owner, ref.constraint_name,ref.table_name
from all_constraints ref, all_constraints cons
where ref.r_constraint_name=cons.constraint_name
and ref.r_owner=cons.owner
and cons.owner='&OWNER'
and cons.table_name='&TABLE';
Run Code Online (Sandbox Code Playgroud)
如果您更喜欢现代 JOIN 语法
select /*+ RULE */ ref.owner, ref.constraint_name,ref.table_name
from all_constraints ref JOIN all_constraints cons
on (ref.r_owner=cons.owner and ref.r_constraint_name=cons.constraint_name)
where
cons.owner='&OWNER'
and cons.table_name='&TABLE';
Run Code Online (Sandbox Code Playgroud)
这是一些计时结果,在 12c 数据库 (12.1.0.2.0) 上有和没有规则提示
SQL> alter system flush shared_pool;
System altered.
Elapsed: 00:00:00.44
SQL> select ref.owner, ref.constraint_name,ref.table_name
2 from all_constraints ref, all_constraints cons
3 where ref.r_constraint_name=cons.constraint_name
4 and ref.r_owner=cons.owner
5 and cons.owner='OWNER'
6 and cons.table_name='TABLE';
no rows selected
Elapsed: 00:00:03.95
SQL> select ref.owner, ref.constraint_name,ref.table_name
2 from all_constraints ref, all_constraints cons
3 where ref.r_constraint_name=cons.constraint_name
4 and ref.r_owner=cons.owner
5 and cons.owner='OWNER'
6 and cons.table_name='TABLE';
no rows selected
Elapsed: 00:00:00.00
SQL> alter system flush shared_pool;
System altered.
Elapsed: 00:00:00.02
SQL> select ref.owner, ref.constraint_name,ref.table_name
2 from all_constraints ref, all_constraints cons
3 where ref.r_constraint_name=cons.constraint_name
4 and ref.r_owner=cons.owner
5 and cons.owner='OWNER'
6 and cons.table_name='TABLE';
no rows selected
Elapsed: 00:00:03.94
SQL> alter system flush shared_pool;
System altered.
Elapsed: 00:00:00.01
SQL> select /*+ RULE */ ref.owner, ref.constraint_name,ref.table_name
2 from all_constraints ref, all_constraints cons
3 where ref.r_constraint_name=cons.constraint_name
4 and ref.r_owner=cons.owner
5 and cons.owner='OWNER'
6 and cons.table_name='TABLE';
no rows selected
Elapsed: 00:00:00.27
SQL> select /*+ RULE */ ref.owner, ref.constraint_name,ref.table_name
2 from all_constraints ref, all_constraints cons
3 where ref.r_constraint_name=cons.constraint_name
4 and ref.r_owner=cons.owner
5 and cons.owner='OWNER'
6 and cons.table_name='TABLE';
no rows selected
Elapsed: 00:00:00.16
Run Code Online (Sandbox Code Playgroud)
我还使用以下方法收集了有关 SYS 对象的统计信息
SQL> exec dbms_stats.gather_schema_stats('SYS',options=>'GATHER', -
> estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE, -
> method_opt => 'FOR ALL COLUMNS SIZE AUTO', cascade => TRUE);
PL/SQL procedure successfully completed.
Elapsed: 00:03:41.58
Run Code Online (Sandbox Code Playgroud)
但这没有帮助。
在 11g 系统 (11.2.0.4.0) 上,没有提示的查询性能要好得多,但即使有提示也会加速查询
SQL> alter system flush shared_pool;
System altered.
Elapsed: 00:00:00.01
SQL> select ref.owner, ref.constraint_name,ref.table_name
2 from all_constraints ref, all_constraints cons
3 where ref.r_constraint_name=cons.constraint_name
4 and ref.r_owner=cons.owner
5 and cons.owner='OWNER'
6 and cons.table_name='TABLE';
no rows selected
Elapsed: 00:00:00.65
SQL> alter system flush shared_pool;
System altered.
Elapsed: 00:00:00.01
SQL> select ref.owner, ref.constraint_name,ref.table_name
2 from all_constraints ref, all_constraints cons
3 where ref.r_constraint_name=cons.constraint_name
4 and ref.r_owner=cons.owner
5 and cons.owner='OWNER'
6 and cons.table_name='TABLE';
no rows selected
Elapsed: 00:00:00.66
SQL> alter system flush shared_pool;
System altered.
Elapsed: 00:00:00.01
SQL> select /*+ RULE */ ref.owner, ref.constraint_name,ref.table_name
2 from all_constraints ref, all_constraints cons
3 where ref.r_constraint_name=cons.constraint_name
4 and ref.r_owner=cons.owner
5 and cons.owner='OWNER'
6 and cons.table_name='TABLE';
no rows selected
Elapsed: 00:00:00.18
SQL>
Run Code Online (Sandbox Code Playgroud)