【YashanDB知识库】崖山数据库Outline功能验证

简介: 本文来自YashanDB官网,主要测试了数据库优化器在不同场景下优先使用outline计划的功能。测试环境包括相同版本新增数据、绑定参数执行、单机主备架构以及数据库版本升级等场景。通过创建表、插入数据、收集统计信息和创建outline等步骤,验证了在各种情况下优化器均能优先采用存储的outline计划。测试结果表明,即使统计信息失效或数据库版本升级,outline功能依然稳定有效,确保查询计划的一致性和性能优化。详情可见[原文链接](https://www.yashandb.com/newsinfo/7488286.html?templateId=1718516)。

本文内容来自YashanDB官网,具体内容请见(https://www.yashandb.com/newsinfo/7488286.html?templateId=1718516)

测试验证环境说明

image.png

测试用例说明

1、相同版本下,新增表数据量,使统计信息失效。优化器优先使用outline的计划。

2、相同版本下,绑定参数执行场景下,优化器优先使用outline的计划。

3、单机主备环境,优化器优先使用outline的计划。

4、升级数据库版本后,优化器优先使用outline的计划。

测试过程记录


点击查看代码

--建两张普通表test_tab1和test_tab2 并且分布插入200w数据。

create table test_tab1(col1 int, col2 int, col3 int);

create table test_tab2(col1 int, col2 int, col3 int);

SQL>

Succeed.



SQL>

Succeed.



SQL> begin

for i in 1..2000000 loop

insert into test_tab1 values(i+1,i+2,i+3);

insert into test_tab2 values(i+2,i+3,i+4);

end loop;

commit;

end;

/



PL/SQL Succeed.



-- 收集统计信息

SQL> exec DBMS_STATS.GATHER_DATABASE_STATS('GATHER AUTO', 1, 16, 'FOR ALL COLUMNS SIZE AUTO', 'AUTO', TRUE, FALSE);





PL/SQL Succeed.

--验证版本

SQL> select from v$version;



BANNER VERSION_NUMBER

---------------------------------------------------------------- -----------------

Release 22.2.10.100 x86_64 22.2.10.100



1 row fetched.

SQL> explain select distinct t1.col1, t2.col1

from test_tab1 t1 inner join test_tab2 t2 on t1.col2=t2.col2

order by t1.col1 limit 500;

PLAN_DESCRIPTION

----------------------------------------------------------------

SQL hash value: 2118027925

Optimizer: ADOPT_C



+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

| Id | Operation type | Name | Owner | Rows | Cost(%CPU) | Partition info |

+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

| 0 | SELECT STATEMENT | | | | | |

| 1 | WINDOW | | | 500| 29542( 0)| |

| 2 | TOP SORT DISTINCT | | | 1999998| 29538( 0)| |

|
3 | HASH JOIN INNER | | | 1999998| 24350( 0)| |

| 4 | TABLE ACCESS FULL | TEST_TAB1 | SALES | 2000000| 453( 0)| |

| 5 | TABLE ACCESS FULL | TEST_TAB2 | SALES | 2000000| 453( 0)| |

+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+



Operation Information (identified by operation id):

---------------------------------------------------



3 - Predicate : access("T1"."COL2" = "T2"."COL2")



18 rows fetched.



SQL> create unique index idx1 on test_tab2(col2, col1);



Succeed.



SQL> exec DBMS_STATS.GATHER_DATABASE_STATS('GATHER AUTO', 1, 16, 'FOR ALL COLUMNS SIZE AUTO', 'AUTO', TRUE, FALSE);



PL/SQL Succeed.



-- 创建索引后,从HASH JOIN 转为NEXTED LOOPS INNER JOIN

SQL> explain select distinct t1.col1, t2.col1

2 from test_tab1 t1 inner join test_tab2 t2 on t1.col2=t2.col2

order by t1.col1 limit 500;

3

PLAN_DESCRIPTION

----------------------------------------------------------------

SQL hash value: 2118027925

Optimizer: ADOPT_C



+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

| Id | Operation type | Name | Owner | Rows | Cost(%CPU) | Partition info |

+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

| 0 | SELECT STATEMENT | | | | | |

| 1 | WINDOW | | | 500| 7785( 0)| |

| 2 | TOP SORT DISTINCT | | | 1999998| 7781( 0)| |

| 3 | NESTED LOOPS INNER | | | 1999998| 2594( 0)| |

| 4 | TABLE ACCESS FULL | TEST_TAB1 | SALES | 2000000| 453( 0)| |

| 5 | INDEX RANGE SCAN | IDX1 | SALES | 1| 142( 0)| |

+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+



Operation Information (identified by operation id):

---------------------------------------------------



5 - Predicate : access("T2"."COL2" = "T1"."COL2")



18 rows fetched.





--删除索引后,执行计划从NEXTED LOOPS INNER 转为 HASH JOIN INNER

SQL> drop index IDX1;



Succeed.



SQL>

explain select distinct t1.col1, t2.col1

from test_tab1 t1 inner join test_tab2 t2 on t1.col2=t2.col2

order by t1.col1 limit 500;



SQL>

PLAN_DESCRIPTION

----------------------------------------------------------------

SQL hash value: 2118027925

Optimizer: ADOPT_C



+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

| Id | Operation type | Name | Owner | Rows | Cost(%CPU) | Partition info |

+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

| 0 | SELECT STATEMENT | | | | | |

| 1 | WINDOW | | | 500| 29542( 0)| |

| 2 | TOP SORT DISTINCT | | | 1999998| 29538( 0)| |

|
3 | HASH JOIN INNER | | | 1999998| 24350( 0)| |

| 4 | TABLE ACCESS FULL | TEST_TAB1 | SALES | 2000000| 453( 0)| |

| 5 | TABLE ACCESS FULL | TEST_TAB2 | SALES | 2000000| 453( 0)| |

+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+



Operation Information (identified by operation id):

---------------------------------------------------



3 - Predicate : access("T1"."COL2" = "T2"."COL2")



18 rows fetched.



-- 创建索引前,增加outline

-- outline 分别是ol_ab和ol_a

SQL> CREATE OUTLINE ol_ab FOR CATEGORY ctgy_ab ON

select distinct t1.col1, t2.col1

from test_tab1 t1 inner join test_tab2 t2 on t1.col2=t2.col2

order by t1.col1 limit 500;

Succeed.



SQL> CREATE OUTLINE ol_a FOR CATEGORY ctgy_ab ON

select / + full(t2) / distinct t1.col1, t 2 3 4 2.col1

from test_tab1 t1 inner join test_tab2 t2 on t1.col2=t2.col2

order by t1.col1 limit 500;

Succeed.



--应用outline,使得配置生效

SQL> ALTER SESSION SET USE_STORED_OUTLINES=ctgy_ab;



Succeed.



-- 整库收集统计信息,让执行计划重新生成

SQL> exec DBMS_STATS.GATHER_DATABASE_STATS('GATHER AUTO', 1, 16, 'FOR ALL COLUMNS SIZE AUTO', 'AUTO', TRUE, FALSE);



PL/SQL Succeed.

--创建索引

-- 经前面测试得知,创建索引后,此版本数据库会选择NEXTED LOOP JOIN

SQL> create unique index idx1 on test_tab2(col2, col1);



Succeed.



-- 可以看到outline已生效,依然走HASH JOIN INNER

SQL> explain select distinct t1.col1, t2.col1

from test_tab1 t1 inner join test_tab2 t2 on t1.col2=t2.col2

order by t1.col1 limit 500;



SQL>



PLAN_DESCRIPTION

----------------------------------------------------------------

SQL hash value: 2118027925

Optimizer: ADOPT_C



+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

| Id | Operation type | Name | Owner | Rows | Cost(%CPU) | Partition info |

+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

| 0 | SELECT STATEMENT | | | | | |

| 1 | WINDOW | | | 500| 29542( 0)| |

| 2 | TOP SORT DISTINCT | | | 1999998| 29538( 0)| |

| 3 | HASH JOIN INNER | | | 1999998| 24350( 0)| |

| 4 | TABLE ACCESS FULL | TEST_TAB1 | SALES | 2000000| 453( 0)| |

| 5 | TABLE ACCESS FULL | TEST_TAB2 | SALES | 2000000| 453( 0)| |

+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+



Operation Information (identified by operation id):

---------------------------------------------------



3 - Predicate : access("T1"."COL2" = "T2"."COL2")



Outline Information :

---------------------------------------------------



- outline OL_AB used for this statement



23 rows fetched.





SQL> SELECT join_pos, hint

FROM USER_OUTLINE_HINTS

WHERE name = 'OL_AB'; 2 3



JOIN_POS HINT

-------- ----------------------------------------------------------------

0 LEADING(T1 T2)

0 USE_HASH(T2)

1 FULL(T1)

2 FULL(T2)



4 rows fetched.


持续新增200w数据,使得两张表统计信息失效

点击查看代码

begin

for i in 2000003 ..4000003 loop

insert into test_tab1 values(i+1,i+2,i+3);

insert into test_tab2 values(i+2,i+3,i+4);

end loop;

commit;

end;

/


此时统计信息已失效

点击查看代码

SQL> select from dba_tab_statistics where STALE_STATS!='N';



OWNER TABLE_NAME PARTITION_NAME PARTITION_POSITION SUBPARTITION_NAME SUBPARTITION_POSITION OBJECT_TYPE NUM_ROWS BLOCKS EMPTY_BLOCKS AVG_SPACE CHAIN_CNT AVG_ROW_LEN SAMPLE_SIZE LAST_ANALYZED GLOBAL_STATS USER_STATS LOCKED_STATS STALE_STATS SCOPE

---------------------------------------------------------------- ---------------------------------------------------------------- ---------------------------------------------------------------- --------------------- ----------------- --------------------- ------------- --------------------- --------------------- --------------------- ------------ --------------------- ------------ --------------------- -------------------------------- ------------ ---------- ------------ ----------- ---------

SALES TEST_TAB1 TABLE 2000000 6007 36 735 0 20 2000000 2024-08-07 Y N N Y SHARED

SALES TEST_TAB2 TABLE 2000000 6039 68 774 0 20 2000000 2024-08-07 Y N N Y SHARED



2 rows fetched.

统计信息失效后,优化器优先使用outline的计划


点击查看代码

-- outline 没有生效时,业务查询的计划

SQL> explain select distinct t1.col1, t2.col1

from test_tab1 t1 inner join test_tab2 t2 on t1.col2=t2.col2

order by t1.col1 limit 500;

2 3

PLAN_DESCRIPTION

----------------------------------------------------------------

SQL hash value: 2118027925

Optimizer: ADOPT_C



+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

| Id | Operation type | Name | Owner | Rows | Cost(%CPU) | Partition info |

+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

| 0 | SELECT STATEMENT | | | | | |

| 1 | WINDOW | | | 500| 943( 0)| |

| 2 | TOP SORT DISTINCT | | | 1000| 943( 0)| |

| 3 | NESTED LOOPS INNER | | | 100000| 683( 0)| |

| 4 | TABLE ACCESS FULL | TEST_TAB1 | SALES | 100000| 442( 0)| |

| 5 | INDEX RANGE SCAN | IDX1 | SALES | 1| 142( 0)| |

+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+



Operation Information (identified by operation id):

---------------------------------------------------



5 - Predicate : access("T2"."COL2" = "T1"."COL2")



18 rows fetched.



--outline生效后,优化器优先使用outline的执行计划

SQL> ALTER SESSION SET USE_STORED_OUTLINES=ctgy_ab;



Succeed.



SQL> explain select distinct t1.col1, t2.col1

from test_tab1 t1 inner join test_tab2 t2 on t1.col2=t2.col2

order by t1.col1 limit 500;



PLAN_DESCRIPTION

----------------------------------------------------------------

SQL hash value: 2118027925

Optimizer: ADOPT_C



+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

| Id | Operation type | Name | Owner | Rows | Cost(%CPU) | Partition info |

+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

| 0 | SELECT STATEMENT | | | | | |

| 1 | WINDOW | | | 500| 29542( 0)| |

| 2 | TOP SORT DISTINCT | | | 1999998| 29538( 0)| |

|
3 | HASH JOIN INNER | | | 1999998| 24350( 0)| |

| 4 | TABLE ACCESS FULL | TEST_TAB1 | SALES | 2000000| 453( 0)| |

| 5 | TABLE ACCESS FULL | TEST_TAB2 | SALES | 2000000| 453( 0)| |

+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+



Operation Information (identified by operation id):

---------------------------------------------------



3 - Predicate : access("T1"."COL2" = "T2"."COL2")



Outline Information :

---------------------------------------------------



- outline OL_AB used for this statement



23 rows fetched.

绑定参数执行,优化器优先使用outline计划


点击查看代码

--创建绑定参数的outline CREATE OUTLINE ol_c FOR CATEGORY ctgy_ab ON select /*+ full(t2)*/ t2.col2,t2.col1 from test_tab2 t2 where t2.col2=? and t2.col1=?; Succeed. ALTER system SET USE_STORED_OUTLINES=ctgy_ab; -- outline生效 SQL> ALTER SESSION SET USE_STORED_OUTLINES=ctgy_ab; Succeed. SQL> explain select /*+ full(t2)*/ t2.col2,t2.col1 from test_tab2 t2 where t2.col2=? and t2.col1=?; PLAN_DESCRIPTION ---------------------------------------------------------------- SQL hash value: 631693285 Optimizer: ADOPT_C +----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+ | Id | Operation type | Name | Owner | Rows | Cost(%CPU) | Partition info | +----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+ | 0 | SELECT STATEMENT | | | | | | |* 1 | TABLE ACCESS FULL | TEST_TAB2 | SALES | 1| 448( 0)| | +----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+ Operation Information (identified by operation id): --------------------------------------------------- 1 - Predicate : filter("T2"."COL2" = Param(:0) AND "T2"."COL1" = Param(:1)) Hint Information : --------------------------------------------------- full(t2) / rejected by IGNORE_OPTIM_EMBEDDED_HINTS Outline Information : --------------------------------------------------- - outline OL_C used for this statement <details> <summary>点击查看代码</summary>

24 rows fetched.


单机主备架构下,outline功能测试

主备数据库都需要开启outline功能。


点击查看代码

[yashan@node01 install2210100]$ ./bin/yasboot cluster status -c yashandb -d

hostid | node_type | nodeid | pid | instance_status | database_status | database_role | listen_address | data_path

--------------------------------------------------------------------------------------------------------------------------------------------------

host0001 | db | 1-1:1 | 21925 | open | normal | primary | 192.168.33.103:1688 | /home/yashan/yasdb_data/db-1-1

+-----------+--------+-------+-----------------+-----------------+---------------+---------------------+--------------------------------

| db | 1-2:2 | 21959 | open | normal | standby | 192.168.33.103:1690 | /home/yashan/yasdb_data/db-1-2

----------+-----------+--------+-------+-----------------+-----------------+---------------+---------------------+--------------------------------





[yashan@node01 install2210100]$ yasql sys/yasdb_123@192.168.33.103:1688

YashanDB SQL Release 22.2.10.100 x86_64



Connected to:

YashanDB Server Release 22.2.10.100 x86_64 - X86 64bit Linux



SQL> ALTER SYSTEM SET USE_STORED_OUTLINES=ctgy_ab;

Succeed.

SQL> set autotrace on;

SQL> select distinct t2.col2,t3.col1 from test_tab2 t2 inner join test_tab3 t3 on t2.col2=t3.col1

where t2.col2 =3 limit 10;



COL2 COL1

---------------------------------------------------------------- ----------------------------------------------------------------

3 3



Execution Plan

----------------------------------------------------------------

SQL hash value: 4249347504

Optimizer: ADOPT_C



+----+--------------------------------+----------------------+------------+----------+----------+-------------+----------+----------+----------+----------+--------------------------------+

| Id | Operation type | Name | Owner | E - Rows | A - Rows | Cost(%CPU) | A - Time | Loops | Memory | Disk | Partition info |

+----+--------------------------------+----------------------+------------+----------+----------+-------------+----------+----------+----------+----------+--------------------------------+

| 0 | SELECT STATEMENT | | | | | | | | | | |

| 1 | WINDOW | | | 1| | 2212( 0)| | | | | |

| 2 | SORT DISTINCT | | | 1| | 2212( 0)| | | | | |

| 3 | NESTED LOOPS INNER | | | 1| | 2212( 0)| | | | | |

|
4 | INDEX FAST FULL SCAN | IDX_COL2 | SYS | 1| | 929( 0)| | | | | |

| 5 | INDEX FAST FULL SCAN | IDX_COL3 | SYS | 10000000| | 600( 0)| | | | | |

+----+--------------------------------+----------------------+------------+----------+----------+-------------+----------+----------+----------+----------+--------------------------------+



Operation Information (identified by operation id):

---------------------------------------------------



3 - Predicate : filter("T2"."COL2" = "T3"."COL1")

4 - Predicate : filter(CAST("T2"."COL2" AS NUMBER) = 3)



Outline Information :

---------------------------------------------------



- outline OL_AF used for this statement



Statistics

----------------------------------------------------------------------------------------------------



25 rows fetched.



SQL>

Disconnected from:

YashanDB Server Release 22.2.10.100 x86_64 - X86 64bit Linux





--备库上测试outline功能

[yashan@node01 install2210100]$ yasql sys/yasdb_123@192.168.33.103:1690

YashanDB SQL Release 22.2.10.100 x86_64



Connected to:

YashanDB Server Release 22.2.10.100 x86_64 - X86 64bit Linux



SQL> set autotrace on;

SQL> select distinct t2.col2,t3.col1 from test_tab2 t2 inner join test_tab3 t3 on t2.col2=t3.col1

where t2.col2 =3 limit 10;

COL2 COL1

---------------------------------------------------------------- ----------------------------------------------------------------

3 3



Execution Plan

----------------------------------------------------------------

SQL hash value: 4249347504

Optimizer: ADOPT_C



+----+--------------------------------+----------------------+------------+----------+----------+-------------+----------+----------+----------+----------+--------------------------------+

| Id | Operation type | Name | Owner | E - Rows | A - Rows | Cost(%CPU) | A - Time | Loops | Memory | Disk | Partition info |

+----+--------------------------------+----------------------+------------+----------+----------+-------------+----------+----------+----------+----------+--------------------------------+

| 0 | SELECT STATEMENT | | | | | | | | | | |

| 1 | WINDOW | | | 1| | 1071( 0)| | | | | |

| 2 | SORT DISTINCT | | | 1| | 1071( 0)| | | | | |

| 3 | NESTED LOOPS INNER | | | 1| | 1071( 0)| | | | | |

| 4 | INDEX FAST FULL SCAN | IDX_COL2 | SYS | 1| | 929( 0)| | | | | |

|
5 | INDEX RANGE SCAN | IDX_COL3 | SYS | 1| | 142( 0)| | | | | |

+----+--------------------------------+----------------------+------------+----------+----------+-------------+----------+----------+----------+----------+--------------------------------+



Operation Information (identified by operation id):

---------------------------------------------------



4 - Predicate : filter(CAST("T2"."COL2" AS NUMBER) = 3)

5 - Predicate : access("T3"."COL1" = "T2"."COL2")



Statistics

----------------------------------------------------------------------------------------------------

20 rows fetched.



--备库需要单独开启outline

SQL> ALTER SYSTEM SET USE_STORED_OUTLINES=ctgy_ab;





Succeed.



SQL> select distinct t2.col2,t3.col1 from test_tab2 t2 inner join test_tab3 t3 on t2.col2=t3.col1

where t2.col2 =3 limit 10;



COL2 COL1

---------------------------------------------------------------- ----------------------------------------------------------------

3 3



Execution Plan

----------------------------------------------------------------

SQL hash value: 4249347504

Optimizer: ADOPT_C



+----+--------------------------------+----------------------+------------+----------+----------+-------------+----------+----------+----------+----------+--------------------------------+

| Id | Operation type | Name | Owner | E - Rows | A - Rows | Cost(%CPU) | A - Time | Loops | Memory | Disk | Partition info |

+----+--------------------------------+----------------------+------------+----------+----------+-------------+----------+----------+----------+----------+--------------------------------+

| 0 | SELECT STATEMENT | | | | | | | | | | |

| 1 | WINDOW | | | 1| | 2212( 0)| | | | | |

| 2 | SORT DISTINCT | | | 1| | 2212( 0)| | | | | |

| 3 | NESTED LOOPS INNER | | | 1| | 2212( 0)| | | | | |

|
4 | INDEX FAST FULL SCAN | IDX_COL2 | SYS | 1| | 929( 0)| | | | | |

| 5 | INDEX FAST FULL SCAN | IDX_COL3 | SYS | 10000000| | 600( 0)| | | | | |

+----+--------------------------------+----------------------+------------+----------+----------+-------------+----------+----------+----------+----------+--------------------------------+



Operation Information (identified by operation id):

---------------------------------------------------



3 - Predicate : filter("T2"."COL2" = "T3"."COL1")

4 - Predicate : filter(CAST("T2"."COL2" AS NUMBER) = 3)



Outline Information :

---------------------------------------------------



- outline OL_AF used for this statement

Statistics

----------------------------------------------------------------------------------------------------



25 rows fetched.

升级数据库版本后,优化器优先使用outline为准

22.2.10.100 版本执行计划和创建outline al_af


点击查看代码

YashanDB Server Release 22.2.10.100 x86_64 - X86 64bit Linux





create table test_tab2(col1 varchar2(100),col2 varchar2(100),col3 varchar2(100));



create table test_tab3(col1 varchar2(100),col2 varchar2(100),col3 varchar2(100));

SQL>

Succeed.





Succeed.



SQL>

SQL>

begin

for i in 1..10000000 loop

insert into test_tab2 values(i+1,i+2,i+3);

insert into test_tab3 values(i+2,i+3,i+4);

end loop;

commit;

end;

/

SQL>



PL/SQL Succeed.





SQL> exec DBMS_STATS.GATHER_DATABASE_STATS('GATHER AUTO', 1, 16, 'FOR ALL COLUMNS SIZE AUTO', 'AUTO', TRUE, FALSE);







PL/SQL Succeed.



create index idx_col2 on test_tab2(col2);

create index idx_col3 on test_tab3(col1);

SQL>

Succeed.

SQL>



Succeed.





SQL> explain select distinct t2.col2,t3.col1 from test_tab2 t2 inner join test_tab3 t3 on t2.col2=t3.col1

where t2.col2 =3 limit 10;



PLAN_DESCRIPTION

----------------------------------------------------------------

SQL hash value: 4249347504

Optimizer: ADOPT_C



+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

| Id | Operation type | Name | Owner | Rows | Cost(%CPU) | Partition info |

+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

| 0 | SELECT STATEMENT | | | | | |

| 1 | WINDOW | | | 1| 1071( 0)| |

| 2 | SORT DISTINCT | | | 1| 1071( 0)| |

| 3 | NESTED LOOPS INNER | | | 1| 1071( 0)| |

| 4 | INDEX FAST FULL SCAN | IDX_COL2 | SYS | 1| 929( 0)| |

|
5 | INDEX RANGE SCAN | IDX_COL3 | SYS | 1| 142( 0)| |

+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+



Operation Information (identified by operation id):

---------------------------------------------------



4 - Predicate : filter(CAST("T2"."COL2" AS NUMBER) = 3)

5 - Predicate : access("T3"."COL1" = "T2"."COL2")



19 rows fetched.



SQL> exec DBMS_STATS.GATHER_DATABASE_STATS('GATHER AUTO', 1, 16, 'FOR ALL COLUMNS SIZE AUTO', 'AUTO', TRUE, FALSE);





PL/SQL Succeed.



SQL> explain select distinct t2.col2,t3.col1 from test_tab2 t2 inner join test_tab3 t3 on t2.col2=t3.col1

where t2.col2 =3 limit 10;



PLAN_DESCRIPTION

----------------------------------------------------------------

SQL hash value: 4249347504

Optimizer: ADOPT_C



+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

| Id | Operation type | Name | Owner | Rows | Cost(%CPU) | Partition info |

+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

| 0 | SELECT STATEMENT | | | | | |

| 1 | WINDOW | | | 1| 1071( 0)| |

| 2 | SORT DISTINCT | | | 1| 1071( 0)| |

| 3 | NESTED LOOPS INNER | | | 1| 1071( 0)| |

| 4 | INDEX FAST FULL SCAN | IDX_COL2 | SYS | 1| 929( 0)| |

|
5 | INDEX RANGE SCAN | IDX_COL3 | SYS | 1| 142( 0)| |

+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+



Operation Information (identified by operation id):

---------------------------------------------------



4 - Predicate : filter(CAST("T2"."COL2" AS NUMBER) = 3)

5 - Predicate : access("T3"."COL1" = "T2"."COL2")



19 rows fetched.



SQL> CREATE OUTLINE ol_af FOR CATEGORY ctgy_ab ON

select distinct t2.col2,t3.col1 from test_tab2 t2 inner join test_tab3 t3 on t2.col2=t3.col1

where t2.col2 =3 limit 10;



Succeed.



SQL>

ALTER SESSION SET USE_STORED_OUTLINES=ctgy_ab;

SQL>

Succeed.



SQL> explain select distinct t2.col2,t3.col1 from test_tab2 t2 inner join test_tab3 t3 on t2.col2=t3.col1

where t2.col2 =3 limit 10;

PLAN_DESCRIPTION

----------------------------------------------------------------

SQL hash value: 4249347504

Optimizer: ADOPT_C



+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

| Id | Operation type | Name | Owner | Rows | Cost(%CPU) | Partition info |

+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+

| 0 | SELECT STATEMENT | | | | | |

| 1 | WINDOW | | | 1| 2212( 0)| |

| 2 | SORT DISTINCT | | | 1| 2212( 0)| |

| 3 | NESTED LOOPS INNER | | | 1| 2212( 0)| |

|
4 | INDEX FAST FULL SCAN | IDX_COL2 | SYS | 1| 929( 0)| |

| 5 | INDEX FAST FULL SCAN | IDX_COL3 | SYS | 10000000| 600( 0)| |

+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+



Operation Information (identified by operation id):

---------------------------------------------------



3 - Predicate : filter("T2"."COL2" = "T3"."COL1")

4 - Predicate : filter(CAST("T2"."COL2" AS NUMBER) = 3)



Outline Information :

---------------------------------------------------



- outline OL_AF used for this statement



24 rows fetched.


从22.2.10.100升级到23.2.3.100,同时开启outline,优化器优先使用outline存储执行计划


点击查看代码

SQL> select * from v$version; BANNER VERSION_NUMBER ---------------------------------------------------------------- ----------------- Enterprise Edition Release 23.2.3.100 x86_64 23.2.3.100 YashanDB Server Enterprise Edition Release 23.2.3.100 x86_64 - X86 64bit Linux SQL> explain select distinct t2.col2,t3.col1 from test_tab2 t2 inner join test_tab3 t3 on t2.col2=t3.col1 where t2.col2 =3 limit 10; PLAN_DESCRIPTION ---------------------------------------------------------------- SQL hash value: 4249347504 Optimizer: ADOPT_C +----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+ | Id | Operation type | Name | Owner | Rows | Cost(%CPU) | Partition info | +----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+ | 0 | SELECT STATEMENT | | | | | | | 1 | WINDOW | | | 1| 29( 0)| | | 2 | SORT DISTINCT | | | 1| 29( 0)| | | 3 | NESTED INDEX LOOPS INNER | | | 1| 29( 0)| | |* 4 | INDEX FAST FULL SCAN | IDX_COL2 | SYS | 1| 28( 0)| | |* 5 | INDEX RANGE SCAN | IDX_COL3 | SYS | 1| 1( 0)| | +----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+ Operation Information (identified by operation id): --------------------------------------------------- 1 - Limit Expression: (LIMIT: 10) 2 - Distinct Expression: ("T2"."COL2") 4 - Predicate : filter("T2"."COL2" = 3) 5 - Predicate : access("T3"."COL1" = "T2"."COL2") 21 rows fetched. SQL> exec DBMS_STATS.GATHER_DATABASE_STATS('GATHER AUTO', 1, 16, 'FOR ALL COLUMNS SIZE AUTO', 'AUTO', TRUE, FALSE); SQL> PL/SQL Succeed. SQL> ALTER SESSION SET USE_STORED_OUTLINES=ctgy_ab; Succeed. SQL> explain select distinct t2.col2,t3.col1 from test_tab2 t2 inner join test_tab3 t3 on t2.col2=t3.col1 where t2.col2 =3 limit 10; PLAN_DESCRIPTION ---------------------------------------------------------------- SQL hash value: 4249347504 Optimizer: ADOPT_C +----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+ | Id | Operation type | Name | Owner | Rows | Cost(%CPU) | Partition info | +----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+ | 0 | SELECT STATEMENT | | | | | | | 1 | WINDOW | | | 1| 767( 0)| | | 2 | SORT DISTINCT | | | 1| 767( 0)| | |* 3 | NESTED LOOPS INNER | | | 1| 767( 0)| | |* 4 | INDEX FAST FULL SCAN | IDX_COL2 | SYS | 1| 28( 0)| | | 5 | INDEX FAST FULL SCAN | IDX_COL3 | SYS | 10000000| 28( 0)| | +----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+ Operation Information (identified by operation id): --------------------------------------------------- 1 - Limit Expression: (LIMIT: 10) 2 - Distinct Expression: ("T2"."COL2") 3 - Predicate : filter("T2"."COL2" = "T3"."COL1") 4 - Predicate : filter("T2"."COL2" = 3) Outline Information : --------------------------------------------------- - outline OL_AF used for this statement 26 rows fetched. SQL> set autotrace on; SQL> select distinct t2.col2,t3.col1 from test_tab2 t2 inner join test_tab3 t3 on t2.col2=t3.col1 where t2.col2 =3 limit 10; 2 COL2 COL1 ---------------------------------------------------------------- ---------------------------------------------------------------- 3 3 Execution Plan ---------------------------------------------------------------- SQL hash value: 4249347504 Optimizer: ADOPT_C +----+--------------------------------+----------------------+------------+----------+----------+-------------+----------+----------+----------+----------+--------------------------------+ | Id | Operation type | Name | Owner | E - Rows | A - Rows | Cost(%CPU) | A - Time | Loops | Memory | Disk | Partition info | +----+--------------------------------+----------------------+------------+----------+----------+-------------+----------+----------+----------+----------+--------------------------------+ | 0 | SELECT STATEMENT | | | | | | | | | | | | 1 | WINDOW | | | 1| | 767( 0)| | | | | | | 2 | SORT DISTINCT | | | 1| | 767( 0)| | | | | | |* 3 | NESTED LOOPS INNER | | | 1| | 767( 0)| | | | | | |* 4 | INDEX FAST FULL SCAN | IDX_COL2 | SYS | 1| | 28( 0)| | | | | | | 5 | INDEX FAST FULL SCAN | IDX_COL3 | SYS | 10000000| | 28( 0)| | | | | | +----+--------------------------------+----------------------+------------+----------+----------+-------------+----------+----------+----------+----------+--------------------------------+ Operation Information (identified by operation id): --------------------------------------------------- 1 - Limit Expression: (LIMIT: 10) 2 - Distinct Expression: ("T2"."COL2") 3 - Predicate : filter("T2"."COL2" = "T3"."COL1") 4 - Predicate : filter("T2"."COL2" = 3) Outline Information : --------------------------------------------------- - outline OL_AF used for this statement Statistics ---------------------------------------------------------------------------------------------------- 27 rows fetched.

测试总结

相关文章
|
5月前
|
运维 监控 数据可视化
一文拆解 YashanDB Cloud Manager,数据库运维原来还能这么“智能”!
传统数据库运维依赖人工,耗时耗力还易出错。YashanDB Cloud Manager(YCM)作为“智能运维管家”,实现主动、智能、可视化的运维体验。它提供实时资源监控、智能告警系统、自动巡检机制、高可用架构支持和强大的权限管理功能,帮助用户统一管理多实例与集群,减少人工干预,构建现代化数据库运维体系,让企业高效又安心地运行数据库服务。
|
2月前
|
SQL 存储 关系型数据库
MySQL功能模块探秘:数据库世界的奇妙之旅
]带你轻松愉快地探索MySQL 8.4.5的核心功能模块,从SQL引擎到存储引擎,从复制机制到插件系统,让你在欢声笑语中掌握数据库的精髓!
101 26
|
4月前
|
存储 缓存 自然语言处理
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
109 8
评论功能开发全解析:从数据库设计到多语言实现-优雅草卓伊凡
|
5月前
|
监控 数据库
【YashanDB 知识库】ycm 托管数据库时报错 OM host ip:127.0.0.1 is not support join to YCM
在托管数据库时,若 OM 的 IP 被设置为 127.0.0.1,将导致无法托管至 YCM,并使数据库失去监控。此问题源于安装时修改了 OM 的监听 IP。解决方法包括:将 OM 的 IP 修改为本机实际 IP 或 0.0.0.0,同时更新 env 文件及 yasom 后台数据库中的相关配置。经验总结指出,应避免非必要的后台 IP 修改,且数据库安装需遵循规范,不使用仅限本机访问的 IP(如 127.0.0.1)。
|
5月前
|
存储 安全 数据库
风险防不胜防?看 YashanDB 如何守护你的数据库安全(上篇)
数据库作为信息系统核心,其安全性至关重要。本文聚焦数据库安全机制中的访问管理,涵盖身份认证、访问控制与反入侵措施。YashanDB通过口令认证、操作系统认证及双因素认证确保用户身份安全;实施基于角色(RBAC)和标签(LBAC)的访问控制,实现权限精细化管理;同时利用黑白名单与连接监听机制防范未授权访问和恶意攻击。这些措施共同保障数据的机密性、完整性和可用性,助力企业满足国家合规要求。下期将探讨威胁检测与数据保护内容,敬请期待!
|
5月前
|
存储 SQL 安全
风险防不胜防?看 YashanDB 如何守护你的数据库安全(下篇)
本文深入探讨数据库安全机制中的威胁监测与数据保护。在威胁监测方面,YashanDB 提供权限、行为和角色审计功能,支持异步审计降低性能影响,并通过安全漏洞扫描和硬件防护减少漏洞危害。数据保护部分涵盖通信加密(支持国密标准)、存储加密(表空间透明加密TDE)、备份加密及密钥管理等关键技术。此外,YashanDB 支持热备、增量备份和按时间点恢复,并实现安全销毁防止信息泄露,全面保障数据的机密性、完整性和可用性。
|
5月前
|
监控 Java Shell
【YashanDB 知识库】ycm 托管数据库时,数据库非 OM 安装无法托管
本文主要介绍了因数据库未按规范使用 yasboot 安装导致的问题及解决方法。问题表现为无 yasom 和 yasagent 进程,且目录结构缺失,致使 ycm 无法托管与监控。分析发现可能是数据库版本旧或安装不规范引起。解决方法为先生成配置文件,安装 yasom 和 yasagent,再生成并修改托管配置模板,最终通过命令完成托管至 yasom 和 ycm。总结强调了按规范安装数据库的重要性以避免类似问题。
|
23天前
|
安全 关系型数据库 MySQL
MySQL安全最佳实践:保护你的数据库
本文深入探讨了MySQL数据库的安全防护体系,涵盖认证安全、访问控制、网络安全、数据加密、审计监控、备份恢复、操作系统安全、应急响应等多个方面。通过具体配置示例,为企业提供了一套全面的安全实践方案,帮助强化数据库安全,防止数据泄露和未授权访问,保障企业数据资产安全。
|
8天前
|
缓存 关系型数据库 BI
使用MYSQL Report分析数据库性能(下)
使用MYSQL Report分析数据库性能
39 3
|
14天前
|
关系型数据库 MySQL 数据库
自建数据库如何迁移至RDS MySQL实例
数据库迁移是一项复杂且耗时的工程,需考虑数据安全、完整性及业务中断影响。使用阿里云数据传输服务DTS,可快速、平滑完成迁移任务,将应用停机时间降至分钟级。您还可通过全量备份自建数据库并恢复至RDS MySQL实例,实现间接迁移上云。