• 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 时,用一个缺省值代替空值,例如业扩申请中状态字段不允许为空,缺省为申请。

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

    优化方案: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!
  • 相关阅读:
    学习笔记—二进制和精度问题
    学习笔记—Buffer的常用方法与实现
    学习笔记—Node中第三方模块
    学习笔记—npm的介绍与使用
    .NET中序列化(一)
    .NET中序列化(二)
    JavaScript在多浏览器下杂谈1for循环
    .NET中序列化(三)
    DLCB额度切分
    DLCB解决问题的思路
  • 原文地址:https://www.cnblogs.com/programb/p/14068235.html
Copyright © 2020-2023  润新知