| « | 七月 2009 | » | ||||
|---|---|---|---|---|---|---|
| 一 | 二 | 三 | 四 | 五 | 六 | 日 |
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 | 31 | ||
| Oracle数据库技术服务内容 qq:123614791 msn:xjwyq28@hotmail.com tel: 131-6198-9316 一、产品安装 数据库安装与配置服务,我方负责在承诺时间内完成客户数据库安装与配置。 二、Oracle数据库备份与恢复 ORACLE数据库的备份与恢复的方案设计、操作培训和具体实施。数据库备份和恢复服务,oracle数据库的灾难恢复。 三、性能诊断、性能调优 服务指对用户的数据库可能存在的性能问题进行全面的分析、评估、调整,以确定在数据库层次存在的主要性能瓶颈和隐患。在性能诊断基础上,对数据库进行整体性能的调整,以提高数据库系统的整体性能。我方负责在承诺时间内完成客户应用模块的SQL和PL/SQL语言的代码优化。 四、紧急故障排除和紧急响应服务 根据定义而采用相应的紧急解决方案。 五、数据迁移 数据搬迁服务包括如下内容:多种硬件存储平台互相之间数据迁移。多厂商数据库之间的数据迁移。 六、电话支持服务、远程拨号诊断 在维护协议有效期限内,贵公司将获得电话支持,由公司资深Oracle工程师提供技术服务,进行技术咨询,故障分析,远程诊断,并对严重问题迅速升级,包括将问题升级到ORACLE高级处理中心和派遣当地工程师迅速到达现场。电话支持服务为每周7天,每天24小时。为加快排除故障速度,公司将对大部分系统软件问题提供远程拨号诊断服务。 七、系统健康检查(巡检服务) 根据贵公司需求定期到现场进行系统可靠性、高效巡检。 八、Oracle数据库安全性、稳定性评估建议报告 对ORACLE数据库的访问安全性进行评估并提供相应的改进建议和改进方案。对ORACLE数据库的持续性正常工作能力进行评估,并给出相应的改进建议和改进方案。 九、定制数据库维护手册 总结归纳客户数据库现有系统和应用特点,制订相关的数据库日常管理方式、数据库定期性能检查内容和方法、制订描述手册内容和使用方法并针对性的进行数据库管理培训服务。 十、数据库补丁包服务 此服务主要完成客户数据库增打补丁的需求,使打完补丁后的数据库环境能够正常运作,发挥数据库软件应有的功能。 十一、培训服务 可在用户现场或各地的培训中心,进行Oracle数据库管理或维护课程培训,内容可包括:数据库体系结构、日常管理、备份与恢复、性能优化、SQL&PL/SQL等课程。我们的培训形式 a 在各地的培训中心授课 b 在客户现场授课 c 组织用户进行研讨会方式的培训 |
xjwyq28@hotmail.com 原创 qq: 123614791
1. 场景说明:
stockpile ----IC卡的供求信息
xh-- 型号-----字符型
xh 列是 可为null的
index SP_XH, 是函数index, 定义如下create index SP_XH on stockpile (upper(xh));
注意:
( xh 列是 可为null的,会多读一次表
如果xh上带not null 的约束,只读index 不读表 )
高频度查询SQL
select /*+ INDEX(s SP_XH) */ count(s.xh)
from stockpile s
where upper(s.xh) like 'TL431%'
COUNT(S.XH)
-----------
186875
2. 问题出现:
读完index SP_XH 统计出数量后, 为何有多读一次STOCKPILE, 幸好它对性能的恶化程度还不算非常厉害,
select /*+ INDEX(s SP_XH) */ count(s.xh)
from stockpile s
where upper(s.xh) like 'TL431%'
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=HINT: FIRST_ROWS (Cost=272 Card=1Bytes=14)
1 0 SORT (AGGREGATE)
2 1 TABLE ACCESS (BY INDEX ROWID) OF 'STOCKPILE' (Cost=272 Card=284 Bytes=3976)
3 2 INDEX (RANGE SCAN) OF 'SP_XH' (NON-UNIQUE) (Cost=3 Card=284)
3. 分析解决:
a. 这个sql如果用count(*), 只读 index SP_XH { upper(s.xh) } , 不读表 。
b. 如果用 count(s.xh) , s.xh的数据只有在表中有 , 对应的index SP_XH { upper(s.xh) } 没有, 为排除s.xh空值影响, 所以读完index还要读表。
注解: <列> 与 某 function(列) 之间, ORACLE不能够 根据 其中一个判断另一个是否为NULL, 例如 function 是NVL(列, '1'), DECODE(列, NULL, '1', '2',NULL) 或是自定义函数, 根据函数处理后的列值-----> 不能判断 最初的<列> 是否为NULL。
c. 如改写成 count( upper(s.xh)) 一样可以只读index不读表。
select /*+ INDEX(s SP_XH) */ count( upper(s.xh))
from stockpile s
where upper(s.xh) like 'TL431%'
4. 回顾:
a. 函数index 中 存贮的是: 函数处理列后的值 和 行rowid。
b. 当xh 列是 可为null的,count(列) 出现, 走的又是 列的函数index, count(列)会多读一次表。
c. 当xh列上带not null 的约束, 只读index不读表。
d. count(列)出现时, 要看一下这对业务来说是否真的有必要, 如果只是程序员的一个书写习惯,不要轻易的忽视它。
xjwyq28@hotmail.com 原创 qq: 123614791
xjwyq28@hotmail.com 原创
场景:
1. 分布式数据库通过mview同步, 一个主表被多个mview来刷取数据。
2. 当其中一个含 mview的数据库失败,其上的那个mview停止刷新。
2. 坏了一个 mview , 主表的mlog$xxxx表的数据因为有一个没刷, 而不删除,主表的mlog$xxxx表不断变大。
3. mlog$xxxx 不断变大 , 影响其它正常的mview的刷新非常速度, 且iowait严重。
解决:
1. 在建主表库上使用DBMS_MVIEW.PURGE_LOG() 可以 删除mlog$中log (最近最少刷新的mview所需log), 那个失败的mview一般情况下就是
最近最少刷新(least recently refreshed) 的(根据实际情况定) 。
2. DBMS_MVIEW.PURGE_LOG() 后, mlog$xxxx表 的 仍热很大, 因为HWM(高水位线) 过高, 可用alter table xxxx move来降低。
回顾: mview 刷新的原理: 不再陈述。
使用方法如下:
=====================================PURGE_LOG Procedure=================================
This procedure purges rows from the materialized view log.
Syntax
DBMS_MVIEW.PURGE_LOG (
master IN VARCHAR2,
num IN BINARY_INTEGER := 1,
flag IN VARCHAR2 := 'NOP');
Parameters
Table 54-8 PURGE_LOG Procedure Parameters
Parameter Description
master
Name of the master table or master materialized view.
num
Number of least recently refreshed materialized views whose rows you want to remove from materialized view log. For
example, the following statement deletes rows needed to refresh the two least recently refreshed materialized views:
DBMS_MVIEW.PURGE_LOG('master_table', 2);
To delete all rows in the materialized view log, indicate a high number of materialized views to disregard, as in this
example:
DBMS_MVIEW.PURGE_LOG('master_table',9999);
This statement completely purges the materialized view log that corresponds to master_table if fewer than 9999 materialized
views are based on master_table. A simple materialized view whose rows have been purged from the materialized view log must
be completely refreshed the next time it is refreshed.
flag
Specify delete to guarantee that rows are deleted from the materialized view log for at least one materialized view. This
parameter can override the setting for the parameter num. For example, the following statement deletes rows from the
materialized view log that has dependency rows in the least recently refreshed materialized view:
DBMS_MVIEW.PURGE_LOG('master_table',1,'delete');
原创 xjwyq28@hotmail.com qq : 123614791
场景:
1. 数据列类型 和 输入值 类型 不一致
2. 已有列的常规index不能被使用,访问都是 TABLE ACCESS (FULL)。
3. 程序代码不能立刻修正。
解决 : 产生to_number(列)的 函数index, 却能够被应用, 避免一场数据库的灾难。
---------------- oracle数据隐式转换---- 应急方案-to_number(列) 函数index-----------------------------------------------
1. 列为数值型。
where ml_id= '36837053' 可以使用 index
where ml_id = 36837053 可以使用 index
2. 列为字符型varchar2 。
var_col='36837053' 可以使用 index
where var_col= 36837053 ; 不能用上其列index
(重要:产生to_number(列)的index 却可以被应用===》 在不能立刻改程序代码的情况下, 应急方案。 )
---------------------------------------- 明细测试如下-------------------------------------------------
create table TMP
(
ML_ID NUMBER(38) not null,
L_TYPE VARCHAR2(20),
OP_NAME VARCHAR2(20),
OP_ID VARCHAR2(1000),
OP_SQL VARCHAR2(1000),
PROVIDERID NUMBER(12) not null,
OPERATOR VARCHAR2(40),
OP_DATE TIMESTAMP(6),
LOG_TYPE CHAR(1),
VAR_COL VARCHAR2(40)
)
1. 当列为数值型。
select ml_id from TMP where ml_id='36837053'
select ml_id from TMP where ml_id = 36837053
create index TMP_ml_id on b_log_his200611_2(ml_id) tablespace newhcindex;
select ml_id from TMP where ml_id='36837053'
/
ML_ID
----------
36837053
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=1 Card=1 Bytes=6)
1 0 INDEX (RANGE SCAN) OF 'TMP_ML_ID' (INDEX) (Cost=1 Card=1 Bytes=6)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
0 physical reads
select ml_id from TMP where ml_id = 36837053
ML_ID
----------
36837053
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=1 Card=1 Bytes=6 )
1 0 INDEX (RANGE SCAN) OF 'TMP_ML_ID' (INDEX) (Cost=1 Card=1 Bytes=6)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
4 consistent gets
2. 当列为字符型。
create table tmp as select * from b_log_his200611_2
alter table tmp add var_col varchar2(40);
update tmp set var_col = ml_id;
select ml_id, var_col from tmp
select ml_id from tmp where var_col='36837053'
create index tmp_var_col on tmp(var_col) tablespace newhcindex;
select ml_id from tmp where var_col='36837053'
/
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=1 Card=10 Bytes=350)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TMP' (TABLE) (Cost=1 Card=10 Bytes=350)
2 1 INDEX (RANGE SCAN) OF 'TMP_VAR_COL' (INDEX) (Cost=1 Card=7946)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
5 consistent gets
SQL> select ml_id from tmp where var_col= 36837053 ;
ML_ID
----------
36837053
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=3 Card=10 Bytes=350)
1 0 TABLE ACCESS (FULL) OF 'TMP' (TABLE) (Cost=3 Card=10 Bytes =350)
Statistics
----------------------------------------------------------
165 recursive calls
0 db block gets
9628 consistent gets
0 physical reads
select /*+ RULE INDEX(A tmp_var_col) */ A.ml_id from tmp A where A.var_col= 36837053
/
SQL> /
ML_ID
----------
36837053
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=HINT: RULE
1 0 TABLE ACCESS (FULL) OF 'TMP' (TABLE)
Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
9597 consistent gets
create index tmp_var_col_tonumber on tmp(to_number(var_col)) tablespace newhcindex;
select ml_id from tmp where var_col= 36837053
/
ML_ID
----------
36837053
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=FIRST_ROWS (Cost=1 Card=10 Bytes=350)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TMP' (TABLE) (Cost=1 Card=10 Bytes=350)
2 1 INDEX (RANGE SCAN) OF 'TMP_VAR_COL_TONUMBER' (INDEX) (Cost=1 Card=7946)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
5 consistent gets
0 physical reads
原创 xjwyq28@hotmail.com qq : 123614791