《数据库性能优化》复习课程.ppt

  1. 1、本文档共39页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据库性能优化 B2B-DBA-陈立-2011年Q3 主题 基本元素 访问堆表 访问B树索引 案例分析 执行计划 基本元素-总览 一本字典---------------一个表 字典中的一页----------一个数据块 一个字的解释----------一笔记录 页码跟行号------------ROWID 基本元素-数据块 保存数据的最小容器 读取数据的最小单位(8k或16k,固定大小) 基本元素-ROWID 访问一笔记录的最快方式 ROWID只是一个坑,不是一个萝卜,用它来访问数据虽然快,但是不安全。因为随着DELETE/INSERT操作,坑里埋的萝卜会变。坑还是原来的坑,萝卜已经不是原来的萝卜了。 访问堆表-全表扫描 全表扫描 用多快读的方式访问高水位线以下的所有数据块 哪怕这些数据块里现在都没有数据 哪怕最终只得到少量的记录 就像在一本没有索引的字典里找出所有单人旁的字,你必须将整本字典从头到尾查阅一遍。 访问堆表-ROWID访问 访问指定ROWID的记录 最快的访问方式 查看字典中第X页第Y行的字 访问堆表-STOP机制 查询到指定的记录数之后就停止扫描 无需借助索引,也不必访问整张表的所有数据块 在字典中找出5个笔画数为20的字 访问B树索引-典型结构 访问B树索引-特点 自索引的索引 平衡树-----每个叶节点到根节点的距离相等 叶节点之间存在有序链表结构 对 =, >, <, >=, <=, like ‘a%’ 等操作效率极高 对 <>, like ‘%a%’, like ‘%a’ 操作效率差 访问B树索引-索引唯一扫描 访问B树索引-索引范围扫描 访问B树索引-索引快速全扫描 Select count(*) from table1 访问B树索引-代价 索引唯一扫描:o(1)------索引的层次数 索引范围扫描:o(n)------所需要返回的叶块 索引快速全扫描:o(N)----所有叶块 实际问题-1 问:在索引字段上施加函数,为什么性能差 to_char(gmt_create,’ mmdd’) =‘0101’ 答:因为无法使用索引 正确的写法: gmt_create between to_date(,'yyyymmdd') and to_date(,'yyyymmdd') 用索引范围扫描 实际问题-2 问:在索引字段上用全模糊,为什么性能差 member_id like ‘%alibaba%’ 答:因为无法使用索引。 正确的做法:B树索引无法解决这种需求。考虑用其他技术手段代替,比如搜索引擎。 实际问题-3 问:索引是 (member_id, group_id), 为什么这个性能差 where group_id=89721 答:用了索引快速全扫描 或者 其他低效的扫描方式。 正确的做法:创建以group_id为首列的索引,使用索引范围扫描。 实际问题-4 问:计数为什么有时候count(id)比count(*)慢? 答:count(id)等价于 count(*) where id is not null,如果没有(id)索引,那么会用全表扫描,而count(*)会自动选择最优的索引用索引快速全扫描。 正确的写法:计数统一使用count(*)。 实际问题-5 判断member_id在offer表中是否存在记录,哪个写法性能好? (A): select count(*) from offer where member_id=#member_id#; (B): select count(*) from offer where member_id=#member_id# and rownum<=1; 两种写法都用了索引范围扫描,(B)在这个基础上还用到了STOP机制,查到第一笔记录之后就立刻停止了扫描,所以性能更好。 实际问题-6 问:索引(member_id, subject)这两句性能有差别吗? (A): select subject from offer where member_id=#member_id#; (B): select subject, gmt_create from offer where member_id=#member_id#; 答:两句都用了索引范围扫描,(B)还需要根据索引中查到的ROWID访问表里的记录,当对应的记录数较多时,比(A)的性能差很多。 实际问题-7 问:这个SQL如何优化? SELECT * FROM (SELECT t.*, rownum AS rn FROM (SELECT *

文档评论(0)

yuzongxu123 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档