`
xiaoer_1982
  • 浏览: 1864221 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

oracle wrost practics

阅读更多

Oracle最差实践

大量的讨论都是针对Oracle最佳实践的,很少有人讨论最差实践。

http://www.dba-oracle.com/t_worst_practices.htm

DBA的最差实践

欠佳的数据库设计

实用主义至上。<chmetcnv w:st="on" unitname="’" sourcevalue="1980" hasspace="False" negative="False" numbertype="1" tcsc="0"><span lang="EN-US">1980’</span></chmetcnv>s年代磁盘价格$200k/g,数据库设计符合3NF是最佳方法,因为3NF消除冗余,会节省昂贵的磁盘空间。今天磁盘越来越便宜,许多Oracle专家使用denormalization非范式和预连接,数据检索的越来越快。Oracle提供了一系列流行的非范式的工具,一些工具创建了非范式(0NF)的结构。

l 对象表-Oracle提供了嵌套表和varray表,破坏了1NF

l 物化视图-表被预连接在一起,查询被重写为访问物化视图,Oracle快照同步范式表现的数据为非范式。

Oracle提供工具来管理物化视图,每个简单的事务获取都需要8个表连接是一种Oracle最差实践。

l 范式化数据

范式化数据意味着将数据分割到更小的表中,减少冗余,使得检索和管理数据更加高效。一般来说,如果你发现相同的数据位于多行中,就可能需要将这些数据组织到不同的表中。范式化数据的一些优点如下:

ü 节约磁盘存储,更小的表减少了重复数据,使得完整的数据库更小。

ü 易于维护,如果有数据变化,只需要更新一个地方,如果没有采用范式,就必须更新每个保存数据的地方。

ü 减少I/O,要检索需要的数据,会从磁盘中读取更少的数据块。

ü 易于查询,例如,都是保存“张三”这个姓名,并且想查询一下有多少姓张的朋友,如果姓名是作为一个字段来保存,则需要查询所有的以张开头的数据,但是如果姓和名是分开保存的,检索起来就方便多了。

ü 范式化数据的弊端,必须对表做连接才能重建完整的数据集。

l Oracle非范式化数据结构。

冗余的引入可以避免昂贵的表间连接,可以显著的提高Oracle查询的速度。对于Oracle设计专家来说,适当的引入冗余来提高查询的响应速度是一种挑战。那么何时增加冗余呢:

1. 冗余的引入可以减少重复的多表连接要求

2. 列比较少

3. 列是稳定的,很少更新

ü 快照。通过快照,将表的数据复制到不同区域的数据库中,可以极大的提高查询的响应速度,减少跨网络的访问。

ü VARRAYSOracle通过引入VARRAYS表结构,来保存冗余。

ü 物化视图

l Oracle的优化方法

数据库设计和性能的注意事项。最开始设计的Oracle表和索引是影响整个性能最关键的因素,一旦系统在生产环境中运行,几乎是无法改变的。

ü 数据库设计的演化

在最初设计数据库结构时,设计者往往会应用范式,范式可以很好的控制冗余。随着计算机技术的发展,冗余不再是代价昂贵了,设计人员增加一些冗余来提高查询速度。

ü 优化方法概述

数据库优化没有银弹,在优化数据库时,我们可以采用自顶向下的四步优化法。但也不一定完全按照下面的步骤顺序来做,对于一个经过规划的生产库而言,出现12问题的可能性要小于4的可能性,调试TOP SQL会更快见到效果。

<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape id="_x0000_i1025" style="WIDTH: 237pt; HEIGHT: 207.75pt" alt="" type="#_x0000_t75"><imagedata o:href="http://www.dba-oracle.com/images/big_pic.gif" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.gif"></imagedata></shape>

1. 服务器和网络的优化。CPU过载、频繁的内存交换、磁盘I/O瓶颈,当出现这些问题时,应该优先考虑服务器和网络环境的优化。

2. 实例优化。优化Oracle SGA,检查所有的初始化参数,确认配置正确。在这一步主要查找db_block_buffersshared_pool_sizesort_area_size这些参数的配置是否合理。也会考虑一些如optimizer_mode参数的设置。随着Oracle的进步,对SGA的管理也越来越简单。

3. 对象优化。这阶段的优化对象主要是表、索引,调整一些诸如PCTFREEPCTUSEDFREELISTS等参数,Oracle在这方面也逐渐发展,比如使用本地管理表空间替代字典管理表空间。对象优化的范围还应包括存储过程、视图、序列等Oracle对象的优化,如将频繁使用的存储过程锁定到内存中。

4. SQL优化。这是最耗费时间和精力的优化阶段,因为会有成百上千个SQL访问数据库。我们可以针对最常出现问题的SQL进行调整,查看其执行计划,合理的使用hint

不合适的索引

SQL执行过程中,过度 I/O的最主要原因之一就是索引的缺失,特别是基于函数的索引。索引的不适用是最常见的一种最差实践。

ü Blocksize和索引树的结构。多种blocksize会提高Oracle索引的性能,也有案例表明重建索引后查询速度也得到了改善。现在Oracle<chmetcnv w:st="on" unitname="g" sourcevalue="10" hasspace="False" negative="False" numbertype="1" tcsc="0">10g</chmetcnv>的自动管理任务AMT会自动重建索引结构以及收集统计信息。

ü SQL聚集因子优化索引访问。dba_indexes.clustering_factor字段说明了Oracle优化器如何使表数据和索引同步。当这个字段接近数据块数量时,表行与索引同步。列值的可选择性、db_block_size参数和dba_tables.avg_row_len共同帮助优化器决定使用索引还是使用全表扫描。如果某个数据列值的可选择性很高,并且聚集因子很小,则索引扫描通常是执行最快的方法。

<shape id="_x0000_i1026" style="WIDTH: 315pt; HEIGHT: 141pt" alt="index scan" type="#_x0000_t75"><imagedata o:href="http://www.dba-oracle.com/images/art_otn_cbo_f4.gif" src="file:///C:%5CDOCUME~1%5CADMINI~1%5CLOCALS~1%5CTemp%5Cmsohtml1%5C01%5Cclip_image002.gif"><font size="3"></font></imagedata></shape>

当聚集因子很高,db_block_size比较大而avg_row_len比较小的时候,DBA有时周期性的重新调整表行之间的顺序或者使用单表聚集来维护行的顺序。这种方法会将所有临近的行放到一个数据块中,去除全表扫描,查询速度最高可提升30倍。

当聚集因子很高

ü 索引重建I/O等待事件分析

ü 单独的SQL语句优化

不合适的初始化参数

不合适的统计管理

环境配置最差实践

一个服务器只有一个实例

ü 易于维护

ü 更好的共享计算资源

不恰当的变更控制测试

这是最差实践中的最差实践。

不合适的测试环境

导入导出统计值,使开发环境更接近生产环境。

没有变更控制过程

通过版本控制工具来控制过程、代码块、对象等。

没有足够的测试实例

建议要有4个环境,开发环境、测试环境(用于单元测试)、发布前测试环境、产品环境。

没有性能跟踪

使用STATSPACK,在<chmetcnv w:st="on" unitname="g" sourcevalue="10" hasspace="False" negative="False" numbertype="1" tcsc="0"><span lang="EN-US"><font face="Times New Roman">10g</font></span></chmetcnv>中使用AWR来跟踪性能问题。

缺乏安全管理

授权、角色、VPD来堵住安全漏洞。

没有预警机制

OEM有内建的预警机制。

非标准的外部环境

每个数据库使用不同的脚本、不同的别名以及非标准的文件存放位置是非常糟糕的实践。

PL/SQL最差实践

http://gojko.net/oracle/oraclebadprac.pdf

1. 超长的PL/SQL代码

2. 混乱的全局变量

3. 随处可见的SQL语句,对数据访问点封装

4. 起不到作用的异常处理,自定义的异常处理

5. 固定的变量长度和变量类型

6. 没有单元测试代码

7. 大量使用代码值而非代码名称

8. 滥用对象表

9. 不区分包中存储过程的可见性,以及不使用包

10. 不使用版本控制工具管理Oracle对象

11. 大量的IF/ELSE,使用type避免

12. PL/SQL在非自治事务中控制事务

13. 绑定变量

14. 基于函数的索引

15. 慎用ROWNUM=1

16. 慎用动态SQL

17. 异常发生时不判断游标状态

18. ROWID进行直接访问

分享到:
评论

相关推荐

    worst_case_optimization_自适应波束形成_

    "worst_case_optimization_自适应波束形成_"这一标题揭示了我们讨论的主题是关于自适应波束形成的一种特殊策略,即最差性能最优法(Worst-Case Optimization)。 自适应波束形成的目标通常是在多个方向上优化信号...

    worst-case.rar_RAB_Worst-case_worst case_波束 稳健_稳健波束形成

    在IT行业中,尤其是在无线通信和信号处理领域,"worst-case.rar_RAB_Worst-case_worst case_波束 稳健_稳健波束形成"这个标题和描述涉及到的关键技术是"稳健波束形成"(Robust Beamforming)。这是一种优化无线通信...

    Robust beamforming using worst case.m

    利用MATLAB实现了Robust beamforming using worst case,对了最优、SMI、LSMI以及ROB随着信噪比变化,输出SINR的变化

    Worst-Case_Conditional_Value-at-Risk_with_Applicat.pdf

    Zhu, S. , & Fukushima, M. (2009). Worst-case conditional value-at-risk with applica- tion to robust portfolio management. Operations Research, 57 (5), 1155–1168 .

    worst_fit.rar_memory

    "Worst fit"算法是内存分配的一种策略,它与"Best fit"和"First fit"相对应。在此,我们将深入探讨"Worst fit"算法及其在Linux环境下的应用。 "Worst fit"算法的基本思想是:当一个进程请求内存时,系统会遍历所有...

    Worst-Case Analysis of Set Union Algorithms 并查集的最坏情况分析 TARJAN

    并查集是一种数据结构,主要用于处理不相交集合的合并及查询问题,即动态连通性问题。并查集算法的核心在于维护一系列不相交的集合,在每一步操作中,我们可能需要判断两个元素是否属于同一个集合,或者需要把两个...

    tournSelect.rar_worst case

    The proposed distributed enhanced routing approaches which will reduce service disruption and minimize the worst-case maximal link utilization after link failures.

    Worst Practices in SOA

    John Senor在《Worst Practices in SOA》一文中揭示的这些问题,是许多企业在实施SOA过程中经常遇到的陷阱。通过对这些最坏实践的理解和规避,以及借鉴iWay Software提出的响应措施,企业可以更有效地推进SOA项目,...

    worst case VaR and Robust portfolio_A conic programming approach.pdf

    A widely-used uncertainty set is the ellipsoidal set (e.g. Ben-Tal & Nemirovski, 1998; Ghaoui et al., 2003; Gulpinar & Pachamanova, 2013; Gulpinar et al., 2016 ):

    turbo_c.rar_sudoku_worst case_数独_正方形

    数独的规则是: 1. 直行, 横行只能有1~9且不能重复 2. 9个小正方形里也只能有1~9且不能重复. 当使用者输入的资料量过小时, 代表你的程式... 如果程式的起始格不好, 那worst case将会是近似(9!*9)= 3265920可能性要试.

    Oracle 分析函数

    RANK() OVER (ORDER BY SUM(sales) ASC) as worst_sales_rank FROM sales WHERE YEAR(date) = YEAR(CURRENT_DATE) - 1 GROUP BY product_id HAVING RANK() OVER (ORDER BY SUM(sales) DESC) () OVER (ORDER BY ...

    信达生物-The worst is in the rear-view mirror.pdf

    信达生物-The worst is in the rear-view mirror.pdf

    2-sat.rar_2sat_worst case

    标题"2-sat.rar_2sat_worst_case"指出,这个压缩包中的资源与解决2-SAT问题有关,并且特别提到了最坏情况下的时间复杂度。这通常意味着包含的代码或算法是针对解决2-SAT问题的,并且可能会讨论在最坏情况下的性能...

    CAN worst case simulation

    CAN最坏情况仿真 CAN(Controller Area Network,控制器区域网络)是一种常用的汽车总线协议,用于连接汽车的各个控制器单元和感知器件。CAN协议的设计目标是提供一个高效、可靠、灵活的数据总线解决方案,以满足...

    SEO Best And Worst Practices

    在探讨SEO最佳与最差实践时,我们首先要理解SEO(搜索引擎优化)的本质,它是一种提升网站在搜索引擎自然搜索结果中的可见度的技术。以下是从给定文件中提炼的关键知识点,涵盖SEO的最佳实践、最差实践及其解释,...

    内存分配算法,包括first-fit,best-fit等

    * 内存利用率:best-fit 算法和 worst-fit 算法可以尽量减少内存的浪费和碎片化,而 first-fit 算法可能会产生碎片化。 * 算法复杂度:first-fit 算法的算法复杂度最低,而 best-fit 算法和 worst-fit 算法的算法...

    Quick Sort in the worst case

    快速排序(Quick Sort)是一种高效的排序算法,由C.A.R. Hoare在1960年提出。其基本思想是采用分治法(Divide and Conquer),通过一趟排序将待排记录分割成独立的两部分,其中一部分的所有记录都比另一部分的所有...

    worst-hello-world

    标题 "worst-hello-world" 暗示我们可能在探讨一个关于 Python 编程的非典型或不寻常的 "Hello World" 示例。通常,"Hello World" 是初学者编程时接触的第一个简单程序,用于展示语言的基本语法。然而,这个 "最坏...

    Worst Case Scenario-开源

    《最坏情况下的开源策略游戏:Worst Case Scenario》 Worst Case Scenario是一款独特的实时策略游戏,它将经典的RISK棋盘游戏体验与DUNE 2的视觉效果相结合,为玩家提供了一种全新的游戏体验。游戏的核心设计理念...

Global site tag (gtag.js) - Google Analytics