索引的 ADO 策略扩展了现有的自动数据优化 (ADO) 功能,以提供对索引的压缩和优化功能。 Oracle 数据库的客户有兴趣利用压缩分层和存储分层来满足他们的信息生命周期管理 (ILM) 要求。现有的 ADO 功能使您能够设置策略,自动对数据表和分区实施压缩分层和存储分层,而用户干预最少。
在数据库中,索引也会消耗大量的数据库空间。在不牺牲性能的情况下减少索引的空间需求需要 ILM 操作,类似于现有的数据段自动数据优化功能。使用这种新的索引压缩和优化功能,相同的 ADO 基础架构也可以自动优化索引。与用于数据段的 ADO 类似,这种自动索引压缩和优化功能通过使您能够设置通过压缩、收缩和重建索引等操作自动优化索引的策略来实现索引的 ILM。
自动索引优化介绍
此页面提供有关索引的自动数据优化策略的更多详细信息,扩展了表的现有 ADO 功能以提供对索引的段移动、压缩和优化功能。
幻灯片显示了如何设置热图和自动数据优化 (ADO) 之间的不同步骤,以根据 ADO 策略中定义的某些条件自动将段移动到另一个表空间和/或压缩块或段。
Oracle Database 21c 允许对索引使用 ADO 策略,扩展现有的表自动数据优化 (ADO) 功能,以提供对索引的段移动、压缩和优化功能。优化过程包括压缩、收缩或重建索引等操作。当指定了 OPTIMIZE 子句时,Oracle 会自动确定哪个操作对索引是最佳的,并将该操作作为优化过程的一部分实施。您不必指定要执行的操作。
-
DBA 的第一个操作是启用热图,跟踪块和段上的活动。热图激活系统生成的统计信息收集,例如段访问或修改。
-
实时统计数据收集在内存中(V HEAT_MAP_SEGMENT 视图),并由计划的 DBMS_SCHEDULER 作业定期刷新到持久 HEAT_MAP_STAT$ 表。使用 DBA_HEAT_MAP_SEG_HISTOGRAM 视图可以看到持久数据。
-
DBA 的下一个操作是在索引上创建 ADO 策略作为表空间上的默认 ADO 行为。
-
DBA 的下一步是在默认调度与业务需求不匹配时调度必须进行 ADO 策略评估的时间。 ADO 策略评估依赖于热图统计。 MMON 定期评估行级策略并启动作业以压缩符合条件的块。段级策略仅在维护窗口期间评估和执行。
-
DBA 可以通过 DBA_ILMEVALUATIONDETAILS 和 DBA_ILMRESULTS 视图查看 ADO 执行结果。
-
最后,DBA 可以通过查看 COMPRESSION_STAT$ 表来验证该段是否已移动到另一个表空间并因此存储在 ADO 策略中定义的表空间中,或者索引的块是否被压缩。
实践:为索引实施存储分层 ADO 策略
概述 此实践展示了如何根据自动数据优化策略中定义的某些条件自动将索引移动到另一个表空间。
第一步:搭建测试环境 执行清理任何现有 ADO 策略的 shell 脚本,创建两个表空间以将索引从 ADOTBSINDX 表空间移动到 LOW_COST_STORE_INDX 表空间,并创建具有主键 PK_EMPLOYEE_ID 的 HR.EMP 表,其索引存储在 ADOTBSINDX 中。 它还开始收集热图统计信息。
$ /home/oracle/labs/M104783GC10/ADO_setup.sh
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
SQL> set feedback off
SQL> delete ilm_results$;
SQL> delete ilm_execution$;
SQL> delete ilm_executiondetails$;
SQL> DROP TABLESPACE adotbsindx INCLUDING CONTENTS AND DATAFILES;
DROP TABLESPACE adotbsindx INCLUDING CONTENTS AND DATAFILES
*
ERROR at line 1:
ORA-00959: tablespace 'ADOTBSINDX' does not exist
...
SQL> INSERT INTO hr.emp
2 SELECT employee_id*7, first_name,last_name, email, phone_number, hire_date, job_id, salary, commission_pct, manager_id, department_id
3 FROM hr.emp;
214 rows created.
SQL> COMMIT;
Commit complete.
SQL> exit
Step 2 : 显示表空间中表索引使用和释放的空间 显示存储 HR.EMP 表的主键索引的表空间以及段使用了多少空间。
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Enter password:
Connected to:
SQL> COL tablespace_name FORMAT A20
SQL> COL index_name FORMAT A20
SQL> COL owner FORMAT A10
SQL> SELECT tablespace_name, index_name, owner FROM dba_indexes WHERE table_name='EMP';
TABLESPACE_NAME INDEX_NAME OWNER
-------------------- -------------------- ----------
ADOTBSINDX PK_EMPLOYEE_ID HR
SQL>
SQL> SELECT bytes FROM dba_segments WHERE segment_name='PK_EMPLOYEE_ID';
BYTES
----------
65536
SQL>
显示存储 HR.EMP 表的主键索引的表空间中已使用和空闲的空间。
df.bytes / (1024 * 1024) "Size (MB)",
SUM(fs.bytes) / (1024 * 1024) "Free (MB)",
Nvl(Round(SUM(fs.bytes) * 100 / df.bytes),1) "% Free",
Round((df.bytes - SUM(fs.bytes)) * 100 / df.bytes) "% Used"
FROM dba_free_space fs, (SELECT tablespace_name,SUM(bytes) bytes
FROM dba_data_files
GROUP BY tablespace_name) df
WHERE fs.tablespace_name (+) = df.tablespace_name
GROUP BY df.tablespace_name,df.bytes
ORDER BY 4;
Tablespace Size (MB) Free (MB) % Free % Used
------------------------------ ---------- ---------- ---------- ----------
SYSTEM 310 11.625 4 96
SYSAUX 450 25.4375 6 94
USERS 671.25 37.8125 6 94
TBS_FOR_ADO 4 1.3125 33 67
ADOTBSINDX 2 .9375 47 53
UNDOTBS1 250 210.75 84 16
LOW_COST_STORE_INDX 100 99 99 1
7 rows selected.
第 3 步:在索引上创建存储分层 ADO 策略 在索引上创建存储分层 ADO 策略,以便当 ADOTBSINDX 表空间中的空白空间百分比小于 90% 时,正在评估的 ILM 策略触发 ADO 操作以将索引移动到 LOW_COST_STORE_INDX 表空间。
Index altered.
在数据字典视图中显示策略。
Enter password:
Connected.
SQL> SELECT policy_name, action_type, scope,
tier_tablespace "TIER_TBS"
FROM user_ilmdatamovementpolicies
ORDER BY policy_name;
POLI ACTION_TYPE SCOPE TIER_TBS
---- ----------- ------- --------------------
P2 STORAGE SEGMENT LOW_COST_STORE_INDX
第 4 步:测试存储分层 ADO 策略 将行插入 HR.EMP 直到插入的索引条目将 ADOTBSINDX 表空间中的空白空间百分比提高到小于 90%。
SELECT employee_id*101, first_name,last_name, email,
phone_number, hire_date, job_id, salary, commission_pct,
manager_id, department_id
FROM hr.emp;
428 rows created.
SQL> INSERT INTO hr.emp
SELECT employee_id+436926 , first_name,last_name, email,
phone_number, hire_date, job_id, salary, commission_pct,
manager_id, department_id
FROM hr.emp;
856 rows created.
SQL> COMMIT;
Commit complete.
SQL> SELECT /* + RULE */ df.tablespace_name "Tablespace",
df.bytes / (1024 * 1024) "Size (MB)",
SUM(fs.bytes) / (1024 * 1024) "Free (MB)",
Nvl(Round(SUM(fs.bytes) * 100 / df.bytes),1) "% Free",
Round((df.bytes - SUM(fs.bytes)) * 100 / df.bytes) "% Used"
FROM dba_free_space fs, (SELECT tablespace_name,SUM(bytes) bytes
FROM dba_data_files
GROUP BY tablespace_name) df
WHERE fs.tablespace_name (+) = df.tablespace_name
GROUP BY df.tablespace_name,df.bytes
ORDER BY 4;
Tablespace Size (MB) Free (MB) % Free % Used
------------------------------ ---------- ---------- ---------- ----------
SYSTEM 310 11.625 4 96
SYSAUX 450 25.4375 6 94
USERS 671.25 37.8125 6 94
TBS_FOR_ADO 4 1.25 31 69
ADOTBSINDX 2 .875 44 56
UNDOTBS1 250 210.75 84 16
LOW_COST_STORE_INDX 100 99 99 1
7 rows selected.
插入的索引条目将 ADOTBSINDX 表空间中的空白空间百分比提高到低于 90%。
显示现在存储 HR.EMP 表的主键索引的表空间。 索引是否移动到 LOW_COST_STORE_INDX 表空间?
TABLESPACE_NAME INDEX_NAME OWNER
-------------------- -------------------- ----------
ADOTBSINDX PK_EMPLOYEE_ID HR
尽管 ADOTBSINDX 表空间中的空白空间百分比低于 90%,但索引尚未移动到其他表空间。
移动段的 ADO 决定还取决于在数据库级别为所有用户定义的表空间定义的默认阈值。
将 TBS_PERCENT_FREE 阈值设置为 90% ,将 TBS_PERCENT_USED 阈值设置为 30% 。
Enter password:
Connected.
SQL> COL name FORMAT A40
SQL> SELECT * FROM dba_ilmparameters;
NAME VALUE
---------------------------------------- ----------
ENABLED 1
RETENTION TIME 30
JOB LIMIT 2
EXECUTION MODE 2
EXECUTION INTERVAL 15
TBS PERCENT USED 85
TBS PERCENT FREE 25
POLICY TIME 0
8 rows selected.
SQL> EXEC dbms_ilm_admin.customize_ilm(DBMS_ILM_ADMIN.TBS_PERCENT_FREE,90)
PL/SQL procedure successfully completed.
SQL> EXEC dbms_ilm_admin.customize_ilm(DBMS_ILM_ADMIN.TBS_PERCENT_USED,30)
PL/SQL procedure successfully completed.
SQL> SELECT * FROM dba_ilmparameters;
NAME VALUE
---------------------------------------- ----------
ENABLED 1
RETENTION TIME 30
JOB LIMIT 2
EXECUTION MODE 2
EXECUTION INTERVAL 15
TBS PERCENT USED 30
TBS PERCENT FREE 90
POLICY TIME 0
8 rows selected.
此外,指定应使用秒(而不是天)来快速测试 ADO 策略评估,而不是等待策略持续时间。
PL/SQL procedure successfully completed.
SQL> SELECT * FROM dba_ilmparameters;
NAME VALUE
---------------------------------------- ----------
ENABLED 1
RETENTION TIME 30
JOB LIMIT 2
EXECUTION MODE 2
EXECUTION INTERVAL 15
TBS PERCENT USED 30
TBS PERCENT FREE 90
POLICY TIME 1
8 rows selected.
出于练习的目的,您不会等待维护窗口打开来触发 ADO 策略作业。 相反,您将执行以下命令和 PL/SQL 块,以 ADO 策略所有者 HR 的身份连接。
Enter password:
Connected.
SQL> ALTER SESSION SET nls_date_format='dd-mon-yy hh:mi:ss';
Session altered.
SQL> DECLARE
v_executionid number;
BEGIN
dbms_ilm.execute_ILM (ILM_SCOPE => dbms_ilm.SCOPE_SCHEMA,
execution_mode => dbms_ilm.ilm_execution_offline,
task_id => v_executionid);
END;
/
PL/SQL procedure successfully completed.
再次检查索引是否已移至 LOW_COST_STORE_INDX 表空间。
SQL> COL object_name FORMAT A14
SQL> COL selected_for_execution FORMAT A28
SQL> COL job_name FORMAT A9
SQL> SELECT OBJECT_TYPE, OBJECT_NAME, SELECTED_FOR_EXECUTION, JOB_NAME
FROM user_ilmevaluationdetails;
OBJECT_TYP OBJECT_NAME SELECTED_FOR_EXECUTION JOB_NAME
---------- -------------- ---------------------------- ---------
INDEX PK_EMPLOYEE_ID SELECTED FOR EXECUTION ILMJOB100
SQL> SELECT task_id, job_name, job_state FROM user_ilmresults;
TASK_ID JOB_NAME JOB_STATE
------- ---------- -----------------------------------
1 ILMJOB100 COMPLETED SUCCESSFULLY
显示现在存储 HR.EMP 表的主键索引的表空间。 它是否已移至 LOW_COST_STORE_INDX 表空间?
TABLESPACE_NAME INDEX_NAME OWNER
-------------------- -------------------- ----------
LOW_COST_STORE_INDX PK_EMPLOYEE_ID HR
索引已移动到另一个表空间。
第 5 步:删除 ADO 策略 删除索引上的 ADO 策略。
Enter password:
Connected.
SQL> ALTER INDEX hr.pk_employee_id ILM DELETE POLICY p2;
Index altered.
停止热图统计数据收集并清理所有热图统计数据。
Connected.
SQL> ALTER SYSTEM SET heat_map=off SCOPE=BOTH;
System altered.
SQL> EXEC dbms_ilm_admin.clear_heat_map_all
PL/SQL procedure successfully completed.
SQL> EXIT
Speak Your Mind