`

数据库优化之我见

 
阅读更多
a. 数据库配置
   包括sga配置:数据缓存,共享池等。
      数据缓存可以根据需要来设定缓存策略,比如keep,recyle,defaultcelve。
      共享池的库缓存与sql的缓存相关。
b. 表结构的设计
    主键外键,索引。
    纵向拓展:表分区,垂直分库
    横向拓展:表分片

c. sql优化
    访问Table的方式
    变量绑定
3.       共享SQL语句
4. 选择最有效率的表名顺序(只在基于规则的优化器中有效)
5.       WHERE子句中的连接顺序.
6.     SELECT子句中避免使用 ‘ * ‘
7.     减少访问数据库的次数
    当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算
    索引的利用率, 绑定变量 , 读数据块等等. 由此可见, 减少访问数据库的
    次数 , 就能实际上减少ORACLE的工作量.
10.       删除重复记录

最高效的删除重复记录方法 ( 因为使用了ROWID)

DELETE FROM EMP E

WHERE E.ROWID > (SELECT MIN(X.ROWID)

                   FROM EMP X

                   WHERE X.EMP_NO = E.EMP_NO);

11.       用TRUNCATE替代DELETE
    当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息.
    如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况)

    而当运用TRUNCATE时, 回滚段不再存放任何可被恢复的信息.当命令运行后,数据不能被恢复.
    因此很少的资源被调用,执行时间也会很短.

(译者按: TRUNCATE只在删除全表适用,TRUNCATE是DDL不是DML)
14.       用Where子句替换HAVING子句

     避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理
     需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销.

例如:

     低效:

     SELECT REGION,AVG(LOG_SIZE)

     FROM LOCATION

     GROUP BY REGION

     HAVING REGION REGION != ‘SYDNEY’

     AND REGION != ‘PERTH’

     高效

     SELECT REGION,AVG(LOG_SIZE)

     FROM LOCATION

     WHERE REGION REGION != ‘SYDNEY’

     AND REGION != ‘PERTH’

     GROUP BY REGION

(译者按: HAVING 中的条件一般用于对一些集合函数的比较,如COUNT() 等等. 除此而外,一般的条件应该写在WHERE子句中)

15.       减少对表的查询

在含有子查询的SQL语句中,要特别注意减少对表的查询.  
17.       使用表的别名(Alias)

   当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.
   这样一来,就可以减少解析的时间并减少那些由Column歧义引起的语法错误.
25.       用索引提高效率

索引是表的一个概念部分,用来提高检索数据的效率. 实际上,ORACLE使用了一个
复杂的自平衡B-tree结构. 通常,通过索引查询数据比全表扫描要快. 当ORACLE找
出执行查询和Update语句的最佳路径时, ORACLE优化器将使用索引. 同样在联结多
个表时使用索引也可以提高效率. 另一个使用索引的好处是,它提供了主键(primary key)的
唯一性验证.

除了那些LONG或LONG RAW数据类型, 你可以索引几乎所有的列. 通常, 在大型
表中使用索引特别有效. 当然,你也会发现, 在扫描小表时,使用索引同样能提
高效率.

虽然使用索引能得到查询效率的提高,但是我们也必须注意到它的代价. 索引需要空间来

存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时, 索引本身也会被修
改. 这意味着每条记录的INSERT , DELETE , UPDATE将为此多付出4 , 5 次的磁盘I/O .
因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢.

译者按:

定期的重构索引是有必要的.

ALTER INDEX <INDEXNAME> REBUILD <TABLESPACENAME>

26.       索引的操作

ORACLE对索引有两种访问模式.

索引唯一扫描 ( INDEX UNIQUE SCAN)

大多数情况下, 优化器通过WHERE子句访问INDEX.

例如:

表LODGING有两个索引 : 建立在LODGING列上的唯一性索引LODGING_PK和建立在MANAGER列上的非唯一性索引LODGING$MANAGER. 

SELECT *

FROM LODGING

WHERE LODGING = ‘ROSE HILL’;

   在内部 , 上述SQL将被分成两步执行, 首先 , LODGING_PK 索引将通过索
   引唯一扫描的方式被访问 , 获得相对应的ROWID, 通过ROWID访问表的方
   式 执行下一步检索.

   如果被检索返回的列包括在INDEX列中,ORACLE将不执行第二步的处理(通
   过ROWID访问表). 因为检索数据保存在索引中, 单单访问索引就可以完
   全满足查询结果.

   下面SQL只需要INDEX UNIQUE SCAN 操作.       

        SELECT LODGING

        FROM  LODGING

WHERE LODGING = ‘ROSE HILL’;

  索引范围查询(INDEX RANGE SCAN)

      适用于两种情况:

1.       基于一个范围的检索

2.       基于非唯一性索引的检索

例1:

      SELECT LODGING

      FROM  LODGING

WHERE LODGING LIKE ‘M%’;

WHERE子句条件包括一系列值, ORACLE将通过索引范围查询的方式
查询LODGING_PK . 由于索引范围查询将返回一组值, 它的效率就
要比索引唯一扫描低一些. 

例2:

      SELECT LODGING

      FROM  LODGING

WHERE MANAGER = ‘BILL GATES’;

  这个SQL的执行分两步, LODGING$MANAGER的索引范围查询(得到所有符合
  条件记录的ROWID) 和下一步同过ROWID访问表得到LODGING列的值. 由于
  LODGING$MANAGER是一个非唯一性的索引,数据库不能对它执行索引唯一扫描. 

  由于SQL返回LODGING列,而它并不存在于LODGING$MANAGER索引中, 所以在
  索引范围查询后会执行一个通过ROWID访问表的操作. 

  WHERE子句中, 如果索引列所对应的值的第一个字符由通配符(WILDCARD)开始, 索引将不被采用.

SELECT LODGING

      FROM  LODGING

WHERE MANAGER LIKE ‘%HANMAN’;

在这种情况下,ORACLE将使用全表扫描.

27.       基础表的选择

基础表(Driving Table)是指被最先访问的表(通常以全表扫描的方式被访问).
根据优化器的不同, SQL语句中基础表的选择是不一样的.
28.       多个平等的索引

当SQL语句的执行路径可以使用分布在多个表上的多个索引时, ORACLE会同时
使用多个索引并在运行时对它们的记录进行合并, 检索出仅对全部索引有效的记录.

在ORACLE选择执行路径时,唯一性索引的等级高于非唯一性索引. 然而这个规则只有

当WHERE子句中索引列和常量比较才有效.如果索引列和其他表的索引类相比较. 这种
子句在优化器中的等级是非常低的.

如果不同表中两个想同等级的索引将被引用, FROM子句中表的顺序将决定哪个会被率
先使用. FROM子句中最后的表的索引将有最高的优先级.

如果相同表中两个想同等级的索引将被引用, WHERE子句中最先被引用的索引将有最高的优先级.

举例:

     DEPTNO上有一个非唯一性索引,EMP_CAT也有一个非唯一性索引.

     SELECT ENAME,

     FROM EMP

     WHERE DEPT_NO = 20

     AND EMP_CAT = ‘A’;

这里,DEPTNO索引将被最先检索,然后同EMP_CAT索引检索出的记录进行合并. 执行路径如下:

TABLE ACCESS BY ROWID ON EMP

    AND-EQUAL

        INDEX RANGE SCAN ON DEPT_IDX

        INDEX RANGE SCAN ON CAT_IDX

29.        等式比较和范围比较

     当WHERE子句中有索引列, ORACLE不能合并它们,ORACLE将用范围比较.

     举例:

     DEPTNO上有一个非唯一性索引,EMP_CAT也有一个非唯一性索引.

     SELECT ENAME

     FROM EMP

     WHERE DEPTNO > 20

     AND EMP_CAT = ‘A’;   

     这里只有EMP_CAT索引被用到,然后所有的记录将逐条与DEPTNO条件进行比较. 执行路径如下:

     TABLE ACCESS BY ROWID ON EMP

           INDEX RANGE SCAN ON CAT_IDX
30.       不明确的索引等级

当ORACLE无法判断索引的等级高低差别,优化器将只使用一个索引,它就是在WHERE子句中被列在最前面的.

     举例:

     DEPTNO上有一个非唯一性索引,EMP_CAT也有一个非唯一性索引.    

     SELECT ENAME

     FROM EMP

     WHERE DEPTNO > 20

     AND EMP_CAT > ‘A’;

     这里, ORACLE只用到了DEPT_NO索引. 执行路径如下:    

     TABLE ACCESS BY ROWID ON EMP

          INDEX RANGE SCAN ON DEPT_IDX
32.       避免在索引列上使用计算.

WHERE子句中,如果索引列是函数的一部分.优化器将不使用索引而使用全表扫描.

举例:

低效:

SELECT …

FROM DEPT

WHERE SAL * 12 > 25000;

高效:

SELECT …

FROM DEPT

WHERE SAL  > 25000/12;

译者按:

这是一个非常实用的规则,请务必牢记
34.       避免在索引列上使用NOT

通常, 我们要避免在索引列上使用NOT, NOT会产生在和在索引列上使用函数相同的

影响. 当ORACLE”遇到”NOT,他就会停止使用索引转而执行全表扫描.
35.       用>=替代>

如果DEPTNO上有一个索引, 

高效:

   SELECT *

   FROM EMP

   WHERE DEPTNO >=4  

   低效:

   SELECT *

   FROM EMP

   WHERE DEPTNO >3

      两者的区别在于, 前者DBMS将直接跳到第一个DEPT等于4的记录而后者将首先定
      位到DEPTNO=3 的记录并且向前扫描到第一个DEPT大于3的记录.
分享到:
评论

相关推荐

    mysql面试题史上最强汇总:基础知识+性能优化+备份与恢复+ 数据库设计+数据库管理+高可用性与容灾+安全性+ 框架集成等

    MySQL 是最常用的关系型数据库管理系统之一,因此在招聘和面试过程中 MySQL 相关的问题经常会被问到。以下是 MySQL 面试题的一些分类,完整内容见压缩文件: 1. 基础知识:包括 MySQL 数据库的基本概念、SQL 命令、...

    php版mysql大数据库备份和恢复工具

    在原faisunSQL 4.0的基础上,针对数据备份过程中出现乱码的问题,做了优化. 增强的功能: 1.自动识别数据库版本,对于MySQL 4.1以上,备份数据时提示选择字符集. 2.导入数据时,提示原数据库编码,并自动识别. 3.增加...

    phpmysql数据库备份代码

    在原faisunSQL 4.0的基础上,针对数据备份过程中出现乱码的问题,做了优化. 增强的功能: 1.自动识别数据库版本,对于MySQL 4.1以上,备份数据时提示选择字符集. 2.导入数据时,提示原数据库编码,并自动识别. 3.增加...

    数据库课程设计(5).doc

    我就觉得或许我可以弄一个用于交易大家闲置 " "的二手商品的数据库,方便大家查找和交易,所以我设计了这个数据库。 " " " "概念模型设计阶段 " "当我在草稿纸上涂涂改改了三个版本之后,我开始了powerdesign的建模...

    TiDB数据库从入门到实践视频教程

    手把手视频详细讲解项目开发全过程,需要的小伙伴自行百度网盘下载,链接见附件,永久有效。 课程简介 手把手一步步从零开始安装搭建TiDB数据库,从原理架构到实际操作,实现真正的入门到实践 课程亮点 1,理论+...

    东北大学软件学院程序实践(四)数据库实验报告

    3.写SQL语句检索两个出版人之一(比如说是Addison Wesley和McGraw Hill)所出版书籍的标题和价格,列出你所用到的所有选择、投影和连接操作,并说明各个操作在查询中的作用; 4.写SQL语句,检索特定书名(比如说...

    数据库系统管理制度V1.0.doc

    总 则 第一条 为加强我司数据库管理,保障数据库正常、有效运行,确保数据库安全,使数据库能更 好地服务于生产,特制定本管理制度。 第二条 公司数据库管理员负责评级数据库的日常维护和运行管理。 第三条 公司IT...

    mysql数据库规范.docx

    规范名称 具体内容 解释 基础规范 使用InnoDB存储引擎 支持事务、行级锁、并发性能更好、CPU及内存缓存页优化使得资源利用率更高 新库使用utf8mb4字符集 万国码,无需转码,无乱码风险,节省空间 数据表、数据字段...

    关于数据库查询优化的思考

    我现在要把它存放在数据库中,然后从数据库中将其取出来放在GridView中分页显示。  我现在以一种我所见过的常见的思维方式来一步一步模拟这个实现过程。  第一步:建立新闻数据表。  在这一步,很多人都会...

    数据库管理系统(DBMS)

    5、数据信息文件存储在E:\\data目录下,具体设置见源程序(DBMS)下init.ini文件; 5、数据库系统原理文档记录:设计报告; 6、用户名、密码均在源程序 (DBMS) 下的user.ini文件中,超级管理员用户名:root,密码:...

    数据库系统管理制度V1.0(1).doc

    总 则 第一条 为加强我司数据库管理,保障数据库正常、有效运行,确保数据库安全,使数据库能更 好地服务于生产,特制定本管理制度。 第二条 公司数据库管理员负责评级数据库的日常维护和运行管理。 第三条 公司IT...

    通用数据库分析工具

    4.优化一些操作控制,如没有连接数据库不能进行一些的操作禁止了 5.在菜单窗口中,每新增子窗口都可以在菜单中显示 6.消除了导出数据时,打开多个导出数据的窗口报错,限制为一个窗口 7.目前支持MSSQL的数据导出...

    数据库设计规范V.docx

    本规范的适用IT范围包括数据库对象的命名规范、设计原则、SQL语句的设计和使用、SQL语句的性能优化建议、其他与性能有关的设计原则以及设计工具的选择。 命名规范 通用规范 不同的数据库产品对对象的命名有不同的...

    数据库系统概论王珊第四版答案第一章.doc

    外模式,亦称子模式或用户模式,是数据库用户(包括应用程序员和最终用户)能够看 见和使用的局部数据的逻辑结构和特征的描述,是数据库用户的数据视图,是与某一应 用有关的数据的逻辑表示。模式,是数据库中全体...

    空间数据库的设计.doc

    简 言之,数据库设计就是把现实世界中一定范围内存在着的应用数据抽象成一个数据库的 具体结构的过程。 空间数据库的设计是指在现在数据库管理系统的基础上建立空间数据库的整个过程 。主要包括需求分析、结构设计、...

    数据库物理设计.pdf

    数据库主键:优化数据存储。(Innodb会⽣成6个字节的隐含主键) 2、根据数据库的类型,考虑主键是否需要顺序增长。 3、主键的字段类型所占空间要尽可能⼩。 避免使⽤外键约束: 1、降低数据导⼊的效率 2、增加维护...

    精通SQL数据库连接.doc

    通常地,JOIN声明或者从左至右处理(以在查询中出现顺序为序),或者由数据库查询优化器在执行前决定。 一些数据库,如SQL Server, Oracle和DB2也支持JOIN HINT关键字的概念。这些关键字被插入到JOIN声明中来控制...

    性能超越Redis的NoSQL数据库SSDB.zip

    SSDB 是一个 C/C 语言开发的高性能 NoSQL 数据库, 支持 zset(sorted set), map(hash), kv, list 等数据结构, 用来替代或者与 Redis 配合存储十亿级别列表的数据. SSDB 在 QIHU 360 被大量使用, 同时也被国内外业界...

    数据库设计规范.pdf

    今天我就简单整理⼀下,帮⾃⼰做个总结梳理,也希望可以帮到⼩伙伴们。 数据库设计规范包括命名规范、库表基础规范、字段规范、索引规范和SQL设计规范。 1. 命名规范 1.1 库名、表名、字段名禁⽌使⽤MySQL保留字。 ...

Global site tag (gtag.js) - Google Analytics