- 浏览: 160625 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
钱少少:
programming 写道和maven相比没优势
ivy只是 ...
ant+ivy管理项目 -
programming:
和maven相比没优势
ant+ivy管理项目 -
钱少少:
kingsfighter 写道和maven相比,有什么优势?
...
ant+ivy管理项目 -
kingsfighter:
和maven相比,有什么优势?
ant+ivy管理项目 -
zhijie_zhang:
搭建java-web框架(一)
BI系统运行一段时间后性能明显变慢了肿么办施系统慢数据库优化
【问题描述】
系统在运行了一段时间以后,在没有变更程序,且数据量没有大幅增加的时候,系统的执行效率明显变慢了肿么办?是求助研发人员,然后各种扯皮、谩骂乃至人生攻击?还是自已动手,丰衣足食?
【问题分析】
如果没有升级程序(为什么每次升级程序总是会让系统变得更糟而不是更好呢?这是一个值得研究的问题),数据量又没有大幅增加,系统硬件环境也没有变化,那么这个现象很可能是数据库本身的问题,引起数据库变慢的原因有很多,以下是几个比较可能的原因:
1、 数据库在进行了大量的删除、插入、更新后(ETL经常会干这个事情),由于数据库里不完全从物理上删除相应的数据,所以会导致表里占用了很多无用的物理块,表的索引中也会存在很多废弃的索引键,因此会导致访问表的时候额外读取了很多的数据块(block),包括表和索引,增加了IO的代价,因此效率降低,所以这就是为什么清表的时候一定要用truncate table而不要用delete from table方式的原因;
2、 Oracle是基于代价(cost)的优化模式,也就是oracle会根据数据库的统计信息(如表有多少条记录、有哪些索引、占用了多少数据块)对执行SQL各种可能的路径进行分析,从而在其中找到一个oracle认为最优的执行计划进行查询,但是在对数据进行了大量的删除、插入、更新后会导致数据库的统计信息越来越不准确,从而导致oracle误判,选择了一个较差的执行计划,引起执行效率降低;
3、 在对记录进行更新(update)的时候,由于记录都是一行一行紧密地存储在物理块(block)中的,因此当新update的记录比原来更长(占用的字节byte更多)的时候,在该记录原有的位置已经无法容纳该记录了,这时候oracle就会把记录迁移到另一个空闲的块中,并在原有的位置记录一个链接,指向新的块地址,这就叫行迁移,这样当数据被经常这样长期的蹂躏后,物理数据的存储就会变得非常乱,到处都是各种指针,导致数据库读取数据的效率变低;
4、 操作系统或者数据库都是按block(还记得安装oracle的时候可以改的block_size吗?)进行管理的,也就是oracle每次读数据的时候都会读block_size的整数倍。当某一条记录无法被完全放进一个block的时候,就会产生行链接,将一条记录的一部分存在block1里,另一部分存在block2里,并在block1里记录一个指向block2的指针,这样当数据被经常这样长期的蹂躏后,物理数据的存储就会变得非常乱,到处都是各种指针,导致数据库读取数据的效率变低。
【问题解决】
实施人员应该养成定期生成新的数据库统计信息的习惯,最简单的方法是重新生成所有表的统计信息,用“analyze table xxx compute statistics;”这个语法,注意对于大表来说这个语句的执行会较慢,因此应该在夜深人静的时候执行。
实施人员应该经常关注数据库的碎片情况(行链接和行迁移),以便及时优化数据库,检查碎片情况可以用下面的语句:analyze table xxx list chained rows into chained_rows。注意“chained_rows”是一张物理表,默认是不生成的,可以用这个脚本来生成:$ORACLE_HOME/rdbms/admin/utlchain.sql。
解决的方法如下:
1、 定期重新生成统计信息:
1) select ‘analyze table ‘||owner||’.’||table_name||’ validate structure ;’ from dba_tables where owner=’XXXX’ ;
2) select ‘analyze index ‘||owner||’.’||index_name||’ compute statistics;’ from dba_tables where owner=’XXXX’;
3) 将上述语句的查询结果放到sqlplus里执行一遍,当然最好的方式是用oracle的批命令来做,怎么用批命令自己上网搜去,下面提供一个例子:
分析所有表.txt
SET HEADING OFF
SET FEEDBACK OFF
select 'analyze table bi_fbk."'||table_name||'" delete statistics;' from dba_tables where owner='BI_fbk'
SPOOL C:\1.SQL
/
SPOOL OFF
SET FEEDBACK ON
start C:\1.SQL
SET HEADING ON
然后在sqlplus中调用上面的文本:“sql > @分析所有表.txt”
2、 清除行链接和行迁移,这有几种方法:
1) 用exp/imp的方式把表(可以单表操作,也可以全库操作)重新导一遍,则会重新生成新的数据存储;
2) 先将原表的数据移到备份表,再移回来即可:
1. create table 备份表 as select * from 原表;
2. truncate table 原表;
3. insert into 原表 select * from 备份表;
4. drop table 备份表。
3) 建一个备份表空间,将事实表从源表空间移到备份表空间,再从备份表空间移回原表空间,步骤如下:
1. Alter table xxx move tablespace 备份表空间;
2. Alter table xxx move tablespace 原表空间;
3. 重建该表的所有索引(否则表无法正常访问):
Alter index xxx rebuild;
【问题描述】
系统在运行了一段时间以后,在没有变更程序,且数据量没有大幅增加的时候,系统的执行效率明显变慢了肿么办?是求助研发人员,然后各种扯皮、谩骂乃至人生攻击?还是自已动手,丰衣足食?
【问题分析】
如果没有升级程序(为什么每次升级程序总是会让系统变得更糟而不是更好呢?这是一个值得研究的问题),数据量又没有大幅增加,系统硬件环境也没有变化,那么这个现象很可能是数据库本身的问题,引起数据库变慢的原因有很多,以下是几个比较可能的原因:
1、 数据库在进行了大量的删除、插入、更新后(ETL经常会干这个事情),由于数据库里不完全从物理上删除相应的数据,所以会导致表里占用了很多无用的物理块,表的索引中也会存在很多废弃的索引键,因此会导致访问表的时候额外读取了很多的数据块(block),包括表和索引,增加了IO的代价,因此效率降低,所以这就是为什么清表的时候一定要用truncate table而不要用delete from table方式的原因;
2、 Oracle是基于代价(cost)的优化模式,也就是oracle会根据数据库的统计信息(如表有多少条记录、有哪些索引、占用了多少数据块)对执行SQL各种可能的路径进行分析,从而在其中找到一个oracle认为最优的执行计划进行查询,但是在对数据进行了大量的删除、插入、更新后会导致数据库的统计信息越来越不准确,从而导致oracle误判,选择了一个较差的执行计划,引起执行效率降低;
3、 在对记录进行更新(update)的时候,由于记录都是一行一行紧密地存储在物理块(block)中的,因此当新update的记录比原来更长(占用的字节byte更多)的时候,在该记录原有的位置已经无法容纳该记录了,这时候oracle就会把记录迁移到另一个空闲的块中,并在原有的位置记录一个链接,指向新的块地址,这就叫行迁移,这样当数据被经常这样长期的蹂躏后,物理数据的存储就会变得非常乱,到处都是各种指针,导致数据库读取数据的效率变低;
4、 操作系统或者数据库都是按block(还记得安装oracle的时候可以改的block_size吗?)进行管理的,也就是oracle每次读数据的时候都会读block_size的整数倍。当某一条记录无法被完全放进一个block的时候,就会产生行链接,将一条记录的一部分存在block1里,另一部分存在block2里,并在block1里记录一个指向block2的指针,这样当数据被经常这样长期的蹂躏后,物理数据的存储就会变得非常乱,到处都是各种指针,导致数据库读取数据的效率变低。
【问题解决】
实施人员应该养成定期生成新的数据库统计信息的习惯,最简单的方法是重新生成所有表的统计信息,用“analyze table xxx compute statistics;”这个语法,注意对于大表来说这个语句的执行会较慢,因此应该在夜深人静的时候执行。
实施人员应该经常关注数据库的碎片情况(行链接和行迁移),以便及时优化数据库,检查碎片情况可以用下面的语句:analyze table xxx list chained rows into chained_rows。注意“chained_rows”是一张物理表,默认是不生成的,可以用这个脚本来生成:$ORACLE_HOME/rdbms/admin/utlchain.sql。
解决的方法如下:
1、 定期重新生成统计信息:
1) select ‘analyze table ‘||owner||’.’||table_name||’ validate structure ;’ from dba_tables where owner=’XXXX’ ;
2) select ‘analyze index ‘||owner||’.’||index_name||’ compute statistics;’ from dba_tables where owner=’XXXX’;
3) 将上述语句的查询结果放到sqlplus里执行一遍,当然最好的方式是用oracle的批命令来做,怎么用批命令自己上网搜去,下面提供一个例子:
分析所有表.txt
SET HEADING OFF
SET FEEDBACK OFF
select 'analyze table bi_fbk."'||table_name||'" delete statistics;' from dba_tables where owner='BI_fbk'
SPOOL C:\1.SQL
/
SPOOL OFF
SET FEEDBACK ON
start C:\1.SQL
SET HEADING ON
然后在sqlplus中调用上面的文本:“sql > @分析所有表.txt”
2、 清除行链接和行迁移,这有几种方法:
1) 用exp/imp的方式把表(可以单表操作,也可以全库操作)重新导一遍,则会重新生成新的数据存储;
2) 先将原表的数据移到备份表,再移回来即可:
1. create table 备份表 as select * from 原表;
2. truncate table 原表;
3. insert into 原表 select * from 备份表;
4. drop table 备份表。
3) 建一个备份表空间,将事实表从源表空间移到备份表空间,再从备份表空间移回原表空间,步骤如下:
1. Alter table xxx move tablespace 备份表空间;
2. Alter table xxx move tablespace 原表空间;
3. 重建该表的所有索引(否则表无法正常访问):
Alter index xxx rebuild;
发表评论
-
Oracle同义词创建及其作用
2014-03-05 10:30 670Oracle的同义词(synonyms)从字面上理解就是别名 ... -
oracle中将列转化为行
2012-10-25 11:40 908oracle 10g以后 wm_concat函数的运用 准备 ... -
索引的运用
2012-09-18 17:48 1257索引整理 SQL语法整理——索引 什么是索引 数据 ... -
ORACLE PL/SQL编程之八:(触发器经典实例(全))
2012-08-03 13:54 984ORACLE PL/SQL编程之八: ... -
oracle触发器详解实例
2012-08-03 13:36 1509语法规则: Create [or replace] trigg ... -
JNDI全面总结 (tomact中配置连接池)
2012-08-02 12:42 3965JNDI全面总结 原理: 在DataSo ... -
ORACLE中函数和存储过程的区别
2012-07-20 15:40 1038函数和存储过程的区别 从参数的返回情况来看: 如果返 ... -
pl_sql中函数的基本运用
2012-05-16 17:42 8241基本函数 create or replace functio ... -
plsql中利用函数将一个逗号分隔字符串转义返回单个的列
2012-04-05 15:12 52951.传进去一个字符串,类似于'123,456'; CREATE ... -
sql中的having和where的作用
2012-02-24 16:39 1407例子: select max(orgid) from au ... -
pl-sql中函数循环插入值方式一
2012-02-14 10:39 1687create or replace function F_TE ... -
给表中增加一列或者修改列类型,大小脚本
2012-02-13 16:27 1049修改表中的某列: alter table tablename ... -
sql语句-创建索引
2012-02-07 15:59 1026语法: CREATE [索引类型] INDEX 索引名称 ON ... -
(转)SQL 优化原则(精)
2012-02-07 15:47 782(转)SQL 优化原则 一、问题的提出 在应用系统开发 ... -
pl-sql中关于函数test及存储过程中调用function函数
2012-02-07 15:20 2201对于存储过程可以直接反键test 但是对于函数就要先在过程中 ... -
UNDO_RETENTION
2011-12-28 14:01 2221深度理解Oracle10g中UNDO_RETENTION参数 ... -
oracle中恢复表数据及相关设置
2011-12-28 14:00 989>1、从flash back里查询被删除的表 ... -
oracle中死锁及解锁
2011-12-21 17:48 2663SELECT OBJECT_ID,SESSION_ID,SER ... -
sqlserver和oracle中去除某一字段中重复字节,以逗号分隔
2011-12-15 16:19 2760sqlserver: create function ren ... -
树状数据库表:Oracle中start with...connect by prior子句用法
2011-12-15 15:57 1409Oracle中start with...connect by ...
相关推荐
当系统运行期间发生异常时,通过观察这部分数据能够判断故障发生的具体原因,提升组态软件的稳定性。数据接收后会进入到运行模块中,服务器采集到数据变化后会在运行环境内进行搜索,快速完成数据整理任务,通过运行...
使用间隔 平均多长时间启动/使用一次app 用户对app的依赖程度 各个时间段启动app人数分布 用户行为 短期点击行为、搜索行为、收藏行为 等级分析 各个等级平均耗时 用户成长速度 需要严格控制高端用户成长速度 各个...
用户在什么节点来的多,需要重点监控该时间段app运行 用户画像 概述 是什么,有什么用,怎么做 构建用户画像的核心工作即是给用户贴“标签”,而标签是通过对用户信息分析而来的高度精炼的特征标识 作用 精准...
6.2 系统运行环境搭建及配置 34 6.2.1 AndroidManifest.xml主程序环境配置 34 6.2.2 移动端工程资源布局 35 6.3 认我测在线认证检测系统的主要功能实现 36 6.3.1用户查询 36 6.3.2订单操作 37 6.3.3个人信息维护 37 ...
ERP实施成功的标志是系统运行集成化、业务流程合理化、绩效监控动态化、管理改善持续化。成功实施ERP会给企业带来看得见的效益,会使市场反应速度加快,产品生产周期加快,资金周转速度加快,客户满意度提高,产品...
<br> 一、前言 由于软硬件技术的不断提升,嵌入式系统正在以前所未有的速度进入生产生活的各个领域。无论是 日常生活中人们使用的智能手机、Pocket PC还是军用的便携设备、导弹,嵌入式系统都...
一个时间转换的问题,顺便谈谈搜索技巧 .net中的正则表达式使用高级技巧 (一) C#静态成员和方法的学习小结 C#中结构与类的区别 C#中 const 和 readonly 的区别 利用自定义属性,定义枚举值的详细文本 Web标准和ASP...
<<page 1>> page begin==================== 目 目目 目 录 录录 ...第一部分 C#语言概述.4 ...第一章 ...第一章第一章 ...第一章 .NET 编 ... 1.1 Microsoft.NET——一场新的革命.4 ...这一天 微软公司正式推出了其下一代...
利用大数据技术加快内部数据处理速度 效率提升 依据客户消费习惯、地理位置、消费时间进行推荐 精准营销 利用数据分析报告实施产业信贷风险控制 决策支持 利用大数据计算技术为财富客户推荐产品,利用客户行为数据...
数据产⽣⽅式的变⾰促成⼤数据时代的来临 运营式系统阶段——数据产⽣⽅式是被动的 ⽤户原创内容阶段——数据产⽣⽅式是主动的 感知式系统阶段——⼤数据的产⽣(物联⽹、云计算和⼤数据) 物联⽹底层是感知层,如:...
最后 在营销活动结束后,应该对营销活动执行过程中收集到的各种数据进行综合分析,通过 在海量数据中发掘出最有效的企业市场绩效度量,并且对营销活动的执行进行评估总结 ,为下一阶段的营销活动打下良好的基础。...
件,一段时间下来,发现不过如此,挺简单好用,但是你真正理解 J2EE 了吗?你在具体案例中的应用是否也是在延伸 J2EE 的思 想? 如果你不能很好的延伸 J2EE 的思想,那你岂非是大炮轰蚊子,认识到 J2EE 不是适合...
注2013/3/4:有一小部分下载链接失效,经查是由于未知原因被百度网盘禁止分享了,请过一段时间再试。 ADT Bundle 多合一下载包,里面包含了:sdk + 特定版本platform + eclipse + adt + 兼容包,解压缩即可使用。...