惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
博客园_首页
量子位
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
H
Help Net Security
The Cloudflare Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
A
About on SuperTechFans
腾讯CDC
H
Hackread – Cybersecurity News, Data Breaches, AI and More
D
DataBreaches.Net
L
LangChain Blog
Stack Overflow Blog
Stack Overflow Blog
Jina AI
Jina AI
月光博客
月光博客
云风的 BLOG
云风的 BLOG
博客园 - 聂微东
Hugging Face - Blog
Hugging Face - Blog
雷峰网
雷峰网
C
Check Point Blog
V
V2EX
T
Tailwind CSS Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Microsoft Security Blog
Microsoft Security Blog

博客园 - 雪山之巅

[原创][代码]类似IE设置代理服务器那样的数据快速批量操作业务的实现 [原创]Tree控件的异步加载方案的选择建议(C#,ASP.NET 2.0) [原创]大量数据导出为Excel文件的问题解决(C#,ASP.NET) [转载整理]一本java书的序言——开发历程思绪随笔 在.NET中发送邮件,使用回执功能中遇到问题的解决方法[在NOTES服务器上,C#,.NET2.0环境] powerdesigner中生成数据库脚本时出现长度限制问题的解决方法 - 雪山之巅 - 博客园 [转]数据库存储过程中利用extproc调用共享程序库/动态链接库,间接可以实现调用操作系统命令 VS2005无法调试,绑定句柄无效问题的解决方法 部署Excel相关的应用程序过程中遇到“检索COM类工厂中CLSID...”的两个错误的解决方法 [原创][开源]整合梅花雨日历控件,推出.NET版本 两个读取数据库VIew的定义的SQL语句的写法[Oracle /SQL SERVER] [SQL使用经验]选用 IN 还是 EXISTS,哪个性能更好 [笔记]4.软件规模和开发的关系 [笔记]3.软件代码中的BUG问题的一些记录 [笔记]2.软件质量的一些统计数据 [笔记]1.软件的质量特性characteristics of software quality 一个简单的UrlRewrite示例[演示用,写给同事看的,VS2003环境] Oracle中隐式游标和显式游标的教训[同事的经历] VS2003中自定义控件的智能提示解决方案备忘
[原创]Oracle数据库性能优化的方案[有删节]
雪山之巅 · 2006-12-22 · via 博客园 - 雪山之巅

本方案在实际的问题处理中有着不错的效果,只使用了方案中的部分措施,已经提高了几百倍的性能。特别是一个关于三张百万数据的表联合查询并经过业务运算后,再单个事务提交130万行数据写入的存储过程,由原来的几小时无法执行完成,变成119秒完成。因此这里给初学者分享经验的同时,希望得到数据库高手们的进一步指点。

1      问题
XXXXXXX系统是一个业务数据处理集中,单事务中有很多百万级别大批量的数据操读写和查询操作。

目前性能比较低,部分运算步骤需要长时间运行。超过30分钟以上,甚至个别过程运算1.5小时无结果。

2      目的
本文试图做一些特定分析,并针对性提出性能的优化和改进方案;

3      分析
3.1     分析方法
l         使用性能检测日志

l         使用Oracle管理控制台的锁查看机制

l         SQL状态跟踪

l         数据库scheme浏览

3.2     分析结果
l         目前整个运算逻辑已经全部使用Oracle存储过程。

l         使用显式游标。并尽量使用了批量操作方式提高性能。

l         数据库索引建立不够合理。

l         目前一期的数据就会在多个单表删除或者插入26万到105万的数据

l         没有数据历史表,也没有后台自动运行机制。

4      改进措施
4.1     优先使用的方法
4.1.1              索引的建立
l         字典类表的数据量比较小,查询中使用较多,需要把查询时相关的字段全部建立索引。适合数据量小于5000以下的情况。

l         经过测试发现,实际运行的数据多为字符串型。并且字符串的前半部分内容几乎一样,后半部分差异较大。因此推荐索引类型为——反向B树索引。

l         大数据量的表因为往往在一次事务中,提交百万级别的数据。建议建立在insert操作前DROP索引,insert后创建新的索引。虽然索引的创建和删除也消耗时间。但中间的空白块的消除,会对性能提高有好处。

【备注:大数据量的表建立索引一定要尽量少和高效】

4.1.2              物化视图的使用
在数据需要变更时再REFRESH视图,节省每次都动态查询带来的额外开销。

【备注:可以视情况,为物化视图创建索引,进一步提高检索速度】

4.1.3              临时表的使用
和物化视图类似,但有几个特别的特点。

l         是减少REDO日志的开销。

l         是不需要物理存储到硬盘上,减少磁盘操作时间。

l         如果是需要每次重建数据的场合,不需要删除数据的时间开销。

【关联措施:参见4.2.1】

4.1.4              经济的使用字段大小设计。
避免数据库空间浪费带来的性能开销。

4.1.5              避免不必要的字段函数处理后的关联查询
注意建立函数索引或者取消函数处理后的关联。避免全表扫描。

4.2     数据库服务器的改进措施
4.2.1              建立使用9.20以上版本的Oracle数据库
因为这样可以较好的支持临时表,使用临时表大幅度减少REDO日志的开销。

4.2.2              使用RAID策略,成倍加快硬盘IO操作
可以同时分写不同的数据库硬盘,并行操作。

4.2.3              将大的数据表分散建立在多个硬盘上,提高并行能力
分区建表。

4.2.4              建立单独的数据索引空间
提高索引大数据量时候的性能。

4.3     进一步改进的方法
4.3.1              历史数据系列表的建立,分散单表的数据压力
随着系统使用时间的发展,数据量还会进一步加大。不分表将无法支持。另外业务特性决定了每期的关联不十分紧密,适合建立历史数据表。

由于数据库设计的改动将导致处理逻辑的变化,带来开发和测试的一定工作量。

【提示:历史表的一个附加的好处是,遇到数据整期清除的时候,可以使用TRUNCATE,性能将会比目前使用的DELETE提高许多倍,而且数据量越大,索引越多,效果差别越大】

4.3.2              数据表建议重新以性能为优先重新设计
目前全是INSERT、SELECT、DELETE,应该合理使用UPDATE。

4.3.3              建立后台运行机制
做后台运行机制,并给出运行大致进度比例。

4.3.4              单无意义字段标识代替联合字段标识
发现有多个大表都使用六到八个字段作为数据唯一的标识,建议用单个无意义字段代替。这个涉及开发测试工作,所以放在进一步的工作建议里。

5      最后补充
从系统长远使用考虑,建议相关人员能逐步完成所有的优化工作。