Chinaunix首页 | 论坛 | 博客
  • 博客访问: 572444
  • 博文数量: 107
  • 博客积分: 4406
  • 博客等级: 上校
  • 技术积分: 1279
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-07 16:20
文章分类

全部博文(107)

文章存档

2014年(4)

2012年(4)

2011年(16)

2010年(7)

2009年(7)

2008年(11)

2007年(49)

2006年(9)

分类: Oracle

2007-09-12 14:45:24

11g新特性:SQL Performance Analyzer(SPA)
 

系统变更会影响SQL的执行计划,比如数据库升级,优化参数调整,表结构变更,索引维护(创建,删除,重建),统计信息收集等,Oracle为了预防系统变更所引起的不良后果,特推出SPA,SPA做为RAT(Real Application Test)的一部分,可以消除一些不知预知的错误,Oracle提供dbms_sqlpa包来实现系统变更前后的性能分析,SPA主要应用在以上方面:


■ Database upgrade
■ Configuration changes to the operating system, hardware, or database
■ Database initialization parameter changes
■ Schema changes, for example, adding new indexes or materialized views
■ Gathering optimizer statistics
■ SQL tuning actions, for example, creating SQL profiles
1 使用SPA的前提条件
由于数据库的复杂性,如果想使用SPA来度量生产库变更对性能影响的话,测试环境的软硬件配置需要与生产环境是一致的,同样DB的初始化参数等也要求与产品库是一致的,可以用RMAN,DATA PUMP等工具创建测试环境。
2 导入负载到测试环境
把生产库上需要测试的SQL装载到SQL Tuning Set(STS),然后导出STS到测试环境。
3 创建SPA TASK
declare
VAR v_spa_name VARCHAR2(100);
begin
:t_name := DBMS_SQLPA.CREATE_ANALYSIS_TASK(
sqlset_name => 'my_sts',
task_name => 'my_spa_task');
end;
4 变更前执行SPA TASK
EXEC DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(
task_name => 'my_spa_task', -
execution_type => 'TEST EXECUTE', -
execution_name => 'my_exec_BEFORE_change');
5 执行变更
比如修改优化参数&添加或删除索引&收集表与索引的统计信息等
6 变更后执行SPA TASK
EXEC DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(
task_name => 'my_spa_task', -
execution_type => 'TEST EXECUTE', -
execution_name => 'my_exec_AFTER_change');
7 比较SQL性能
EXEC DBMS_SQLPA.EXECUTE_ANALYSIS_TASK(
task_name => 'my_spa_task', -
execution_type => 'COMPARE PERFORMANCE', -
execution_name => 'my_exec_compare', -
execution_params => dbms_advisor.arglist('comparison_metric', 'buffer_gets'));
8 报告SPA分析结果
VAR rep CLOB;
EXEC :rep := DBMS_SQLPA.REPORT_ANALYSIS_TASK('my_spa_task','text', 'typical', 'summary');
SET LONG 100000 LONGCHUNKSIZE 100000 LINESIZE 130
PRINT :rep

SPA工作流程图

11g新特性:Automatic SQL Tuning Advisor

在11g中,优化器有两种模式:普通模式与调化模式。优化器在普通模式下,当SQL被执行时,查询优化器将生成SQL的执行计划,如果SQL的可选路径很多,优化器必须是限制时间内,选择一个合适的执行计划;当优化器在调优模式下,优化器需要执行额外的分析去判断优化器在普通模式下产生的执行计划是否有可能被改进,此时优化器输出的不是一个执行计划,而是一系列的动作,根据调优的原理、产生一个更优化的执行计划,优化器需发花费一定的时间去调优单个的sql,自动调优的优化器每次查询都是硬解析。


The Automatic Tuning Optimizer performs four types of tuning analysis:
■ Statistics Analysis
■ SQL Profiling
■ Access Path Analysis
■ SQL Structure Analysis


1 Automatic SQL Tuning Advisor
A 从AWR报表中识别High-Load SQL
B 调用SQL Tuning Advisor调优识别的High-Load SQL
C 执行SQL测试它的SQL Profile


2 Enabling Automatic SQL Tuning
BEGIN
DBMS_AUTO_TASK_ADMIN.ENABLE(
client_name => 'sql tuning advisor',
operation => NULL,
window_name => NULL);
END;
/


3 Disabling Automatic SQL Tuning
BEGIN
DBMS_AUTO_TASK_ADMIN.DISABLE(
client_name => 'sql tuning advisor',
operation => NULL,
window_name => NULL);
END;
/


4 Configuring Automatic SQL Tuning
BEGIN
DBMS_SQLTUNE.SET_TUNING_TASK_PARAMETER(
task_name => 'SYS_AUTO_SQL_TUNING_TASK',
parameter => 'ACCEPT_SQL_PROFILES',
value => 'TRUE');
END;
/

说明:sys_auto_sql_tuning_task是系统产生的auto task.


5 查看tuning report
SQL> set long 1000
SQL> set longchunksize 1000
SQL> set linesize 100
SQL> select dbms_sqltune.report_tuning_task('SYS_AUTO_SQL_TUNING_TASK') from dual;

6 Automatic SQL Tuning Directory
SQL> select task_id,task_name from dba_advisor_tasks where task_id = 1;
TASK_ID TASK_NAME
---------- ------------------------------------------------------------
1 SYS_AUTO_SQL_TUNING_TASK
SQL> select task_id,name,value from WRI$_ADV_PARAMETERS where task_id = 1;

7 注意事项

由于Automatic SQL Tuning Advisor是从AWR中识别 High-Load SQL,所以它不可能是实时地去工作。。。

11g新特性:database replay workload capture的限制

在11g中,Real Application Testing(RAT)是一个独立的收费选项,所以当我们需要订购此项服务时,我们该了解该服务有那些限制,否则付了钱,发现有许多地方存在或多或少的冲突,有些冲突的消除可能要花费更大的成本,所以在上项目前,可行性技术研究是必不可少的,如果想使用RAT,需要关注现有的数据库系统是否涉及到如下技术:


Workload Capture Restrictions:
■ Direct path load of data from external files using utilities such as SQL*Loader
■ Shared server requests (Oracle MTS)
■ Oracle Streams
■ Advanced replication streams
■ Non-PL/SQL based Advanced Queuing (AQ)
■ Flashback queries
■ Oracle Call Interface (OCI) based object navigations
■ Non SQL-based object access
■ Distributed transactions (any distributed transactions that are captured will bereplayed as local transactions)
■ Remote DESCRIBE and COMMIT operations

11g新特性:SQL Management Base(SMB)

在Oracle 11g,SMB是SPM的控制端,SMB是数据字典的一部分,SMB存储在sysaux表空间,SMB存储SQL语句日志,Plan Histories,以及SQL Profiles等,SMB允许每周清除一次未使用的SQL Plan & Log,SMB已经配置了自动存储空间管理。


1 Disk Space Usage
SMB默认可以使用sysaux表空间的10%,SMB被允许使用sysaux的存储范围是1%-50%,每周有后台进程来测量SMB使用sysaux的空间,如果SMB超过了允许的范围,就会在al*.log中写入一条警告,可以通过dbms_spm的configure过程设置SMB允许使用存储空间的范围。
BEGIN
DBMS_SPM.CONFIGURE('space_budget_percent', 30);
END;
/
2 Purging Policy
也可以通过dbms_spm的configure过程设置SMB清除策略:
BEGIN
DBMS_SPM.CONFIGURE('plan_retention_weeks', 105);
END;
/
3 SMB Configuration Parameters
可以通过DBA_SQL_MANAGEMENT_CONFIG视图来查看配置参数
select parameter_name, parameter_value from dba_sql_management_config;
4 创建stage表
BEGIN
DBMS_SPM.CREATE_STGTAB_BASELINE(table_name => 'stage1');
END;
/
5 打包需要导出的数据
DECLARE
my_plans number;
BEGIN
my_plans := DBMS_SPM.PACK_STGTAB_BASELINE(
table_name => 'stage1',
enabled => 'yes',
creator => 'dba1');
END;
/
6 用exp或expdp导出stage表。
7 用imp或impdb导入stage表
8 把导出的SQL Plan Baselines导入字典中
DECLARE
my_plans number;
BEGIN
my_plans := DBMS_SPM.UNPACK_STGTAB_BASELINE(
table_name => 'stage1',
fixed => 'yes');
END;
/

11g新特性:SQL Plan Management(SPM)
 

在11g,oracle提供dbms_spm包来管理SQL Plan,SPM是一个预防机制,它记录并评估sql的执行计划,将已知的高效的sql执行计划建立为SQL Plan Baselines,SQL Plan Baseline的功能是保持SQL的性能而不必关注系统的改变。


1 Capturing SQL Plan Baselines
在SQL Plan BaseLines捕获阶段,Oracle记录SQL的执行计划并检测该执行计划是否已经改变,如果SQL改变后的执行计划是安全的,则SQL就使用新的执行计划,因此,Oracle维护单个SQL执行计划的历史信息,Oracle维护的SQL执行计划的历史仅仅针对重复执行的SQL,SQL Plan Baseline可以手工load,也可以设置为自动捕获。
A Automatic Plan Capture
如果要激活自动的SQL Plan Capture,则需要设置OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES,该参数默认为False,如果设置为True,则表示海底捞月活自动捕获SQL Plan,则系统会自动创建并维护SQL Plan History,SQL Plan History包括优化器关注的:比如an execution plan, SQL text, outline, bind variables, and compilation environment。
B Manual Plan Loading
也可以手动装载一个存在的SQL Plan作为SQL Plan Baseline,手动装装的SQL Plan并不校验它的性能:
--从SQL Tuning Set中装载:
DECLARE
my_plans pls_integer;
BEGIN
my_plans := DBMS_SPM.LOAD_PLANS_FROM_SQLSET(sqlset_name => 'tset1');
END;
/
--从Cursor Cache中装载
DECLARE
my_plans pls_integer;
BEGIN
my_plans := DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE(sql_id => '7qqnad1j615m7');
END;
/
2 Selecting SQL Plan Baselines
在SQL Plan选择阶段,SQL每一次编绎,优化器使用基于成本的方式,建立一下best-cost的执行计划,然后去匹配SQL Plan Baselines中的SQL Plan,如果找到了匹配的SQL Plan,则会使用这个执行计划,如果没有找到匹配的SQL Plan,优化器就会去SQL Plan History中去搜索成本最低的SQL Plan,如果优化器在SQL Plan History中找不到任务匹配的SQL Plan,则该SQL Plan被作为一个Non-Accept Plan被存入SQL Plan History,新的SQL Plan直到它被验证不会引起一下性能问题才会被使用。
--如何激活使用SQL Plan Baselins
SQL> alter system set OPTIMIZER_USE_SQL_PLAN_BASELINES = true;
3 Evolving SQL Plan Baselines
在SQL Plan Baselines的演变阶段,Oracle评估新的Plan的性能并将性能较好的Plan存放SQL Plan Baselines中,可以使用dbms_spm package的过程EVOLVE_SQL_PLAN_BASELINE将新的SQL Plan存入已经存在的SQL Plan Baselines中,新的Plan将会作为已经Accept Plan加入到SQL Plan Baselines中。
SET SERVEROUTPUT ON
SET LONG 10000
DECLARE
report clob;
BEGIN
report := DBMS_SPM.EVOLVE_SQL_PLAN_BASELINE(sql_handle => 'SYS_SQL_593bc74fca8e6738');
DBMS_OUTPUT.PUT_LINE(report);
END;
/
4 相关的数据字典
dba_sqlset_plans
dba_advisor_sqlplans
dba_sql_plan_baselines
5 用dbms_xplan显示SQL Plan
在11g中,Oracle增强了dbms_xplan包的显示功能,不仅可以显示单个sql的执行计划,还可以用来显示sql tuning set,以及sql plan baselines等,在此就仅仅对显示sql plan baselines做测试:
select *
from table(dbms_xplan.display_sql_plan_baseline(sql_handle => '&SYS_SQL_',

11g新特性:Pending Statistics
作者 xzh2000 16:30 | Permalink 静态链接网址 | Comments 最新回复 (0) | Trackback 引用 (0) | 技术交流

从11g开始,表与索引的统计信息收集完毕后,可以选择收集的统信息立即发布,也可以选择使新收集的统计信息处于pending状态,待确定处于pending状态的统计信息是安全的,再使处于pending状态的统计信息发布,这样就会避免一些因为收集统计信息立即发布而导致SQL执行计划走错的灾难。


1 如何判断是否有pending的统计信息需要生效?
SQL> Select dbms_stats.get_prefs('PUBLISH') publish from dual;
PUBLISH
--------------------------
TRUE
dbms_stats的get_prefs函数返回true,表示对象的统计信息收集后立即生效,如果返回flase,收集的统计信息将处于pending状态。
2 如果查看相关的视图
A 立即生效的统计信息可以通过以下字典可以查看
user_tab_stats
user_ind_stats
B pending状态的统计信息可以通过以下字典可以查看
user_tab_pending_stats
user_ind_pending_stats
3 如何设置表或schema的统计信息的publish状态
用dbms_stats的set_table_prefs或者set_schema_prefs过程可以在表级或schema表设置它们的统计信息是否立即生效,当我们设置tmp_test表的统计信息收集后处于pending状态,那该表收集统计信息后,将存放于user_tab_pending_stats字典中。
SQL> Exec dbms_stats.set_table_prefs('yekai','tmp_test','publish','false');
PL/SQL procedure successfully completed.
SQL> select count(*) from user_tab_pending_stats;
COUNT(*)
----------
0
SQL> exec dbms_stats.gather_table_stats('yekai','tmp_test');
PL/SQL procedure successfully completed.
SQL> select count(*) from user_tab_pending_stats;
COUNT(*)
----------
1
4 如何测试并使用处于pending状态的统计信息
在11g,新的参数optimizer_pending_statistics将可以来解决这个问题,当我们在session级设置optimizer_pending_statistics为true时,我们就可以使用存放在user_*_pending_stats字典中的统计信息啦,当我们确保该处于pending状态的统计信息是正确时,我们就可以决定是否使它们立即生效。
SQL> alter session set optimizer_pending_statistics = TRUE;
5 如何发布处于pending状态的统计信息
当测试过统计信息有效后,我们可以选择发布pending状态的统计信息
SQL> exec dbms_stats.publish_pending_stats('yekai','tmp_test');
如果我们不需要该处于pending状态的统计信息,可以选择删除这个pending的统计信息
SQL> exec dbms_stats.publish_pending_stats('yekai','tmp_test');

 

11g新特性:Extended Statistics Collect

在11g中,dbms_stats package提供了组合列的统计信息的收集,如果在where条件中使用了组合列进行查询,则优化器将会得到更准确的统计信息,进而输出执行计划时,可以输出更接近与真实数据的统计结果,11g的Extended Statistics包含了组合列与表达式统计信息的收集,表过式统计信息收集主要是针对函数索引字段,下面就组合列统计信息的收集做一下测试:


SQL> create index idx_object_objtype on tmp_objects(object_type,owner) compute statistics;
Index created.

SQL> select index_name,BLEVEL,LEAF_BLOCKS,DISTINCT_KEYS,CLUSTERING_FACTOR,NUM_ROWS
from user_indexes
where index_name='IDX_OBJECT_OBJTYPE';
INDEX_NAME BLEVEL LEAF_BLOCKS DISTINCT_KEYS CLUSTERING_FACTOR NUM_ROWS
------------------------------ ----------- ------------- ----------------- ----------
IDX_OBJECT_OBJTYPE 2 11240 203 208057 3189632

SQL>select count(*)
from tmp_objects
where owner='SYSTEM' and object_type='TABLE';

--------------------------------------------------------------------------------------
| Id | Operation |Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 15 | 58 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 15 | | |
|* 2 | INDEX RANGE SCAN|IDX_OBJECT_OBJTYPE| 15712 | 230K| 58 (0)| 00:00:01 |
--------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("OBJECT_TYPE"='TABLE' AND "OWNER"='SYSTEM')

Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
33 consistent gets
0 physical reads
0 redo size

SQL> declare
v_name varchar2(30);
begin
v_name := dbms_stats.create_extended_stats('yekai','tmp_objects','(object_type,owner)');
end;

SQL> select dbms_stats.show_extended_stats_name('yekai','tmp_objects','(object_type,owner)') as ex_name
from dual;
EX_NAME
---------------------------------
SYS_STU_UCG1E7VH65UFFJ55F00#FU

SQL> select *
from user_stat_extensions
where table_name='TMP_OBJECTS'

TABLE_NAME EXTENSION_NAME EXTENSION CREATOR DROPPA
------------ -------------------------------- -------------------------------- ------------ ------
TMP_OBJECTS SYS_STU_UCG1E7VH65UFFJ55F00#FU ("OBJECT_TYPE","OWNER") USER YES

SQL> BEGIN
dbms_stats.gather_table_stats(
ownname => 'yekai',
tabname => 'tmp_objects',
method_opt => 'for all columns size skewonly for columns (cust_state_province,country_id) skewonly');
END;

SQL> select e.extension col_group, t.num_distinct, t.histogram
from user_stat_extensions e, user_tab_col_statistics t
where e.extension_name = t.column_name and t.table_name = 'TMP_OBJECTS';

COL_GROUP NUM_DISTINCT HISTOGRAM
------------------------- ------------ ------------------
("OBJECT_TYPE","OWNER") 203 FREQUENCY

SQL>select count(*)
from tmp_objects
where owner='SYSTEM' and object_type='TABLE';

--------------------------------------------------------------------------------------
| Id | Operation |Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 15 | 44 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 15 | | |
|* 2 | INDEX RANGE SCAN|IDX_OBJECT_OBJTYPE| 11673 | 170K| 44 (0)| 00:00:01 |
--------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

2 - access("OBJECT_TYPE"='TABLE' AND "OWNER"='SYSTEM')

Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
33 consistent gets
0 physical reads
0 redo size

说明:请大家对比收集组合列统计信息前后对tmp_objects进行查询的执行计划,你会发现组合列统计信息收集前SQL的Bytes是230k Cost是58,组合列统计信息收集后SQL的Bytes是170k,Cost是44,这就是组合列统计信息的优势。

 

11g新特性:Auto Optimizer Statistics Collection
 

在oracle 10g中,优化统计信息的收集是通过scheduler job来自动完成的,dba可以通过dbms_scheduler package的enable procedure与disable procedure来启动与关闭,在oracle 11g中,oracle提供了全新的package dbms_auto_task_admin来完成统计信息的收集工作,测试脚本如下所示:


启动:

BEGIN
DBMS_AUTO_TASK_ADMIN.ENABLE(
client_name => 'auto optimizer stats collection',
operation => NULL,
window_name => NULL);
END;
/

关闭:

BEGIN
DBMS_AUTO_TASK_ADMIN.DISABLE(
client_name => 'auto optimizer stats collection',
operation => NULL,
window_name => NULL);
END;


 

11g新特性:常驻连接池DRCP之一

在oracle中,进程的频繁创建是一个比较消耗资源的开消,在11g之前,oracle提供专用器进程与共享服务器进程供用户选择适合自己的进程机制,在11g中,oracle又推出DRCP(database resident connection pool),类似于sqlrelay那种轻量级中间件的进程机制为客户服务,DRCP适用于web application(比如php/apache),可以提供成千上万的连接,使用DRCP可以共享主机资源。


一 什么时间使用DRCP
1 使用较小内存的、大量的客户端连接
2 客户端应用是相似的,可以共享或重用会话
3 客户端占用数据库连接的周期相当短
4 会话不需要跨客户请求
5 客户端有众多的主机与进程

二 Dedicated Servers,Shared Servers与DRCP的区别

11g新特性:常驻连接池DRCP之二
 

三Dedicated Servers,Shared Servers与DRCP的内存需求
一般情况下,由于每个会话需要消耗400k的内存,每个进程需要消耗4m的内存,现在我们以DRCP的pool size是100,shared server的shared server进程是100为例,假如有5000个客户端连接到这些环境,则这些主机的内存分配如下:
A Dedicated Server
Memory used = 5000 X (400 KB + 4 MB) = 22 GB
B Shared Server
Memory used = 5000 X 400 KB + 100 X 4 MB = 2.5 GB
Out of the 2.5 GB, 2 GB is allocated from the SGA.
C Database Resident Connection Pooling
Memory used = 100 X (400 KB + 4 MB) + (5000 X 35KB)= 615 MB


四 使用DRCP时,当实例有活动pooled server,有以下限制:
1 不能shutdown database;
2 不能停掉DRCP;
3 不能用database link连接到不同实例的DRCP;
4 不能使用Advanced Security Option (ASO),比如encryption等

11g新特性:常驻连接池DRCP之三

五 如何在DB中配置DRCP?
在11g中,系统默认包含了一个连接池:SYS_DEFAULT_CONNECTION_POOL,这个池默认被创建,但默认该池是不启动的,如果要启动默认的连接池,必须显式地执行启动DRCP的命令,oracle提供dbms_connection_pool package来执行这个工作,如果连接池被显式地启动,必须显式地被停掉,当实例宕掉时,如果DRCP是活动的,则实例启动时,DRCP也将自动实动。
启动DRCP需要以下步骤:
A 用sysdba权限连接到sqlplus
B 执行exec dbms_connection_pool.start_pool();
C 查看DRCP的状态


六 客户端如何连接到DRCP?
如果是专用服务器连接,则SERVER=DEDICATED,如果是DRCP连接,则SEVER=POOLED。如果在tnsnames.ora中指定了SERVER=POOLED,但并没有在实例中启动DRCP,则当客户请求连接时,DB会报ORA-12520错误。如果要指定客户端请求到DRCP,则客户端的tnsnames.ora中的连接字符串必须指定连接类型是POOLED,配置方式如下所示:
dhcp11g =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.5.26)(PORT = 1521))
(CONNECT_DATA =
(SERVER = POOLED)
(SERVICE_NAME = dbtest)
)
)

说明:11g的客户端才可以使用DRCP,如果10g的客户端在tnsnames.ora中指定了SERVER=POOLED,则连接时报ORA-56606。

六 如何在DB中掉停DRCP
A 用sysdba权限连接到sqlplus
B 执行exec dbms_connection_pool.stop_pool();

七 如何调整DRCP的配置?
DRCP启动时使用的是默认配置参数,如果要调整DRCP的配置参数,需要调用dbms_connection_pool包的configure_pool过程去调整DHCP的高级选项,也可以调用dbms_connection_pool包的alter_param过程只仅改指定的参数而不影响其它的参数,DRCP可调整的参数可以查看dba_cpool_info表,每个参数的具体含义请自己查阅administrator guide手册的p128/129页,具体的语法如下所示:
SQL> exec print_table('select * from dba_cpool_info');
CONNECTION_POOL : SYS_DEFAULT_CONNECTION_POOL
STATUS : ACTIVE
MINSIZE : 4
MAXSIZE : 40
INCRSIZE : 2
SESSION_CACHED_CURSORS : 20
INACTIVITY_TIMEOUT : 300
MAX_THINK_TIME : 120
MAX_USE_SESSION : 500000
MAX_LIFETIME_SESSION : 86400
-----------------
SQL> exec dbms_connection_pool.alter_param ('','minsize','10');
PL/SQL procedure successfully completed.
SQL> exec print_table('select * from dba_cpool_info');
CONNECTION_POOL : SYS_DEFAULT_CONNECTION_POOL
STATUS : ACTIVE
MINSIZE : 10
MAXSIZE : 40
INCRSIZE : 2
SESSION_CACHED_CURSORS : 20
INACTIVITY_TIMEOUT : 300
MAX_THINK_TIME : 120
MAX_USE_SESSION : 500000
MAX_LIFETIME_SESSION : 86400
-----------------
PL/SQL procedure successfully completed.

八 如何恢复DHCP的默认选项
A 用sysdba权限连接到sqlplus
B 执行exec dbms_connection_pool.restore_defaults;

九 关于DHCP相关的字典
dba_cpool_info
v$cpool_stats
v$cpool_cc_stats

十 测试DHCP的总结
在实际的使用,如果要使用DHCP,则需要注意在tnsnames.ora中创建两个TNS连接字符串,将前台短的连接都指向DHCP连接,把后台长的连接则向DEDICATED SERVER连接,这样就可以满足一般轻量权的web application.

11g新特性:database replay

在11g中,很多功能oracle都引导用户通过OEM来操作,但喜欢用API的dba,照样可以写脚本来完成自己的工作,下面给大家介绍一下database replay的配置方法,database replay可以捕捉整个数据库的负载,并且传递到需要进行测试数据库上,然后重演负载以测试系统调优后的效果,当然也可以为升级硬件进行压力测试。


A 创建目录
create directory sqlplay as /home/oracle11g/worksh/sqlplay';
B 启动捕获进程
SQL> BEGIN
2 DBMS_WORKLOAD_CAPTURE.START_CAPTURE (
3 name => 'capture_by_yekai',
4 dir => 'sqlplay',
5 duration => 600);
6 END;
7 /
BEGIN
*
ERROR at line 1:
ORA-20222: Invalid DB State or Input. Input "sqlplay" is not a valid DIRECTORY object!
ORA-06512: at "SYS.DBMS_WORKLOAD_CAPTURE", line 783
ORA-06512: at line 2

说明:这个地方dir参数必须是大写的,否则将会报错。

SQL> BEGIN
2 DBMS_WORKLOAD_CAPTURE.START_CAPTURE (
3 name => 'capture_by_yekai',
4 dir => 'SQLPLAY',
5 duration => 600);
6 END;
7 /
PL/SQL procedure successfully completed.

C 如果在启动捕获进程时,没有指定duration的话,将必须调用finish_capture过程结束捕获workload.
BEGIN
DBMS_WORKLOAD_CAPTURE.FINISH_CAPTURE();
END;
/

D 监控database replay的捕获情况
select * from DBA_WORKLOAD_CAPTURES;

E 处理捕获信息
SQL> BEGIN
2 DBMS_WORKLOAD_REPLAY.PROCESS_CAPTURE (
3 capture_dir => 'SQLPLAY');
4 END;
5 /
PL/SQL procedure successfully completed.

F 创建replay目录
create or replace directory sqlreplay as '/home/oracle/worksh/sqlplay'

说明:在初始化前,需要把捕获在sqlplay目录内的文件都拷贝到新的sqlreplay目录内

G 初始化replay
> BEGIN
2 DBMS_WORKLOAD_REPLAY.INITIALIZE_REPLAY (
3 replay_name => 'replay_by_yekai',
4 replay_dir => 'SQLREPLAY');
5 END;
6 /
PL/SQL procedure successfully completed.

H 进准备重演状态
> BEGIN
2 DBMS_WORKLOAD_REPLAY.PREPARE_REPLAY (synchronization => TRUE);
3 END;
4 /
PL/SQL procedure successfully completed.

I 启动database replay客户端
$wrc system/oracle mode=replay replaydir=./replay

I 执行重演
> BEGIN
2 DBMS_WORKLOAD_REPLAY.START_REPLAY ();
3 END;
4 /
PL/SQL procedure successfully completed.

J 结束重演
> BEGIN
2 DBMS_WORKLOAD_REPLAY.CANCEL_REPLAY ();
3 END;
4 /

D 监控database replay的重演情况
select * from DBA_WORKLOAD_REPLAYS;

11g新特性:全表扫描的变化
 

在oracle 11g以前的版本中,如果对大表进行全表扫描,通过v$session_wait可以看到wait event是:db file scattered read;在11g中,如果对大表进行全表扫描,通过v$session_wait可以看到wait event是:direct path read;也就是说,在11g中,大表全表扫描是将数据块直接读入会话的pga区域。


10g:

[oracle10g@csdba worksh]$ sh list_sql.sh
--------------------------------------------------------------------------
YEKAI(159,235) ospid=5318 hash_value=1577916882 execs=918 els_time=1.04
(TNS V1-V3) disk_reads=0 buffer_gets=43658.46
SELECT COUNT(*) FROM TMP_OBJECTS WHERE OBJECT_ID = :B1
--------------------------------------------------------------------------
|SELECT STATEMENT |----- 1577916882 ----| | | 8609 |
|SORT AGGREGATE | | 1 | 13 | |
| TABLE ACCESS FULL |TMP_OBJECTS | 483 | 6K| 8609 |
--------------------------------------------------------------------------
----------------------------alter system kill session-----------------------
alter system kill session '159,235';
[oracle10g@csdba worksh]$ sh list_sql.sh
--------------------------------------------------------------------------
YEKAI(159,235) ospid=5318 hash_value=1577916882 execs=919 els_time=1.04
(TNS V1-V3) disk_reads=0 buffer_gets=43658.52
SELECT COUNT(*) FROM TMP_OBJECTS WHERE OBJECT_ID = :B1
--------------------------------------------------------------------------
|SELECT STATEMENT |----- 1577916882 ----| | | 8609 |
|SORT AGGREGATE | | 1 | 13 | |
| TABLE ACCESS FULL |TMP_OBJECTS | 483 | 6K| 8609 |
--------------------------------------------------------------------------
----------------------------alter system kill session-----------------------

11g:

[oracle11g@csdba worksh]$ sh list_sql.sh
--------------------------------------------------------------------------
YEKAI(137,491) ospid=5324 hash_value=1577916882 execs=719 els_time=1.34
(TNS V1-V3) disk_reads=43713.11 buffer_gets=68684.45
SELECT COUNT(*) FROM TMP_OBJECTS WHERE OBJECT_ID = :B1
--------------------------------------------------------------------------
|SELECT STATEMENT |----- 1577916882 ----| | | 11936 |
|SORT AGGREGATE | | 1 | 13 | |
| TABLE ACCESS FULL |TMP_OBJECTS | 482 | 6K| 11936 |
--------------------------------------------------------------------------
----------------------------alter system kill session-----------------------
alter system kill session '137,491';
[oracle11g@csdba worksh]$ sh list_sql.sh
--------------------------------------------------------------------------
YEKAI(137,491) ospid=5324 hash_value=1577916882 execs=720 els_time=1.34
(TNS V1-V3) disk_reads=43713.2 buffer_gets=68684.58
SELECT COUNT(*) FROM TMP_OBJECTS WHERE OBJECT_ID = :B1
--------------------------------------------------------------------------
|SELECT STATEMENT |----- 1577916882 ----| | | 11936 |
|SORT AGGREGATE | | 1 | 13 | |
| TABLE ACCESS FULL |TMP_OBJECTS | 482 | 6K| 11936 |
--------------------------------------------------------------------------
----------------------------alter system kill session-----------------------

大家看测试,很明显,在11g中,大表全表扫描时数据块不经过sga而直接进pga,就会造成每次进行大表全表扫描,物理读都是很大,而在10g中,由于全表扫描的数据块在sga中已经存在,所以执行全表扫描时,它的物理读为0;这种变迁,体现了oracle在优化策略上的进步,就是假定大表频繁全表扫描这种现象,在产生库上是不常有的,通过把数据直接读入pga,进而减少了cache buffer的繁忙交换程度,提高了cache buffer的使用效率。。。

11g新特性:实时sql监控增强

在11g以前的版本,SQL的运行情况可以通过监控v$session_longops来了解,当某个操作执行时间超过6秒,就会被v$session_longops感知,通常可以监控到比如全表扫描,全索引扫描,哈希联接,并行查询等;在11g中,当sql并行运行时,马上会被real-time monitor到,当sql单进程运行时,如果运行时间超过5秒,它也会被监控到。


可以通过v$sql_monitor与v$sql_plan_monitor视图查看sql执行的统计信息,可以联合v$active_session_history,v$session,v$session_longops,v$sql, v$sql_plan等视图,查看sql更多的信息。v$sql_monitor收集关键的一些指标,比如:elapsed time, CPU time, number of reads and writes, I/O wait time and various other wait times等,这些信息是每秒刷新一次,当sql执行完比,并不会立即把它从v$sql_monitor中删除,至少保留1分钟,real-time sql monitor也包括收集sql执行计划的统计信息,可以通过v$sql_plan_monitor视图来查看被监控sql的执行计划,这些统计数据也是每秒更新一次,当sql执行完结,它们至少被保留1分钟。
如何生成sql监控报表:
方法一:
variable my_rept CLOB;
BEGIN
:my_rept :=DBMS_SQLTUNE.REPORT_SQL_MONITOR();
END;
/
print :my_rept
方法二:
set long 10000000
set longchunksize 10000000
set linesize 200
select dbms_sqltune.report_sql_monitor from dual;


如何激活或禁止real-time sql monitor?
real-time sql monitor需要statistics_level参数等于all或typical,且CONTROL_MANAGEMENT_PACK_ACCESS参数必须是DIAGNOSTIC+TUNING(默认就是如此),还有两个语句级的hints可以激活或禁止real-time sql monitor:/*+ monitor */与/*+ no_monitor */,这两个参数也必须在CONTROL_MANAGEMENT_PACK_ACCESS参数是DIAGNOSTIC+TUNING下才生效,案例:
强制sql使用实时监控:
select /*+ monitor */ count(*) from test where title = 'abc';
取消sql使用实时监控:
select /*+ no_monitor */ count(*) from test where title = 'abc';

> set long 10000000
> set longchunksize 10000000
> set linesize 200
> select dbms_sqltune.report_sql_monitor from dual;
REPORT_SQL_MONITOR
--------------------------------------------------------------
SQL Monitoring Report

SQL Text
--------------------------------------------------------------
SELECT COUNT(*) FROM TEST WHERE OBJECT_ID = :B1
--------------------------------------------------------------

Global Information
Status : DONE (ALL ROWS)
Instance ID : 1
Session ID : 122
SQL ID : 2ywfyn7r0ywky
SQL Execution ID : 16777216
Plan Hash Value : 1950795681
Execution Started : 08/16/2007 15:48:24
First Refresh Time : 08/16/2007 15:48:28
Last Refresh Time : 08/16/2007 15:48:30

--------------------------------------------------------------------
| Elapsed | Cpu | IO | Other | Fetch | Buffer | Reads |
| Time(s) | Time(s) | Waits(s) | Waits(s) | Calls | Gets | |
--------------------------------------------------------------------
| 4.30 | 1.36 | 0.01 | 2.93 | 1 | 94869 | 94613 |
--------------------------------------------------------------------

SQL Plan Monitoring Details
==================================================================
| Id | Operation | Name | Rows | Cost | Time |
| | | | (Estim) | | Active(s) |
==================================================================
| 0 | SELECT STATEMENT | | | 35310 | 1 |
| 1 | SORT AGGREGATE | | 1 | | 1 |
| 2 | TABLE ACCESS FULL | TEST | 126 | 35310 | 5 |
==================================================================

接上表:
===========================================================
Start | Starts | Rows | Activity | Activity Detail |
Active | | (Actual) | (percent) | (sample #) |
===========================================================
+6 | 1 | 1 | | |
+6 | 1 | 1 | | |
+2 | 1 | 0 | 100.00 | Cpu (5) |
===========================================================

11g在awr report方面,还是增加了一些吸引眼球的地方,比如增加了对OS等主机配置的报告,对于dba来讲,在接手一个新环境时,或做现场服务时,该报表将会简少一些额外的工作,比如报表中已经可以显示主机名,操作系统,CPU个数,物理内存等,最让人关注的还是增加了主机负载的一些情况,具体变化请看下文:


主机方面:
Host Name Platform CPUs Cores Sockets Memory(GB)
----------- ------------------ ---- ----- ------- ----------
log51 Linux IA (32-bit) 4 2 2 3.96

LOAD PROFILE:
Load Profile Per Second Per Trans Per Exec Per Call
~~~~~~~~~~~~ ----------- ---------- --------- --------
DB Time(s): 1.0 6.5 0.11 0.29
DB CPU(s): 1.0 6.4 0.11 0.29
Redo size: 1,059.2 6,813.2
Logical reads: 73,493.3 472,724.2
Block changes: 5.7 36.5
Physical reads: 73,465.3 472,544.3
Physical writes: 0.6 3.7
User calls: 3.4 22.1
Parses: 2.1 13.3
Hard parses: 0.0 0.0
W/A MB processed: 9,217.0 59,285.9
Logons: 0.0 0.1
Executes: 8.9 57.3
Rollbacks: 0.1 0.4
Transactions: 0.2

说明:在load profile section,增加了DB Time(s),DB CPU(s),W/A MB processed,Rollbacks等,当然也去掉了sorts的统计信息,如果想看memery sort与disk sort等情况,需要在Instance Efficiency Percentages部分来观察,Instance Efficiency Percentages section没有原化。

HOST CPU & LOAD AVG:
Host CPU (CPUs: 4 Cores: 2 Sockets: 2)
~~~~~~~~ Load Average
Begin End %User %System %WIO %Idle
--------- --------- --------- --------- --------- ---------
1.01 1.20 14.2 11.6 0.1 74.2

Instance CPU
~~~~~~~~~~~~
% of total CPU for Instance: 25.1
% of busy CPU for Instance: 97.2
%DB time waiting for CPU - Resource Mgr: 0.0

Memory Statistics
~~~~~~~~~~~~~~~~~ Begin End
Host Mem (MB): 4,054.0 4,054.0
SGA use (MB): 600.0 600.0
PGA use (MB): 126.6 126.8
% Host Mem used for SGA+PGA: 17.92 17.92

Operating System Statistics - Detail Snaps: 137-138

Snap Time Load %busy %user %sys %idle %iowait
--------------- -------- -------- -------- -------- -------- --------
16-Aug 08:00:35 1.0 N/A N/A N/A N/A N/A
16-Aug 09:00:37 1.2 25.8 14.2 11.6 0.1 74.2
-------------------------------------------------------------

关于TOP SQL部分,主要按以下方面进行排序:
SQL ordered by Elapsed Time
SQL ordered by CPU Time
SQL ordered by Gets
SQL ordered by Reads
SQL ordered by Executions
SQL ordered by Parse Calls
SQL ordered by Sharable Memory
SQL ordered by Version Count

 

11g新特性:增强的add column

在11g以前的版本中,如果表上存在未提交的事务,则对表进行DDL操作将失败,在11g中,这个限制已经被取消啦,执行ADD COLUMN操作时,并不会受未提交事务的影响,另外,ADD COLUMN还有一个增强,就是在一个非常大的表上执行ADD COLUMN xxx DATATYPE DEFAULT yyy NOT NULL时,它不会再去将默认值更新到表中已经存在的记录,这样改进的好处是非常大的,DBA对表结构的变更将更加容易,而且不会产生大量的library cache lock/pin等,更不会阻塞事务,它是怎么做到的呢?


其实现方法很简单,ORACLE引擎仅仅依赖数据字典中记录的字段的默认值来对新增字段中为空的数据进行解释,比如在test表有1000万的记录,执行alter table TEST add test_add_column number default 1 not null操作,它不会将默认值更新到存在的1000万条记录,当我们进行查询select count(*) from test where test_add_column = 1时,ORACLE引擎扫描到test_add_column存在大量为NULL的记录时,它根据数据字典中记录的test_add_column字段的默认值,将NULL解释为1...

 

 

11g stream新特性列表

从最初学习9iR2的stream,以及10gR1,10gR2的stream,到现在的11gR1,可以说oracle在stream上面压了很大的成钱,stream也越来越得到用户的接受,在11gR1中,stream比之前的版本也有较大的改进,比如同步捕获,合并的捕获与应用进程等,以下就简单地列下新增的功能点,感兴趣的可以自己看文档。。。


1 同步捕获
2 支持xmltype类型的字段
3 数据加密
4 分割与合并复制目标
5 跟踪LCRs的被处理过程
6 比较并聚合共享数据库对象
7 当stream异常时OEM自动报警
8 stream性能顾问
9 stream job使用oracle scheduler
10 通知服务改善
11 合并捕获与应用进程的优化
12 新的错误消息代码

11g新特性:DDL锁超时

在11g中,oracle提供了一个新的可动态调整的参数ddl_lock_timeout,该参数允许存在未提交的事务的表上,执行DDL操作,如果事务在ddl_lock_timeout允许的时间内提交,则DDL操作将会成功,否则就会报ORA-00054错误,如果对该表执行ADD COLUMN操作,则会直接提交表上发生的未提交的事务,所以用11g时,有些东西还是要注意的,当然也不排除这是11g的一个bug哦。。。


11g以前的版本测试如下:
SESSION 1:
16:18:34 SQL> delete from tmp_lg_log where rownum < 2;
1 row deleted.

SESSION 2:
16:21:10 SQL> alter table tmp_lg_log add rn number;
alter table tmp_lg_log add rn number
*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified

11g中测试DDL锁超时:
SESSION 1:
SQL> create table tmp_lg_log (id number,name varchar2(32),rn1 number, rn2 number);
Table created.
SQL> insert into tmp_lg_log values(1,'abc',1,2);
1 row created.

SESSION 2:
SQL> show parameter lock
NAME_COL_PLUS_SHOW_PARAM TYPE VALUE_COL_PLUS_SHOW_PARAM
------------------------- ----------- ---------------------
ddl_lock_timeout integer 0
--修改锁超时时间
SQL> alter system set ddl_lock_timeout=60 scope=both;
System altered.
--执行ddl(drop column)的操作,事务未在60s内提交,所以报timeout错误
SQL> alter table tmp_lg_log drop column rn2;
alter table tmp_lg_log drop column rn2
*
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
--执行ddl(add column)的操作,DDL则立即成功
SQL> alter table tmp_lg_log add rn4 number;
Table altered.

11g新特性:stream同步捕获
 

在测试9iR2,10gR1,10gR2的stream时,非常希望能够有种同步capture的机制,该同步capture机制与log-based real-time capture机制是不同的,它应该是一种内部触发的机制,比如当有活动事务时,DB引擎判断该表配置有stream的同步capture标志,就可以直接把dml打包成LCRs并压入队列...


幸运的是,在10gR1中,已经看到了该功能已经被实现,但通过文档可以看到,oracle建议该功能仅适用于需要复制的表比较少的情况下,也可以理解需要复制的表dml不是很频繁,当然如果是全库进行复制,log-based real-time capture可能更高效一些,毕竟扫描一个500m以上的redo log成本也是很高的.

阅读(5445) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~