您的位置:首页 > 数据库 > Oracle

学习笔记_oracle——SQL优化

2014-04-14 00:19 274 查看
数据库设计

设计的原则

1、熟悉需求

2、符合开发规范

命名规范

明确实体与数据表的关系

不能即没有主键也没有外键

3、审核数据库设计

4、基本表的特征

1、原子性:字段不能再分解

2、原始性:是对原始数据的记录,不是拼

接出来的信息

3、演绎行:有基本表和关系表中的

数据,可以派生出任何想要的数据

4、稳定性:相对稳定,长期保存

5、必须满足一二范式,尽量满足第三范式

第一范式:对属性的原子性约束,不可再分

第二范式:记录的唯一性约束,即必须有主键

第三范式:对字段冗余的约束,一个表中的字

段不能包含其他表的非主键字段

6、简洁地E-R图

7、符合完整性约束

设计的模型

关系模型ER
强调关系

对象模型OR
强调的是实体的个体

设计的技巧

1、表越少越好,表中的组合主键的字段越少越好、字段越少越好

2、检查变化字段

3、避免使用数据库保留字

4、采用删除标记字段代替删除

5、避免使用触发器

6、发现在输入时重复数据,则需要创建新的表核心的关系

7、使用数据库设计工具

8、创建ER图表和数据字典

9、添加字段修改记录时间、修改人、修改后的版本

10、地址和电话采用多个字段

SQL优化

劣质SQL 对系统产生不好的影响的SQL

1、运行时间超长

2、引发严重的等待时间

3、不能满足压力测试

4、消耗大量的系统资源

索引

使用索引可以快速访问数据库表的特点信息

问题

1、占用表空间

2、影响DML性能

使用的条件

1、一个字段中包含大量的值

2、一个字段中包含多个空值

3、多个字段经常出现在where中

4、表非常大并且查询返回的数据量低于总数据的20%

索引的创建

CREATE INDEX 索引名 ON 表名(列名) TABLESPACE 表空间名

索引类型

列值唯一性

唯一索引

非唯一索引

索引列个数

单列索引

复合索引,第一个列为主导列

使用情况

当SQL语句时WHERE字句用到复合索引的主导列

当某几个列在SQL语句的WHERE字句通常用and连在一起使用

当SQL常常查询几个同样的列值时

索引列物理组织方式

B树索引 适用于列中数据较多的情况

反向键索引 用于大的集群系统,多用户操作统一数据块

CREATE INDEX 索引名 ON 表名(列名) REVERSE TABLESPACE 表空间名

基于函数的索引
基于一个或多个列上的函数或表达式创建的索引

用于一个表中的字段经常被函数所调用的情况

CREATE INDEX 索引名 ON 表名(函数(列名)) TABLESPACE 表空间名

位图索引 处理数据的聚合关系,用于重复数据较多的情况

CREATE BITMAP INDEX 索引名 ON 表名(表名(列名)) TABLESPACE 表空间名

表分区

应用场景

为了提高数据的可用性,档表内容或者结构非常大的时候

优点

1、提高数据可用性

2、减少管理负担

3、改善语句性能(减少并发)

分区方式

区间分区 根据一个列值得范围划分

RERTITION BY RANGE(列名) (

PARTITION 分区表名 VALUES LESS THEN

(值) TABLESPACE 表空间

)

LESS THEN
表示小于

VALUES LESS THEN (maxvalue)表示其他

//============实例==================================

CREATE TABLE 表名 (

dt_draw date not null

)

RERTITION BY RANGE(dt_draw) (

PARTITION 分区表名 VALUES LESS THEN

(to_date('31/12/2008','dd/mm/yyyy')) TABLESPACE 表空间

)

散列分区 对分区间应用一个散列函数,依次确定

应放在N个分区的哪一个分区

分区表的树木间以为2的N次方

RERTITION BY HASH(列名) (

PARTITION 分区表名 TABLESPACE 表空间

)

//============实例==================================

CREATE TABLE 表名 (

dt_draw date not null

)

RERTITION BY RANGE(dt_draw) (

PARTITION 分区表名1 TABLESPACE 表空间1,

PARTITION 分区表名2 TABLESPACE 表空间2,

PARTITION 分区表名3 TABLESPACE 表空间3

)

列表分区 将数据按照列的值分区

RERTITION BY LIST(列名) (

PARTITION 分区表名 values (指定值1,指定值2) TABLESPACE 表空间

)

//============实例==================================

CREATE TABLE 表名 (

dt_draw date not null

)

RERTITION BY LIST(dt_draw) (

PARTITION 分区表名 values (指定值1,指定值2),

PARTITION 分区表名 values (指定值3,指定值4),

PARTITION 分区表名 values (指定值5,指定值6)

)

tablespace 表空间

组合分区 之前分区方式的组合

区间散列组合

PARTITION BY RANGE(列1) SUBPARTITION BY HASH (列2) (

PARTITION VALUES LESS THAN (值) TABLESPACE 表空间 ,

)

区间列表组合

PARTITION BY RANGE(列1) SUBPARTITION BY LIST (列2) (

PARTITION VALUES LESS THAN (值) TABLESPACE 表空间 (

SUBPARTITION 子分区名 VALUES (指定值1,指定值2) TABLESPACE 表空间

)

)

维护方式

增加分区

ALTER TABLE 表名 ADD PARTITION 分区表名 VALUES LESS THAN (值)

注意,不能包含小于最大分区分区条件的分区

删除分区

ALTER TABLE 表名 DROP PARTITION 分区表名

截断分区 删除分区中的数据

ALTER TABLE 表名 TRUNCATE PARTITION 分区表名

合并分区

ALTER TABLE 表名 MERGE PARTITIONS 要合并的分区 INTO PARTITION 合并到的分区

注意,高接线不能合并到低接线

分区维护

SQL语句的优化

1、选择合适的Oracle优化器

CBO 基于成本优化的优化器

优化模式

Rule 基于规则

Choose
默认,有统计信息CBO,否则,RBO

First Row
以最快的速度返回前几行

All Rows
以最快的速度返回所有行

2、选择恰当的查询方式

方式

全表扫描

ROWID扫描
单行数据

索引扫描 CBO下有效,索引中直接得到的数据

快速索引扫描

3、善于利用共享SQL语句

存放在SGA中,系统全局中
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: