学习笔记_oracle——SQL优化

数据库设计
设计的原则
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中,系统全局中









































学习笔记_oracle——SQL优化,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。