我在成长

oracle 基础

上一篇 / 下一篇  2010-06-07 22:12:09 / 个人分类:个人日记

    今天听了一个数据库基础的培训,觉得挺有收获的,以前接触数据库比较少,也就是数据库的基本操作,最近公司做了很多数据库拆分,海量数据存储的项目,有了一些了解。
    这次是走进oracle,重点是了解oracle的相关基础知识
   大体内容就是介绍了数据库的数据存取原理,数据库 访问的规则方法,索引的使用,其实就是这么几块来回的折腾,怎么建好索引,怎么用好索引,怎么想办法在合适的场景应用适合的访问规则, 也就是得到一个最优的数据库使用方案,都是需要了解这些基础后,结合业务进行设计的。

一、数据库基础知识

1、数据块:数据库读取数据的最小单位,也就是说无论 本次取数的记录是否小于数据块,都会将整块的数据读取出来,然后留下自己需要的那条记录。

2ROWID记录数据记录的物理地址,可以提供最快的数据库记录访问

3、数据库访问机制:全表扫描(就是整张表扫描一遍, 效率最低);ROWID访问(根据得到的rowid进行记录访问,但是rowid是不唯一的,使用的时候需小心);stop访问机制(访问到一条符合要求的记录即停止,访问数据是全表的子集,和访问条件相关)

4B树索引访问

唯一扫描:前提是每一个key值对应的记录只有一条,这样访问的算法复杂度就是索引树的深度。

范围扫描:对于一个key有多个记录的数据,这样访问的算法复杂度就是被访问数据在整个数据库数据中占的比例。这个 方法适用于被访问的数据在整体数据的占比不要太大的情况,否和和直接进行数据库访问的差别不大,同时需要耗费索引维护成本。

快速扫描:只对叶子阶段进行扫描,使用场景就是查看数据库记录数,count*)时使用。

 

二、案例讲解(几个案例讲解觉得很有帮助,从实际使用出发,尝试进行sql优化)

1、修改前的sql

to_char(gmt_create,’ mmdd’)=‘0101’

在使用索引字段时,使用 了函数,导致了索引引用失败,实际上并没有使用到索引

修改后的sqlgmt_create between to_date('20090101','yyyymmdd') and to_date('20090102','yyyymmdd')

2、修改前的sql:

member_id like ‘%abc%’

对索引字段进行了模糊查 询,但是索引是不支持左模糊查询的

改进方案:使用其他的技术手段进行修改

3、修改前sql:计数为什么有时候count(id)count(*)

Count*)会使用索引,并且返回结果和实际记录数一致

Countidcount某个字段,如果非索引字段,会查询数据库,并且如果该字段值 未空,会不做累加,这样结果会有偏差,这点在一些页面展示记录数是非常有用的

4、修改前:select count(*) from  score where member_id=#member_id#;为了判断该memberidoffer表中是否有记录

可以使用数据库的访问机制,有stop访问机制,那么做如下调整,可以让我访问的区块随着该member的记录成数量级的减小,同时再算上每个sqlpv,优化还是很明显的。

修改后的slqselect count(*) from  score where member_id=#member_id#  andrownum<=1;

5分页应用

修改前:

SELECT *

  FROM (SELECT t.*, rownum AS rn

           FROM (SELECT *

                    FROM blog.blog_article

                   WHERE domain_id = :1

                     AND draft = 0

                   ORDER BY domain_id, draft, gmt_create DESC) t

          WHERE rownum <= :2)

 WHERE a.rn >= :3

 

修改后:

SELECT t.*

  FROM (SELECT rid, rn

          FROM (SELECT ROWID AS rid, rownum AS rn

                    FROM blog.blog_article

                   WHERE domain_id = :1

                     AND draft = 0

                   ORDER BY domain_id, draft, gmt_create DESC)

          WHERE rownum <= :2) a, blog.blog_article t

 WHERE a.rn >= :3

   AND a.rid = t.ROWID

 

这个就是对索引的充分利 用,使用索引字段,在不用查询数据库的使用,将排序分页都做好,然后再通过rowid去 进行查询展示,效率会提升很多,需要用好索引,是一门艺术。
   


TAG: 数据库 索引 Oracle oracle 分页 翻页 基础知识

latica的个人空间 引用 删除 latica   /   2010-11-09 17:06:42
对于数据库,我们的表结构设计是否合理,数据库类型是否满足性能需求,数据库线上部署的ha是否没问题,也许都没太去关注。
======这个是测试负责的?
weixiaoyeah的个人空间 引用 删除 weixiaoyeah   /   2010-07-19 18:16:51
原帖由xyzwh于2010-07-19 14:31:27发表
楼主能否讲讲数据库拆分,海量数据存储的知识

偶对数据库了解的还是太少了,谢谢楼主分享


这部分的东西也是在做了一个项目之后有了一点儿了解的,其实我们很多时候的测试忽略了对数据库的关注,往往我们就是进行了业务上的数据存取验证,但是对于数据库,我们的表结构设计是否合理,数据库类型是否满足性能需求,数据库线上部署的ha是否没问题,也许都没太去关注。
    另外关于海量存储,那我的项目其实说简单点儿是使用了数据库的拆分,使用mysql完成分布式存储,另外在业务应用和数据库之间增加路由服务,这个用的amoeba,可以在线上找一些资料。我下次尝试写一个单独的帖子 :0)
xyzwh的个人空间 引用 删除 xyzwh   /   2010-07-19 14:31:27
楼主能否讲讲数据库拆分,海量数据存储的知识

偶对数据库了解的还是太少了,谢谢楼主分享
weixiaoyeah的个人空间 引用 删除 weixiaoyeah   /   2010-07-18 15:53:04
原帖由yhh990于2010-07-17 21:03:33发表
优化的分页sql 语句,应该是
SELECT t.*
  FROM (SELECT rid, rownum as rn
           FROM (SELECT.



相当认真的yhh,吼吼,谢谢帮我纠错,这个sql我自己还真没去验证,立哥已经确认过啦 :)
引用 删除 yhh990   /   2010-07-17 21:03:33
优化的分页sql 语句,应该是
SELECT t.*
  FROM (SELECT rid, rownum as rn
           FROM (SELECT ROWID AS rid
                    FROM crm_leads
                   ORDER BY gmt_create DESC)
          WHERE rownum <= 50) a, crm_leads t
WHERE a.rn >= 40
   AND a.rid = t.ROWID
上次在做系统的时候用上了,发现了这个问题 吼吼,以上对应的sql语句在有desc排序条件时,取出的记录数不是我们预期的10条记录
引用 删除 yhh990   /   2010-07-11 10:53:36
找资料居然能找到小小叶的博客,
引用 删除 yhh990   /   2010-07-11 10:52:11
5
 

评分:0

我来说两句

日历

« 2024-03-21  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 47686
  • 日志数: 34
  • 图片数: 1
  • 书签数: 4
  • 建立时间: 2010-01-12
  • 更新时间: 2012-03-24

RSS订阅

Open Toolbar