zoukankan      html  css  js  c++  java
  • Oracle的数据优化(经常被问到)?

    Oracle数据库举例:(a-G要求掌握,H一般为DBA操作了解就可以了)

    a。

    建库已知将保存海量数据的时候因为Oracle是通过用户来管理数据的

    第一步我们先建一个tableaspace(假设表空间名为TEST),

    然后建立用户TEST(一般情况下用户名和表空间同名),

    建立的用户TEST使用已建立的tablespace(TEST).

    这样做是避免访问上产生热点

    b。

    建表建表时最好依照第三范式去建表(请回答三个范式),

    这样可以最大程度避免出现数据冗余插入删除和更新异常保证数据完整性

    而且表结构合理的情况下可以加快查询速度

    c。

    索引在经常查询的字段上面建立索引

    利用index对查询进行优化,(index可以避免对表的一个全面扫描)

    原理当以某个字段建立一个索引的时候,数据库就会生成一个索引页,

    索引页不单如果表的列很少,不适合建索引.单保存索引的数据,还保存了索引在数据库的具体的物理地址,当我们查询数据时,oracle会先查索引页这样就能够很快的定位查找到要找的记录)。

    注意

    当执行过多次的insert,delete,update,会出现索引碎片,影响查询速度,我们应该对索引进行重组.

    D:

    sql语句的优化

    多使用共享语句尽量使你的sql语句能够使用索引

    怎样使sql语句能够使用到索引呢

    sql语句中包含not in,<>,is null,is not null,like '%%'的时候不会用索引

    IN: in会拆成一堆or,可以使用表的索引

    NOT IN:强列推荐不使用因为它不能应用表的索引

    <> 操作符不等于): 不等于操作符是永远不会用到索引的因此对它的处理只会产生全表扫描

    优化方案:用其它相同功能的操作运算代替a<>0 改为 a>0 or a<0;a<>’’ 改为 a>’’.

    IS NULL IS NOT NULL操作判断字段是否为空):

    判断字段是否为空一般是不会应用索引的因为B树索引(oracle大多是使用B树索引)是不索引空值的

    优化方案:用其它相同功能的操作运算代替 a is not null 改为 a>0 a>’’

    is null 用一个缺省值代替空值例如业扩申请中状态字段不允许为空缺省为申请

    LIKE:LIKE操作符可以应用通配符查询里面的通配符组合可能达到几乎是任意的查询但是如果用得不好则会产生性能上的问题

    优化方案:LIKE ‘%001%’ 这种查询不会引用索引会产生全表扫描

    LIKE ‘001%’则会引用范围索引进行范围的查询性能肯定大大提高

    E:

    多表查询时一般一个大表关联几个小表最好不要几个大表相关联那样也会影响到查询速度

    F:

    oralce访问表中的数据共有三种方式全表扫描通过索引扫描使用共享语句(一模一样)。

    select id,name from tb_sutdent;

    Select id,name from tb_sutdent;

    我们JDBC查询中使用PreparedStatement实际上就是使用共享语句

    所以我们要多使用共享语句来加快查询速度

    G:

    经常查询的SQL可以写成存储过程

    H:

    当表数据达到几十到几百GB就要考虑对表进行分区了

    分区的优点

    1.增强可用性如果表的某个分区出现故障表在其他分区的数据仍然可用

    2.维护方便如果表的某个分区出现故障需要修复数据只修复该分区即可

    3.均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能

    4.改善查询性能对分区对象的查询可以仅搜索自己关心的分区提高检索速度

    分区的几种方法范围分区 ,Hash分区散列分区) ,复合分区 。

    应用实际项目中大多使用范围分区

    例如按时间范围(日期字段)来分区2005-2006数据作为一个分区,2006-2007作为一个分区

     

    CREATE TABLE emp(

    comm INT DEFAULT 0,

    status VARCHAR2(18) DEFAULT '申请'

    );

     

    CREATE TABLE tb_emp(

    emial VARCHAR2(50) DEFAULT 'aaa'

    );

    SELECT * FROM tb_emp WHERE email IS NULL --不使用index

    SELECT * FROM tb_emp WHERE email = 'aaa' --使用index

     

    Java Program!
  • 相关阅读:
    [每日一题2020.06.23]leetcode #16 双指针
    typora+picgo+jsdeliver+github打造免费高效的博客图床
    [javaSE笔记5]String
    [javaSE笔记4] ArrayList
    [javaSE笔记3] JAVA的继承---多态 抽象
    [每日一题2020.06.22]leetcode #11 双指针
    操作系统---设备管理
    [每日一题2020.06.21]leetcode #124 DFS二叉树
    操作系统---磁盘
    PC实用工具推荐
  • 原文地址:https://www.cnblogs.com/programb/p/12845135.html
Copyright © 2011-2022 走看看