MBRC:这里在11g里安装完成后不设置显示为128,但在做10053发现其还是为8;我这里计算为:sreadtim=ioseektim+db_block_size/IOTFRSPEED=10+8192/4096=12mreadtim=ioseektim+mbrc*db_block_size/IOTFRSPEED=10+8*8/4=26查看trace文件:
BASE STATISTICAL INFORMATION
Table Stats::Table: T_KINGDEE_CONSUME_DAY Alias: T_KINGDEE_CONSUME_DAY#Rows: 377547 #Blks: 2656 AvgRowLen: 40.00 ChainCnt: 0.00Index Stats::Index: IX_KINGDEE_CONSUME_DAY_N1 Col#: 2LVLS: 2 #LB: 3743 #DK: 951 LB/K: 3.00 DB/K: 397.00 CLUF: 377547.00Index: PK_T_KINGDEE_CONSUME_DAY Col#: 1 2LVLS: 2 #LB: 2228 #DK: 377547 LB/K: 1.00 DB/K: 1.00 CLUF: 2979.00Access path analysis for T_KINGDEE_CONSUME_DAY
io_cost=#mrds*mreadtim/sreadtime=round(2656/8)*26/12=719
计算cpu_cost
explain plan for select * from T_KINGDEE_CONSUME_DAY;select * from table(dbms_xplan.display());select cpu_cost from plan_table; CPU_COST------ 135954115
cpu_cost=135954115/(3074*12)/1000=3.68整体cost=io_cost+cpu_cost=719+3.7=722.7查看trace文件部分:
SINGLE TABLE ACCESS PATH Single Table Cardinality Estimation for T_KINGDEE_CONSUME_DAY[T_KINGDEE_CONSUME_DAY] Table: T_KINGDEE_CONSUME_DAY Alias: T_KINGDEE_CONSUME_DAYCard: Original: 377547.000000 Rounded: 377547 Computed: 377547.00 Non Adjusted: 377547.00Access Path: TableScanCost: 724.69 Resp: 724.69 Degree: 0Cost_io: 721.00 Cost_cpu: 135954115Resp_io: 721.00 Resp_cpu: 135954115Best:: AccessPath: TableScanCost: 724.69 Degree: 1 Resp: 724.69 Card: 377547.00 Bytes: 0
调整mbrcSQL> alter system set db_file_multiblock_read_count=64 scope=both;查看trace:
SYSTEM STATISTICS INFORMATIONUsing NOWORKLOAD StatsCPUSPEEDNW: 3074 millions instructions/sec (default is 100)IOTFRSPEED: 4096 bytes per millisecond (default is 4096)IOSEEKTIM: 10 milliseconds (default is 10)MBRC: NO VALUE blocks (default is 64)
再次计算成本:
sreadtim=ioseektim+db_block_size/IOTFRSPEED=10+8192/4096=12mreadtim=ioseektim+dbfilemultiblockreadcount * dbblocksize/IOTFRSPEED=10+64 * 8/4=138 io_cost=#mrds*mreadtim/sreadtime=round(2656/64,2)*138/12=477.25cpu cost未变;cost=io_cost+cpu_cost=3.68+477.25=480.93没调整db_file_multiblock_read_count之前为721,调整后下降很多;查看10053结果:
Access path analysis for T_KINGDEE_CONSUME_DAY
SINGLE TABLE ACCESS PATH Single Table Cardinality Estimation for T_KINGDEE_CONSUME_DAY[T_KINGDEE_CONSUME_DAY] Table: T_KINGDEE_CONSUME_DAY Alias: T_KINGDEE_CONSUME_DAYCard: Original: 377547.000000 Rounded: 377547 Computed: 377547.00 Non Adjusted: 377547.00Access Path: TableScanCost: 482.69 Resp: 482.69 Degree: 0Cost_io: 479.00 Cost_cpu: 135954115Resp_io: 479.00 Resp_cpu: 135954115Best:: AccessPath: TableScanCost: 482.69 Degree: 1 Resp: 482.69 Card: 377547.00 Bytes: 0s
查看explain结果:
PLAN_TABLE_OUTPUT--------------------------------------------------------------Plan hash value: 873558201 ----------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |----------------------------------------------------------------------| 0 | SELECT STATEMENT | | 377K| 14M| 483 (1)| 00:00:06 || 1 | TABLE ACCESS FULL| T_KINGDEE_CONSUME_DAY | 377K| 14M| 483 (1)| 00:00:06 |
发现差一点,483-482,但这里计算的比trace里的差1位,这个差距由参数_table_scan_cost_plus_one控制;检查参数:
SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ FROM x$ksppi x,x$ksppcv y WHERE x.inst_id = USERENV (‘Instance‘) AND y.inst_id = USERENV (‘Instance‘) AND x.indx = y.indx AND x.ksppinm LIKE ‘%_table_scan_cost_plus_one%‘;
禁用alter session set "_table_scan_cost_plus_one"=false;
再次查看执行计划:
Plan hash value: 873558201-------------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |-------------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 377K| 14M| 482 (1)| 00:00:06 || 1 | TABLE ACCESS FULL| T_KINGDEE_CONSUME_DAY | 377K| 14M| 482 (1)| 00:00:06 |-------------------------------------------------------------------------------------------
再次调整_table_scan_cost_plus_one为false,后由483降为482;结论:db_file_multiblock_read_count这参数会影响你cost(%cpu)的整个结果;
oracle 10053之mbrc
标签:module operation sre cpu_cost 生成 多个 single mil 部分
小编还为您整理了以下内容,可能对您也有帮助:
如何还原oracle数据库到sjc
一. 10053事件
当一个SQL出现性能问题的时候,可以使用SQL_TRACE 或者 10046事件来跟踪SQL. 通过生成的trace来了解SQL的执行过程。
Oracle SQL Trace 和 10046 事件
htt//blog.csdn.net/tianlesoftware/archive/2010/09/02/5857023.aspx
Event 10053 执行计划 绑定变量 Bind peeking
http//blog.csdn.net/tianlesoftware/archive/2010/04/30/5544307.aspx
Oracle 跟踪事件 set event
http//blog.csdn.net/tianlesoftware/archive/2009/12/13/4977827.aspx
现在来看一下10053事件。10053事件也是非公开的,在官网上也找不到相关信息。 我们在查看一条SQL的执行计划的时候,只能看到CBO 最终告诉我们的执行计划结果,但是不知道CBO 是根据什么来做的。 如果遇到了执行计划失真,如:一个SQL语句,很明显oracle应该使用索引,但是执行计划却没有使用索引。无法进行分析判断。
而10053事件就提供了这样的功能。它产生的trace文件提供了Oracle如何选择执行计划,为什么会得到这样的执行计划信息。
10053事件生成trace文件目录和SQL_TRACE一样。
在Oracle 10g中,SQL_TRACE生成的trace文件默认路劲是$ORACLE_BASE/admin/SID/ump.
在Oracle 11g,trace 默认路径在:$ORACLE_BASE/diag/rdbms/orcl/orcl/trace目录下
对于10053事件的trace文件,我们只能直接阅读原始的trace文件,不能使用tkprof工具来处理,tkprof工具只能用来处理sql_trace 和 10046事件产生的trace文件。
10053事件有两个级别:
Level 2:2级是1级的一个子集,它包含以下内容:
Column statistics
Single Access Paths
Join Costs
Table Joins Considered
Join Methods Considered (NL/MS/HA)
Level 1: 1级比2级更详细,它包含2级的所有内容,在加如下内容:
Parameters used by the optimizer
Index statistics
启用10053事件:
ALTER SESSION SET EVENTS='10053 trace name context forever, level 1';
ALTER SESSION SET EVENTS='10053 trace name context forever, level 2';
关闭10053事件:
ALTER SESSION SET EVENTS '10053 trace name context off';
说明:
(1)sqlplus中打开autotrace看到的执行计划实际上是用explain plan 命令得到的,explain plan 命令不会进行bind peeking。应该通过v$sql_plan查看SQL的真实的执行计划。
(2)10053只对CBO有效,而且如果一个sql语句已经解析过,就不会产生新的trace信息。
二. 示例:
1. 确定当前的trace 文件
1.1 设定trace 文件标识
SQL> alter session set tracefile_identifier='怀宁';
会话已更改。
设置标识的目的就是方便我们查找生成的trace文件。我们只需要在trace目录查找文件名里带有标识的文件即可。
1.2直接用如下SQL直接查出,当前的trace文件名。
/* Formatted on 2010/9/1 23:56:24 (QP5 v5.115.810.9015) */
SELECT d.VALUE
|| '/'
|| LOWER (RTRIM (i.INSTANCE, CHR (0)))
|| '_ora_'
|| p.spid
|| '.trc'
AS "trace_file_name"
FROM (SELECT p.spid
FROM v$mystat m, v$session s, v$process p
WHERE m.statistic# = 1 AND s.SID = m.SID AND p.addr = s.paddr) p,
(SELECT t.INSTANCE
FROM v$thread t, v$parameter v
WHERE v.NAME = 'thread'
AND (v.VALUE = 0 OR t.thread# = TO_NUMBER (v.VALUE))) i,
(SELECT VALUE
FROM v$parameter
WHERE NAME = 'user_mp_dest') d;
2. 启动10053事件
SQL> ALTER SESSION SET EVENTS='10053 trace name context forever, level 1';
3. 执行事务
SQL> select * from all_tables where table_name='T';
4. 关闭10053事件
SQL> ALTER SESSION SET EVENTS '10053 trace name context off';
三. 查看生成的trace文件
因为我们在做之前设置了标识,所以直接进入trace目录,找到含有 ‘怀宁’标识的trace 文件。
Trace file d:/app/administrator/diag/rdbms/orcl/orcl/trace/orcl_ora_3756_怀宁.trc
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Proction
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Windows NT Version V6.1
CPU : 2 - type 586, 2 Physical Cores
Process Affinity : 0x0x00000000
Memory (Avail/Total): Ph:1570M/4095M, Ph+PgF:4126M/8188M, VA:2874M/4095M
Instance name: orcl
Redo thread mounted by this instance: 1
Oracle process number: 32
Windows thread id: 3756, image: ORACLE.EXE (SHAD)
*** 2010-09-02 15:09:16.677
*** SESSION ID:(23.3388) 2010-09-02 15:09:16.677
*** CLIENT ID:() 2010-09-02 15:09:16.677
*** SERVICE NAME:(SYS$USERS) 2010-09-02 15:09:16.677
*** MODULE NAME:(sqlplus.exe) 2010-09-02 15:09:16.677
*** ACTION NAME:() 2010-09-02 15:09:16.677
*** TRACE CONTINUED FROM FILE d:/app/administrator/diag/rdbms/orcl/orcl/trace/orcl_ora_3756.trc ***
Registered qb: SEL$1 0xdab3a30 (PARSER)
---------------------
QUERY BLOCK SIGNATURE
---------------------
signature (): qb_name=SEL$1 nbfros=1 flg=0
fro(0): flg=5 objn=3232 hint_alias="ALL_TABLES"@"SEL$1"
Registered qb: SEL$2 0xdab1a9c (PARSER)
---------------------
QUERY BLOCK SIGNATURE
---------------------
signature (): qb_name=SEL$2 nbfros=11 flg=0
fro(0): flg=4 objn=18 hint_alias="CO"@"SEL$2"
fro(1): flg=4 objn=22 hint_alias="CU"@"SEL$2"
fro(2): flg=4 objn=18 hint_alias="CX"@"SEL$2"
fro(3): flg=4 objn=132 hint_alias="DS"@"SEL$2"
fro(4): flg=4 objn=4294951198 hint_alias="KSPPCV"@"SEL$2"
fro(5): flg=4 objn=4294950998 hint_alias="KSPPI"@"SEL$2"
fro(6): flg=4 objn=18 hint_alias="O"@"SEL$2"
fro(7): flg=4 objn=14 hint_alias="S"@"SEL$2"
fro(8): flg=4 objn=4 hint_alias="T"@"SEL$2"
fro(9): flg=4 objn=16 hint_alias="TS"@"SEL$2"
fro(10): flg=4 objn=22 hint_alias="U"@"SEL$2"
Registered qb: SEL$3 0xf8a701c (PARSER)
---------------------
QUERY BLOCK SIGNATURE
---------------------
signature (): qb_name=SEL$3 nbfros=1 flg=0
fro(0): flg=4 objn=61 hint_alias="OA"@"SEL$3"
Registered qb: SEL$4 0xf8a6acc (PARSER)
---------------------
QUERY BLOCK SIGNATURE
---------------------
signature (): qb_name=SEL$4 nbfros=1 flg=0
fro(0): flg=4 objn=4294951024 hint_alias="X$KZSRO"@"SEL$4"
Registered qb: SEL$5 0xf8a6384 (PARSER)
---------------------
QUERY BLOCK SIGNATURE
---------------------
signature (): qb_name=SEL$5 nbfros=1 flg=0
fro(0): flg=5 objn=4294950942 hint_alias="V$ENABLEDPRIVS"@"SEL$5"
Registered qb: SEL$6 0xf8ba570 (PARSER)
---------------------
QUERY BLOCK SIGNATURE
---------------------
signature (): qb_name=SEL$6 nbfros=1 flg=0
fro(0): flg=5 objn=4294951295 hint_alias="GV$ENABLEDPRIVS"@"SEL$6"
Registered qb: SEL$7 0xf8b9c50 (PARSER)
---------------------
QUERY BLOCK SIGNATURE
---------------------
signature (): qb_name=SEL$7 nbfros=1 flg=0
fro(0): flg=4 objn=4294951025 hint_alias="X$KZSPR"@"SEL$7"
SPM: statement not found in SMB
**************************
Automatic degree of parallelism (ADOP)
**************************
Automatic degree of parallelism is disabled: Parameter.
PM: Considering predicate move-around in query block SEL$1 (#0)
**************************
Predicate Move-Around (PM)
**************************
OPTIMIZER INFORMATION
******************************************
----- Current SQL Statement for this session (sql_id=57m60mu8c3w33) -----
select * from all_tables where table_name='T'
*******************************************
Legend
The following abbreviations are used by optimizer trace.
CBQT - cost-based query transformation
JPPD - join predicate push-down
OJPPD - old-style (non-cost-based) JPPD
FPD - filter push-down
PM - predicate move-around
CVM - complex view merging
SPJ - select-project-join
SJC - set join conversion
SU - subquery unnesting
OBYE - order by elimination
OST - old style star transformation
ST - new (cbqt) star transformation
CNT - count(col) to count(*) transformation
JE - Join Elimination
JF - join factorization
SLP - select list pruning
DP - distinct placement
qb - query block
LB - leaf blocks
DK - distinct keys
LB/K - average number of leaf blocks per key
DB/K - average number of data blocks per key
CLUF - clustering factor
NDV - number of distinct values
Resp - response cost
Card - cardinality
Resc - resource cost
NL - nested loops (join)
SM - sort merge (join)
HA - hash (join)
CPUSPEED - CPU Speed
IOTFRSPEED - I/O transfer speed
IOSEEKTIM - I/O seek time
SREADTIM - average single block read time
MREADTIM - average multiblock read time
MBRC - average multiblock read count
MAXTHR - maximum I/O system throughput
SLAVETHR - average slave I/O throughput
dmeth - distribution method
1: no partitioning required
2: value partitioned
4: right is random (round-robin)
128: left is random (round-robin)
8: broadcast right and partition left
16: broadcast left and partition right
32: partition left using partitioning of right
64: partition right using partitioning of left
256: run the join in serial
0: invalid distribution method
sel - selectivity
ptn - partition
***************************************
PARAMETERS USED BY THE OPTIMIZER
********************************
*************************************
PARAMETERS WITH ALTERED VALUES
******************************
Compilation Environment Dump
Bug Fix Control Environment
….
Starting SQL statement mp
user_id=0 user_name=SYS mole=sqlplus.exe action=
sql_id=57m60mu8c3w33 plan_hash_value=-564731517 problem_type=3
----- Current SQL Statement for this session (sql_id=57m60mu8c3w33) -----
select * from all_tables where table_name='T'
sql_text_length=46
sql=select * from all_tables where table_name='T'
----- Explain Plan Dump -----
----- Plan Table -----
如何还原oracle数据库到sjc
一. 10053事件
当一个SQL出现性能问题的时候,可以使用SQL_TRACE 或者 10046事件来跟踪SQL. 通过生成的trace来了解SQL的执行过程。
Oracle SQL Trace 和 10046 事件
htt//blog.csdn.net/tianlesoftware/archive/2010/09/02/5857023.aspx
Event 10053 执行计划 绑定变量 Bind peeking
http//blog.csdn.net/tianlesoftware/archive/2010/04/30/5544307.aspx
Oracle 跟踪事件 set event
http//blog.csdn.net/tianlesoftware/archive/2009/12/13/4977827.aspx
现在来看一下10053事件。10053事件也是非公开的,在官网上也找不到相关信息。 我们在查看一条SQL的执行计划的时候,只能看到CBO 最终告诉我们的执行计划结果,但是不知道CBO 是根据什么来做的。 如果遇到了执行计划失真,如:一个SQL语句,很明显oracle应该使用索引,但是执行计划却没有使用索引。无法进行分析判断。
而10053事件就提供了这样的功能。它产生的trace文件提供了Oracle如何选择执行计划,为什么会得到这样的执行计划信息。
10053事件生成trace文件目录和SQL_TRACE一样。
在Oracle 10g中,SQL_TRACE生成的trace文件默认路劲是$ORACLE_BASE/admin/SID/ump.
在Oracle 11g,trace 默认路径在:$ORACLE_BASE/diag/rdbms/orcl/orcl/trace目录下
对于10053事件的trace文件,我们只能直接阅读原始的trace文件,不能使用tkprof工具来处理,tkprof工具只能用来处理sql_trace 和 10046事件产生的trace文件。
10053事件有两个级别:
Level 2:2级是1级的一个子集,它包含以下内容:
Column statistics
Single Access Paths
Join Costs
Table Joins Considered
Join Methods Considered (NL/MS/HA)
Level 1: 1级比2级更详细,它包含2级的所有内容,在加如下内容:
Parameters used by the optimizer
Index statistics
启用10053事件:
ALTER SESSION SET EVENTS='10053 trace name context forever, level 1';
ALTER SESSION SET EVENTS='10053 trace name context forever, level 2';
关闭10053事件:
ALTER SESSION SET EVENTS '10053 trace name context off';
说明:
(1)sqlplus中打开autotrace看到的执行计划实际上是用explain plan 命令得到的,explain plan 命令不会进行bind peeking。应该通过v$sql_plan查看SQL的真实的执行计划。
(2)10053只对CBO有效,而且如果一个sql语句已经解析过,就不会产生新的trace信息。
二. 示例:
1. 确定当前的trace 文件
1.1 设定trace 文件标识
SQL> alter session set tracefile_identifier='怀宁';
会话已更改。
设置标识的目的就是方便我们查找生成的trace文件。我们只需要在trace目录查找文件名里带有标识的文件即可。
1.2直接用如下SQL直接查出,当前的trace文件名。
/* Formatted on 2010/9/1 23:56:24 (QP5 v5.115.810.9015) */
SELECT d.VALUE
|| '/'
|| LOWER (RTRIM (i.INSTANCE, CHR (0)))
|| '_ora_'
|| p.spid
|| '.trc'
AS "trace_file_name"
FROM (SELECT p.spid
FROM v$mystat m, v$session s, v$process p
WHERE m.statistic# = 1 AND s.SID = m.SID AND p.addr = s.paddr) p,
(SELECT t.INSTANCE
FROM v$thread t, v$parameter v
WHERE v.NAME = 'thread'
AND (v.VALUE = 0 OR t.thread# = TO_NUMBER (v.VALUE))) i,
(SELECT VALUE
FROM v$parameter
WHERE NAME = 'user_mp_dest') d;
2. 启动10053事件
SQL> ALTER SESSION SET EVENTS='10053 trace name context forever, level 1';
3. 执行事务
SQL> select * from all_tables where table_name='T';
4. 关闭10053事件
SQL> ALTER SESSION SET EVENTS '10053 trace name context off';
三. 查看生成的trace文件
因为我们在做之前设置了标识,所以直接进入trace目录,找到含有 ‘怀宁’标识的trace 文件。
Trace file d:/app/administrator/diag/rdbms/orcl/orcl/trace/orcl_ora_3756_怀宁.trc
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Proction
With the Partitioning, OLAP, Data Mining and Real Application Testing options
Windows NT Version V6.1
CPU : 2 - type 586, 2 Physical Cores
Process Affinity : 0x0x00000000
Memory (Avail/Total): Ph:1570M/4095M, Ph+PgF:4126M/8188M, VA:2874M/4095M
Instance name: orcl
Redo thread mounted by this instance: 1
Oracle process number: 32
Windows thread id: 3756, image: ORACLE.EXE (SHAD)
*** 2010-09-02 15:09:16.677
*** SESSION ID:(23.3388) 2010-09-02 15:09:16.677
*** CLIENT ID:() 2010-09-02 15:09:16.677
*** SERVICE NAME:(SYS$USERS) 2010-09-02 15:09:16.677
*** MODULE NAME:(sqlplus.exe) 2010-09-02 15:09:16.677
*** ACTION NAME:() 2010-09-02 15:09:16.677
*** TRACE CONTINUED FROM FILE d:/app/administrator/diag/rdbms/orcl/orcl/trace/orcl_ora_3756.trc ***
Registered qb: SEL$1 0xdab3a30 (PARSER)
---------------------
QUERY BLOCK SIGNATURE
---------------------
signature (): qb_name=SEL$1 nbfros=1 flg=0
fro(0): flg=5 objn=3232 hint_alias="ALL_TABLES"@"SEL$1"
Registered qb: SEL$2 0xdab1a9c (PARSER)
---------------------
QUERY BLOCK SIGNATURE
---------------------
signature (): qb_name=SEL$2 nbfros=11 flg=0
fro(0): flg=4 objn=18 hint_alias="CO"@"SEL$2"
fro(1): flg=4 objn=22 hint_alias="CU"@"SEL$2"
fro(2): flg=4 objn=18 hint_alias="CX"@"SEL$2"
fro(3): flg=4 objn=132 hint_alias="DS"@"SEL$2"
fro(4): flg=4 objn=4294951198 hint_alias="KSPPCV"@"SEL$2"
fro(5): flg=4 objn=4294950998 hint_alias="KSPPI"@"SEL$2"
fro(6): flg=4 objn=18 hint_alias="O"@"SEL$2"
fro(7): flg=4 objn=14 hint_alias="S"@"SEL$2"
fro(8): flg=4 objn=4 hint_alias="T"@"SEL$2"
fro(9): flg=4 objn=16 hint_alias="TS"@"SEL$2"
fro(10): flg=4 objn=22 hint_alias="U"@"SEL$2"
Registered qb: SEL$3 0xf8a701c (PARSER)
---------------------
QUERY BLOCK SIGNATURE
---------------------
signature (): qb_name=SEL$3 nbfros=1 flg=0
fro(0): flg=4 objn=61 hint_alias="OA"@"SEL$3"
Registered qb: SEL$4 0xf8a6acc (PARSER)
---------------------
QUERY BLOCK SIGNATURE
---------------------
signature (): qb_name=SEL$4 nbfros=1 flg=0
fro(0): flg=4 objn=4294951024 hint_alias="X$KZSRO"@"SEL$4"
Registered qb: SEL$5 0xf8a6384 (PARSER)
---------------------
QUERY BLOCK SIGNATURE
---------------------
signature (): qb_name=SEL$5 nbfros=1 flg=0
fro(0): flg=5 objn=4294950942 hint_alias="V$ENABLEDPRIVS"@"SEL$5"
Registered qb: SEL$6 0xf8ba570 (PARSER)
---------------------
QUERY BLOCK SIGNATURE
---------------------
signature (): qb_name=SEL$6 nbfros=1 flg=0
fro(0): flg=5 objn=4294951295 hint_alias="GV$ENABLEDPRIVS"@"SEL$6"
Registered qb: SEL$7 0xf8b9c50 (PARSER)
---------------------
QUERY BLOCK SIGNATURE
---------------------
signature (): qb_name=SEL$7 nbfros=1 flg=0
fro(0): flg=4 objn=4294951025 hint_alias="X$KZSPR"@"SEL$7"
SPM: statement not found in SMB
**************************
Automatic degree of parallelism (ADOP)
**************************
Automatic degree of parallelism is disabled: Parameter.
PM: Considering predicate move-around in query block SEL$1 (#0)
**************************
Predicate Move-Around (PM)
**************************
OPTIMIZER INFORMATION
******************************************
----- Current SQL Statement for this session (sql_id=57m60mu8c3w33) -----
select * from all_tables where table_name='T'
*******************************************
Legend
The following abbreviations are used by optimizer trace.
CBQT - cost-based query transformation
JPPD - join predicate push-down
OJPPD - old-style (non-cost-based) JPPD
FPD - filter push-down
PM - predicate move-around
CVM - complex view merging
SPJ - select-project-join
SJC - set join conversion
SU - subquery unnesting
OBYE - order by elimination
OST - old style star transformation
ST - new (cbqt) star transformation
CNT - count(col) to count(*) transformation
JE - Join Elimination
JF - join factorization
SLP - select list pruning
DP - distinct placement
qb - query block
LB - leaf blocks
DK - distinct keys
LB/K - average number of leaf blocks per key
DB/K - average number of data blocks per key
CLUF - clustering factor
NDV - number of distinct values
Resp - response cost
Card - cardinality
Resc - resource cost
NL - nested loops (join)
SM - sort merge (join)
HA - hash (join)
CPUSPEED - CPU Speed
IOTFRSPEED - I/O transfer speed
IOSEEKTIM - I/O seek time
SREADTIM - average single block read time
MREADTIM - average multiblock read time
MBRC - average multiblock read count
MAXTHR - maximum I/O system throughput
SLAVETHR - average slave I/O throughput
dmeth - distribution method
1: no partitioning required
2: value partitioned
4: right is random (round-robin)
128: left is random (round-robin)
8: broadcast right and partition left
16: broadcast left and partition right
32: partition left using partitioning of right
64: partition right using partitioning of left
256: run the join in serial
0: invalid distribution method
sel - selectivity
ptn - partition
***************************************
PARAMETERS USED BY THE OPTIMIZER
********************************
*************************************
PARAMETERS WITH ALTERED VALUES
******************************
Compilation Environment Dump
Bug Fix Control Environment
….
Starting SQL statement mp
user_id=0 user_name=SYS mole=sqlplus.exe action=
sql_id=57m60mu8c3w33 plan_hash_value=-564731517 problem_type=3
----- Current SQL Statement for this session (sql_id=57m60mu8c3w33) -----
select * from all_tables where table_name='T'
sql_text_length=46
sql=select * from all_tables where table_name='T'
----- Explain Plan Dump -----
----- Plan Table -----
怎样查看oracle的优化器参数
查询优化器参数
1. optimizer_mode
查询优化器是为了找一个最高效的执行计划,这个参数用来定义什么是“高效”,比如是更快还是占用资源更少。在oracle10g中只支持两个参数值:
all_rows:提供全部数据
first_rows(n):n为大于0的自然数,表示尽快传输前面n条数据(比如分页查询的时候,我第一次只查询前面10条数据)
oracle10g默认为all_rows,可以再数据库级别,会话级别,或者执行SQL的时候修改该参数的值。
数据库级别:alter system set optimizer_mode=first_rows(10) scope=spfile;
会话级别:ALTER SESSION SET OPTIMIZER_MODE=first_rows(10);
SQL级别:SELECT /*+ first_rows(10) */ id,name from t1 order by id;
其实,默认all_rows是最好的方式,如果确实是只要查询小部分数据,可以在sql级别加上提示,看是否能提高性能。
2. db_file_multiblock_read_count
在多块读的情况下(比如全表扫描),该参数说明一次最多可读取的数据块数目。设置得太小的话,效率低。设置得太高也不见得就好(太高,会受I/O最大吞吐量*。比如设置成一次最多读取1024块,但I/O最大吞吐量只允许32块,那一次最多也只读取32块。而且一次读取很多块,开销会偏高。)应该通过测试,才能知道应该把该参数设置成哪一个值。
测试过程:
1. 创建一张大表,比如上千万行级别的数据
2. 循环设置该参数的值,查看全表扫描的速度。类似于以下语句:
[sql] view plain copy
<span style="font-size:14px;"> declare
l_count pls_integer;
l_time pls_integer;
l_starting_time pls_integer;
l_ending_time pls_integer;
begin
dbms_output.put_line('dbfmbrc seconds');
for l_dbfmbrc in 1..32
loop
execute immediate 'alter session set db_file_multiblock_read_count='||l_dbfmbrc;
l_starting_time := dbms_utility.get_time();
select /*+ full(t) */ count(*) into l_count from big_table t;
l_ending_time := dbms_utility.get_time();
l_time := round((l_ending_time-l_starting_time)/100);
dbms_output.put_line(l_dbfmbrc||' '||l_time);
end loop;
end;
/</span>
3. optimizer_index_cost_adj
影响走索引扫描的开销计算。 取值范围1到10000.默认值为100,超过100后,走索引扫描的开销越高,从而使得查询优化器更加倾向于使用全表扫描。相反,小于100,索引扫描的开销就越低,从而使得查询优化器更加倾向于使用索引扫描。从下面索引扫描开销计算公式可以看出:
io_cost=(blevel+(leaf_blocks+culstering_factor)*selectivity) *optimizer_index_cost_adj/100.
一般是默认值不需要修改,但是如果发现本应该走索引扫描结果走了全表扫描,可以适当调低该值,但是,这个值不应该设置过低,因为,过低的话,如果两个索引扫描的开销不同,可能通过该公式一算,开销就变成一样的了。总之,不建议修改该参数的值。
PGA参数
1. workarea_size_policy
管理工作区域内存(PGA)的方式,
auto:oracle10g默认方式,委托给内存管理器自动管理(建议不需要修改)
manual:oracle9i默认方式,oracle9i没有自动管理功能。
2. pga_aggregate_target
如果是自动管理PGA,那么该参数用于指定实例可用的PGA的大小,默认是SGA的20%。即使今后用的内存超过了设置的值,也没有关系,oracle会自动增大PGA的值。比如该参数设置的是200M,今后某一时刻,需要300M,也是没问题的,会自动增长。
3. sort_area_size
手动管理PGA,该参数指定分配多大的内存用于排序操作,过小的话,会影响性能,过大的话浪费空间。很难说一个合适的默认值,因为用户场景变化非常大,实际情况得实际处理。
4. hash_area_size
手动管理PGA,该参数用于指定哈希连接的工作区域大小,同样建议它的值也很困难。如果过小,那么查询优化器就会高估哈希连接的开销,偏向于合并连接。
怎样查看oracle的优化器参数
查询优化器参数
1. optimizer_mode
查询优化器是为了找一个最高效的执行计划,这个参数用来定义什么是“高效”,比如是更快还是占用资源更少。在oracle10g中只支持两个参数值:
all_rows:提供全部数据
first_rows(n):n为大于0的自然数,表示尽快传输前面n条数据(比如分页查询的时候,我第一次只查询前面10条数据)
oracle10g默认为all_rows,可以再数据库级别,会话级别,或者执行SQL的时候修改该参数的值。
数据库级别:alter system set optimizer_mode=first_rows(10) scope=spfile;
会话级别:ALTER SESSION SET OPTIMIZER_MODE=first_rows(10);
SQL级别:SELECT /*+ first_rows(10) */ id,name from t1 order by id;
其实,默认all_rows是最好的方式,如果确实是只要查询小部分数据,可以在sql级别加上提示,看是否能提高性能。
2. db_file_multiblock_read_count
在多块读的情况下(比如全表扫描),该参数说明一次最多可读取的数据块数目。设置得太小的话,效率低。设置得太高也不见得就好(太高,会受I/O最大吞吐量*。比如设置成一次最多读取1024块,但I/O最大吞吐量只允许32块,那一次最多也只读取32块。而且一次读取很多块,开销会偏高。)应该通过测试,才能知道应该把该参数设置成哪一个值。
测试过程:
1. 创建一张大表,比如上千万行级别的数据
2. 循环设置该参数的值,查看全表扫描的速度。类似于以下语句:
[sql] view plain copy
<span style="font-size:14px;"> declare
l_count pls_integer;
l_time pls_integer;
l_starting_time pls_integer;
l_ending_time pls_integer;
begin
dbms_output.put_line('dbfmbrc seconds');
for l_dbfmbrc in 1..32
loop
execute immediate 'alter session set db_file_multiblock_read_count='||l_dbfmbrc;
l_starting_time := dbms_utility.get_time();
select /*+ full(t) */ count(*) into l_count from big_table t;
l_ending_time := dbms_utility.get_time();
l_time := round((l_ending_time-l_starting_time)/100);
dbms_output.put_line(l_dbfmbrc||' '||l_time);
end loop;
end;
/</span>
3. optimizer_index_cost_adj
影响走索引扫描的开销计算。 取值范围1到10000.默认值为100,超过100后,走索引扫描的开销越高,从而使得查询优化器更加倾向于使用全表扫描。相反,小于100,索引扫描的开销就越低,从而使得查询优化器更加倾向于使用索引扫描。从下面索引扫描开销计算公式可以看出:
io_cost=(blevel+(leaf_blocks+culstering_factor)*selectivity) *optimizer_index_cost_adj/100.
一般是默认值不需要修改,但是如果发现本应该走索引扫描结果走了全表扫描,可以适当调低该值,但是,这个值不应该设置过低,因为,过低的话,如果两个索引扫描的开销不同,可能通过该公式一算,开销就变成一样的了。总之,不建议修改该参数的值。
PGA参数
1. workarea_size_policy
管理工作区域内存(PGA)的方式,
auto:oracle10g默认方式,委托给内存管理器自动管理(建议不需要修改)
manual:oracle9i默认方式,oracle9i没有自动管理功能。
2. pga_aggregate_target
如果是自动管理PGA,那么该参数用于指定实例可用的PGA的大小,默认是SGA的20%。即使今后用的内存超过了设置的值,也没有关系,oracle会自动增大PGA的值。比如该参数设置的是200M,今后某一时刻,需要300M,也是没问题的,会自动增长。
3. sort_area_size
手动管理PGA,该参数指定分配多大的内存用于排序操作,过小的话,会影响性能,过大的话浪费空间。很难说一个合适的默认值,因为用户场景变化非常大,实际情况得实际处理。
4. hash_area_size
手动管理PGA,该参数用于指定哈希连接的工作区域大小,同样建议它的值也很困难。如果过小,那么查询优化器就会高估哈希连接的开销,偏向于合并连接。
谁能详细介绍一下Microsoft、IBM、Apple、Intel、Oracle的历史
http://www.chinaitlab.com/www/techspecial/microSoft/
1975年4月4日 Microsoft 成立
1979年1月1日 Microsoft 从北墨西哥州Albuquerque迁移至华盛顿州Bellevue市
1981年6月25日 Microsoft 正式登记公司
1981年8月12日,IBM推出内含Microsoft的16位元作业系统 MS-DOS 1.0的个人电脑。
MS-DOS是Microsoft Disk Operating System的简称,意即由美国微软公司(Microsoft)提供的磁盘操作系统。在Windows 95以前,DOS是PC兼容电脑的最基本配备,而MS-DOS则是最普遍使用的PC兼容DOS。
最基本的MS-DOS系统由一个基于MBR的BOOT引导程序和三个文件模块组成。这三个模块是输入输出模块(IO.SYS)、文件管理模块(MSDOS.SYS)及命令解释模块(COMMAND.COM)。除此之外,微软还在零售的MS-DOS系统包中加入了若干标准的外部程序(即外部命令),这才与内部命令(即由COMMAND.COM解释执行的命令)一同构建起一个在磁盘操作时代相对完备的人机交互环境。有关MS-DOS的各种命令,请参见MS-DOS命令列表。
MS-DOS一般使用命令行界面来接受用户的指令,不过在后期的MS-DOS版本中,DOS程序也可以通过调用相应的DOS中断来进入图形模式,即DOS下的图形界面程序。
http://computer.bisu.e.cn/gonggong/doc/IBM/
1888年,第一台刻度盘记录器(dial recorder)诞生。是由Alexander Dey 博士发明的,Dey所在的公司后来(1907年)被IBM前身中的一家公司收购。
1896年, Herman Hollerith在华盛顿特区组建制表机器公司(Tabulating Machine Company),这是世界上第一家电子制表与财务审计机器公司。
1901年,George W. Fairchild成立国际时间记录公司(Inter-national Time Recording Company),该公司是邦迪制造公司、威拉德与弗里克制造公司和标准时间印章公司三家公司的销售公司,同时还生产卡片记录器。
1905年,制表机器公司在新泽西实现合并。除了拥有并控制Hollerith Tabulating 专利和系统外,制表机器公司还是审计机器公司(Auditing Machine Company)的大股东,现在该公司作为一个部门运作。
1906年,第一台可以自动供纸的制表机问世,该机每分钟可处理150 个卡片。
1906年,国际时间记录公司在伯明翰建立了第二个工厂后,又在纽约州Endicott建设了一坐现代化的,用水泥加固的工厂,该工厂所在地是现在的IBM公司工厂的原址。
1907年,国际时间记录公司收购戴伊时间记录器公司 (即1883年成立的戴伊专利权公司),该公司生产刻度盘、卡片和工时记录器。国际时间记录公司的所有业务都转移到了约州的Endicott。
1908年,制造刻度盘记录器的锡拉丘兹时间记录公司(Syracuse Time Recording Company)被国际时间记录公司收购。
1911年,Charles R. Flint筹划了国际时间记录公司、计算尺公司和制表机器公司 三家公司的合并,成立了计算-制表-记录公司(Computing-Tabulating-Recording Company,即C-T-R公司)。George Fairchild成为公司的董事会董事长。 (C-T-R公司后来在1924年改名为国际商用机器公司,即IBM)
1914年,Thomas J. Watson, Sr.加盟C-T-R公司 ,成为公司的总经理。此时,C-T-R在美国通过销售、服务与出租等方式获得在总收入达到了400万美元。每一百股C-T-R公司的股票价值不足3000美元。年底公司有770位持股人,员工达到了1,346名。
1914年,财务处理机器的应用开始普及开来。财务处理产品包括机械化的键盘穿孔机、手工操作的复穿孔机、垂直分拣机和制表机等。这些产品的客户包括铁路、化工公司、公用事业公司和人寿保险公司等。
1915年,T. J. Watson, Sr.当选C-T-R公司总裁兼总经理。第一次销售大会召开,后来形成百分百俱乐部大会(One Hundred Percent Club Convention)。销售力量进行了重组并得到了加强。
1915年,著名的“Think”标志,老沃森提出的口号,开始在公司内部使用。
1916年,C-T-R公司的总收入达到了600万美元,净收益为100万美元。员工达到2,529名。同时,公司向销售人员培训计划迈出了第一步。
1917年,C-T-R公司以国际商用机器有限责任公司(International Business Machines Co., Limited,IBM)的名字进入加拿大市场。
1919年,C-T-R公司进入欧洲市场。 公司内部刊报The T. M. Business Record 第一期发行。
同年,推出电子同步计时钟系统。
1920年,研制成功时钟签名记录器(Lock Autograph Recorder)并推向市场。1921年,制表机器公司获得皮尔斯财务处理机器公司(Pierce Accounting Machine Company)和芝加哥票券印刷公司(Ticketograph Company of Chicago)的专利与设备。
1924年,计算-制表-记录公司(即C-T-R公司)改名为国际商用机器公司(IBM公司)。四分之一世纪俱乐部(Quarter Century Club)成立,该俱乐部只承认那些为公司工作25年以上的员工。IBM公司公司内部刊物《商用机器》(Business Machines )第一期发行。
1933年,IBM公司校舍与工程实验室大楼(IBM Schoolhouse and Engineering Laboratory Building)在纽约州的恩迪科特(Endicott)落成。
1935年,面向员工和客户的杂志《思索》(Think)第一期发行。IBM公司在纽约州恩迪科特举办了第一届服务性行业女性系统训练班。
1940年,由于二战业已爆发,IBM大量生产军需品,生产线日益扩大。
战争年代里,IBM迈出了跨入计算领域的第一步,1944年,IBM公司向哈佛大学赠送其首台大型计算机--自动顺序控制计算机,也被称为Mark I。
1951年,IBM开始决定开发商用电脑,聘请冯·诺依曼担任公司的科学顾问,1952年12月研制出IBM第一台存储程序计算机,也是通常意义上的电脑,它叫IBM 701。这是IT历史上一个重要的里程碑。
1952年,小沃森出任CEO,IBM新一代领导集体诞生。
1964年4月7日,IBMTom Watson, Jr.亲自发布System 360。
1969年,在小沃森的改革下,IBM公司采纳新的营销,对大部分系统工程活动、将来的计算机程序和客户培训课程分别进行收费。 同年,在提出诉讼,控告IBM公司“企图垄断,并且已经垄断了...用于一般目的的数字计算机”。 起诉,IBM公司在1967年控制了市场的76%。此外, 还声称,IBM用了许多办法来阻止其他公司的竞争,包括价格,即降低价格以阻止进入该行业,以及引起减少其他公司产品吸引力的新产品。 IBM以顽强而有力的方式对的诉讼案(及许多私人诉讼案)进行了抗争。案件持续了13年。
在七十年代看起来是沃森家族对IBM的领导的结束,1971年,Thomas J. Watson, Jr.退休,成为执行委员会的。Frank T. Cary于1973年接任CEO。
在卡里的领导下,IBM在人们日常生活中扮演着越来越重要的角色。1971年,IBM公司生产的计算机引导"阿波罗14号"和"阿波罗15号"宇宙飞船成功登月。
1981年,John R.Opel出任CEO,开创了IBM历史新纪元,由于IBM—PC,IBM商标开始进入家庭、学校、中小企业。Intel和微软的霸业在此萌芽。
1985年,John F. Akers接任CEO。IBM投资的科研项目催生了四位诺贝尔奖获得者。
1993年,IBM的年收入下降到627.1亿美元,较1992年下降2.8%。纯收入下降到负81亿美元,较上一年下降了63.1%。公司机构重组花费了89亿美元(税前)用以提高公司生产效率和减少资源浪费。
1993年,Louis V. Gerstner, Jr出任CEO。
进入21世纪之后,IBM的领导层又发生了一次变化,Samuel J. Palmisano于2000年做了IBM的总裁,两年后,接任CEO。
http://www.bokee.com/idea/50itcorp/apple/
1976年, Steve Jobs 和 Steve Woznaik建立了苹果和公司,并开发了 Apple I 的主板
1977年, Apple II 问世,并带来1百万的销售收入,同年 Apple 的商标诞生。
1979年, 加强型Apple II 问世,具有显示器和硬盘
1980年, 在加利福尼亚取得一万台苹果的学校订单 Apple III 问世。
1981年, 苹果公司开始研发Macintosh。
1984年,1月24日, Macintosh 正式问世。 开创了图形界面的先河!
1987年, Mac II 问世,成为苹果家族中重要的一员。
1990年, 十月十五日, MacLC & Macintosh Classic 问世, 同时发布的System 7 和QuickTime 也意味着多媒体时代的到来。
1991年, 十月二日,苹果公司,摩托罗拉和IBM公司缔结同盟,开始共同研发Power PC的产品。 同年,苹果公司推出第一代的Power Book。
1994年, 苹果公司推出第一代Power Macintosh. 这是第一台基于 PowerPC超快芯片产品,从苹果开始进入商用市场。
1997年, 七月,创始人Steve Jobs重回苹果,改革产品线,与微软联盟,公司重获生机。
1998年八月十五日,苹果公司推出iMac,从此个人电脑进入了色彩缤纷的年代。
1999年, 苹果公司推出PowerMac G3和iBook.
2000年, 苹果公司推出功能强大PowerMac G4、 创新设计PowerMac G4 Cube 和 新款的专业鼠标和键盘。
2000年, 同年,苹果公司推出四款新iMac,
iMovie和基于互联网的iTools。
2001年, 3月24日,苹果公司推出性的系统OSX, 宣布苹果系统进入新时代。
2001年, 5月,苹果公司推出新款iBook, 并宣布苹果产品要成为数字化生活的核心。 10月, 苹果公司推出第一款Mp3播放器(iPod)。
2002年,苹果公司推出几款极漂亮的机型,iPhoto面世
2003年6月23日,苹果发布Power G5,这是史上最强大的PowerMac,也是最强大的PC之一。
什么时候查询优化器使用全表扫描
查询优化器参数
1. optimizer_mode
查询优化器是为了找一个最高效的执行计划,这个参数用来定义什么是逗高效地,比如是更快还是占用资源更少。在oracle10g中只支持两个参数值:
all_rows:提供全部数据
first_rows(n):n为大于0的自然数,表示尽快传输前面n条数据(比如分页查询的时候,我第一次只查询前面10条数据)
oracle10g默认为all_rows,可以再数据库级别,会话级别,或者执行SQL的时候修改该参数的值。
数据库级别:alter system set optimizer_mode=first_rows(10) scope=spfile;
会话级别:ALTER SESSION SET OPTIMIZER_MODE=first_rows(10);
SQL级别:SELECT /*+ first_rows(10) */ id,name from t1 order by id;
其实,默认all_rows是最好的方式,如果确实是只要查询小部分数据,可以在sql级别加上提示,看是否能提高性能。
2. db_file_multiblock_read_count
在多块读的情况下(比如全表扫描),该参数说明一次最多可读取的数据块数目。设置得太小的话,效率低。设置得太高也不见得就好(太高,会受I/O最大吞吐量。比如设置成一次最多读取1024块,但I/O最大吞吐量只允许32块,那一次最多也只读取32块。而且一次读取很多块,开销会偏高。)应该通过测试,才能知道应该把该参数设置成哪一个值。
测试过程:
1. 创建一张大表,比如上千万行级别的数据
2. 循环设置该参数的值,查看全表扫描的速度。类似于以下语句:
[sql] view plain copy
<span style="font-size:14px;"> declare
l_count pls_integer;
l_time pls_integer;
l_starting_time pls_integer;
l_ending_time pls_integer;
begin
dbms_output.put_line('dbfmbrc seconds');
for l_dbfmbrc in 1..32
loop
execute immediate 'alter session set db_file_multiblock_read_count='||l_dbfmbrc;
l_starting_time := dbms_utility.get_time();
select /*+ full(t) */ count(*) into l_count from big_table t;
l_ending_time := dbms_utility.get_time();
l_time := round((l_ending_time-l_starting_time)/100);
dbms_output.put_line(l_dbfmbrc||' '||l_time);
end loop;
end;
/</span>
3. optimizer_index_cost_adj
影响走索引扫描的开销计算。 取值范围1到10000.默认值为100,超过100后,走索引扫描的开销越高,从而使得查询优化器更加倾向于使用全表扫描。相反,小于100,索引扫描的开销就越低,从而使得查询优化器更加倾向于使用索引扫描。从下面索引扫描开销计算公式可以看出:
io_cost=(blevel+(leaf_blocks+culstering_factor)*selectivity) *optimizer_index_cost_adj/100.
一般是默认值不需要修改,但是如果发现本应该走索引扫描结果走了全表扫描,可以适当调低该值,但是,这个值不应该设置过低,因为,过低的话,如果两个索引扫描的开销不同,可能通过该公式一算,开销就变成一样的了。总之,不建议修改该参数的值。
PGA参数
1. workarea_size_policy
管理工作区域内存(PGA)的方式,
auto:oracle10g默认方式,委托给内存管理器自动管理(建议不需要修改)
manual:oracle9i默认方式,oracle9i没有自动管理功能。
2. pga_aggregate_target
如果是自动管理PGA,那么该参数用于指定实例可用的PGA的大小,默认是SGA的20%。即使今后用的内存超过了设置的值,也没有关系,oracle会自动增大PGA的值。比如该参数设置的是200M,今后某一时刻,需要300M,也是没问题的,会自动增长。
3. sort_area_size
手动管理PGA,该参数指定分配多大的内存用于排序操作,过小的话,会影响性能,过大的话浪费空间。很难说一个合适的默认值,因为用户场景变化非常大,实际情况得实际处理。
4. hash_area_size
手动管理PGA,该参数用于指定哈希连接的工作区域大小,同样建议它的值也很困难。如果过小,那么查询优化器就会高估哈希连接的开销,偏向于合并连接。