admin 发表于 2021-9-28 11:23:23

segment advisor

1.段指导需要的权限
对数据库进行空间分析,主要是看表和索引的碎片回收率,建议使用oracle的段指导,如果不是sysdba,则需要授权,或者直接使用sys用户
grant advisor to zhyu;2.自动段指导是否开启
自动维护任务使用默认的窗口和调度,如果开启,可以直接查询分析过的任务
select client_name,window_group ,status from dba_autotask_client;

CLIENT_NAME                               WINDOW_GROUP            STATUS
----------------------                   ------------------ ------------------------------ --------
auto optimizer stats collection      ORA$AT_WGRP_OS         ENABLED
auto space advisor                         ORA$AT_WGRP_SA         ENABLED
sql tuning advisor                        ORA$AT_WGRP_SQ         ENABLED
指导任务可以针对以下类型进行操作
select * from dba_advisor_definitions;

ADVISOR_ID ADVISOR_NAME                     PROPERTY
---------- ------------------------------ ----------
         1 ADDM                                    1
         2 SQL Access Advisor                         303
         3 Undo Advisor                            1
         4 SQL Tuning Advisor                         935
         5 Segment Advisor                        67
         6 SQL Workload Manager                  0
         7 Tune MView                                  31
         8 SQL Performance Analyzer               935
         9 SQL Repair Advisor                         679
      10 Compression Advisor                           3
      11 SPM Evolve Advisor                         935
      12 Statistics Advisor                         935
3.手动运行段指导
对单表或者多表做段分析
如果是多个表,则相应添加dbms_advisor.create_object行修改对应得表名就可以了。
DECLARE

taskname varchar2(100);
taskdesc varchar2(128);
task_id number;
object_id number;
timeLimit varchar2(25);
numDaysToRetain varchar2(25);
objectName varchar2(100);
objectType varchar2(100);

BEGIN
taskname := 'SEGMENTADV_01';
taskdesc :='SEGMENTADV';
numDaysToRetain :='30';
dbms_advisor.create_task('Segment Advisor',taskname,taskdesc,NULL);
dbms_advisor.create_object( task_name => taskname, object_type => 'TABLE', attr1 => 'ZHYU', attr2 => 'OBJS', attr3 => ' ', attr4 => NULL, attr5 => NULL,object_id => object_id);
dbms_advisor.set_task_parameter(taskname, 'RECOMMEND_ALL', 'TRUE');
dbms_advisor.set_task_parameter(taskname, 'DAYS_TO_EXPIRE', numDaysToRetain);
END;

DECLARE
taskname varchar2(100);
BEGIN
taskname := 'SEGMENTADV_01';
dbms_advisor.reset_task(taskname);
dbms_advisor.execute_task(taskname);
END;对表空间进行段分析
如果是多个表空间,则相应添加dbms_advisor.create_object行修改对应得表空间名就可以了。
DECLARE
    taskname varchar2(100);
    taskdesc varchar2(128);
    task_id number;
    object_id number;
    timeLimit varchar2(25);
    numDaysToRetain varchar2(25);
    objectName varchar2(100);
    objectType varchar2(100);

BEGIN
    taskname := 'SEGMENTADV02';
    taskdesc := 'SEGMENTADV';
    numDaysToRetain :='30';
    dbms_advisor.create_task('Segment Advisor',taskname,taskdesc,NULL);
    dbms_advisor.create_object( task_name => taskname, object_type => 'TABLESPACE', attr1 => 'TBS_PIS_DATA01', attr2 => 'NULL', attr3 => NULL, attr4 => NULL, attr5 => NULL, object_id => object_id);
    dbms_advisor.set_task_parameter(taskname, 'RECOMMEND_ALL', 'TRUE');
    dbms_advisor.execute_task(taskname);
END;

4.查询运行状态
set lines 200
col DESCRIPTION for a50
SELECT TASK_NAME,
      DESCRIPTION,
      STATUS,
      EXECUTION_START,
      EXECUTION_START
FROM DBA_ADVISOR_TASKS
WHERE ADVISOR_NAME = 'Segment Advisor'
ORDER BY 4 DESC;5.查询任务结果
dba_advisor_xxx 视图保存了结果;dba_advisor_tasks可以查看task的状态,确定其是否完成;dba_advisor_findings
一个更好的办法是使用
DBMS_SPACE.ASA_RECOMMENDATIONS
SELECT
      'Segment Advice --------------------------'
                || CHR(10)
                || 'TABLESPACE_NAME: '
                || tablespace_name
                || CHR(10)
                || 'SEGMENT_OWNER    : '
                || segment_owner
                || CHR(10)
                || 'SEGMENT_NAME   : '
                || segment_name
                || CHR(10)
                || 'ALLOCATED_SPACE: '
                || allocated_space
                || CHR(10)
                || 'RECLAIMABLE_SPACE: '
                || reclaimable_space
                || CHR(10)
                || 'RECOMMENDATIONS: '
                || recommendations
                || CHR(10)
                || 'SOLUTION 1       : '
                || c1
                || CHR(10)
                || 'SOLUTION 2       : '
                || c2
                || CHR(10)
                || 'SOLUTION 3       : '
                || c3 Advice
FROM
      TABLE(dbms_space.asa_recommendations('TRUE', 'TRUE', 'FALSE'));SET TERMOUT   OFF
SET ECHO      OFF
SET FEEDBACK    OFF
SET HEADING   ON
SET LINESIZE    200
SET PAGESIZE    3000
SET TIMING      OFF
SET TRIMSPOOL   ON
SET VERIFY      OFF
CLEAR COLUMNS BREAKS COMPUTES
CLEAR COLUMNS BREAKS COMPUTES

col tablespace_name format a30 heading 'ts_name'
col segment_owner format a30 heading 'seg_owner'
col segment_name format a30 heading 'seg_name'
col allocated_space for 999,999,999,999 heading 'allo_mb'
col reclaimable_space for 999,999,999,999 heading 'used_mb'
col reclaimable_space for 999,999,999,999 heading 'recl_mb'

BREAK ON report
COMPUTE sum OF allo_mbON report
COMPUTE sum OF recl_mbON report

SELECT
tablespace_name
,segment_owner
,segment_name
,setment_type
,round(allocated_space/1024/1024,0) allo_mb
,roud(used_space/1024/1024,0) used_mb
,round(reclaimable_space/1024/1024,0) recl_mb
FROM
TABLE(dbms_space.asa_recommendations('TRUE', 'TRUE', 'FALSE'));set markup html on spool on
SPOOL ADVISOR.HTML
set pagesize 200
set echo on

select af.task_name, ao.attr2 segname, ao.attr3 partition, ao.type, af.message
from dba_advisor_findings af, dba_advisor_objects ao
where ao.task_id = af.task_id
and ao.object_id = af.object_id;

select tablespace_name, segment_name, segment_type, partition_name,
recommendations, c1 from
table(dbms_space.asa_recommendations('FALSE', 'FALSE', 'FALSE'));

spool off
set markup html off spool off
7.执行段指导时,会不停重复这两个sql_id
SQL> select sid,serial#,sql_id,program,event,blocking_session from v$session where sid=2653;
      2653      43327 7wgks43wrjtrz sqlplus@p0-cnpic-db1 (TNS V1-V3)                     db file sequential read

Elapsed: 00:00:00.00
SQL> /
      2653      43327 8szmwam7fysa3 sqlplus@p0-cnpic-db1 (TNS V1-V3)                     gc cr request

SQL> select sql_fulltext from v$sql where sql_id='&sql_id';
Enter value for sql_id: 8szmwam7fysa3
old   1: select sql_fulltext from v$sql where sql_id='&sql_id'
new   1: select sql_fulltext from v$sql where sql_id='8szmwam7fysa3'
insert into wri$_adv_objspace_trend_data select timepoint,space_usage, space_a
lloc, quality fromtable(dbms_space.object_growth_trend(:1, :2, :3, :4, NULL, N
ULL,NULL, 'FALSE', :5, 'FALSE'))

SQL> select sql_fulltext from v$sql where sql_id='&sql_id';
Enter value for sql_id: 7wgks43wrjtrz
old   1: select sql_fulltext from v$sql where sql_id='&sql_id'
new   1: select sql_fulltext from v$sql where sql_id='7wgks43wrjtrz'
SELECT U.SPACE_USED, U.SPACE_ALLOCATED FROM TABLE(DBMS_SPACE.OBJECT_SPACE_USAGE_
TBF( :B1 , :B2 , :B3 , 0, :B4 , 'TRUE', :B5 )) U

admin 发表于 2024-4-20 15:22:53

#!/bin/bash

# 查询所有非系统表空间
TABLESPACES=$(sqlplus -s / as sysdba<<EOF
set heading off
set feedback off
set pages 2000
select tablespace_name from dba_tablespaces where contents='PERMANENT' and tablespace_name not in ('SYSTEM', 'SYSAUX');
exit
EOF
)

# 循环处理每个表空间
for TABLESPACE in $TABLESPACES; do
    # 创建任务名称和描述
    TASK_NAME="SEGMENTADV_${TABLESPACE}"
    TASK_DESC="SEGMENTADV for tablespace ${TABLESPACE}"

    # 创建任务
    echo "$(date +'%Y%m%d %H:%M:%S')"
    echo "Creating task: $TASK_NAME"
    sqlplus -s / as sysdba<<EOF
    set heading off
    set feedback off
    DECLARE
      task_id number;
    BEGIN
      dbms_advisor.create_task('Segment Advisor', '$TASK_NAME', '$TASK_DESC', NULL);
      dbms_advisor.create_object( task_name => '$TASK_NAME', object_type => 'TABLESPACE', attr1 => '$TABLESPACE', attr2 => NULL, attr3 => NULL, attr4 => NULL, attr5 => NULL, object_id => NULL);
      dbms_advisor.set_task_parameter('$TASK_NAME', 'RECOMMEND_ALL', 'TRUE');
      dbms_advisor.execute_task('$TASK_NAME');
    END;
    /
    exit
EOF
    echo "Completed task: $TASK_NAME"
done

页: [1]
查看完整版本: segment advisor