使用with as有如下好处
1、可以轻松构建一个临时表,通过对这个表数据进行再处理。但是他比临时表更强大,临时表在会话结束才会自动被P清除,但with as临时表查询完成后就被清除了
2、复杂的查询会产生很大的sql,with as语法可以把一些公共查询提出来,也可以作为一个中间结果,可以使整个sql语句显得有条理些,提高可读性
事务的几个特征:
为了避免多个用户对同一个数据同时进行操作,操作数据的时候数据保存出错产生脏数据
A用户在对数据做dml操作的时候,数据会被上锁,B用户不能对这个数据所在的行同时进行操作
A用户在对数据做dml操作的时候,数据所在的表会被上锁,B用户不能对表做ddl(除了新增表格结构之外)的操作
select * from scott.emp where ename='SMITH' for update;
同时操作的进程里面,每个进程都互相占用了对方的资源,谁都无法释放资源和成功跑完
select * from v$locked_object;
--找到锁的对象,是在哪个表上面 根据自己找到的这个表的名字,回去找session_id 131
select * from dba_objects where object_id=69539;
select * from v$session where sid=131;
alter system kill session '131,9555';
表分区:将一个表里面,所有的拥有相同特征的数据,在硬盘上规划出一块区域,整合在一起
)partition by hash(ename) partitions 4;
通过数据库的内部的哈希算法,将所有的行,根据名字的内容,一共放到4个不同的分区中进行分开的保存。哈希算法的分区的数量,最好是写2的次方数。
当某个列的值,是大量的重复的相同数据数据,使用列表分区,对这个列进行特征和内容的归纳和划分,将拥有相同数据的行,放在同一个分区中
partition sal_0_1000 values less than (1001),
partition sal_1001_2000 values less than (2001),
partition sal_2001_3000 values less than (3001),
partition sal_3001 values less than (maxvalue)
partition s20201125 values less than(date'2020-11-26'),
partition s20201126 values less than(date'2020-11-27')
数字类型、日期类型的数据,例如金额、时间、年龄等等,将某个范围内的数据,存放在一起,那么就使用范围分区
insert into emp_range select * from scott.emp;
如果一个表的数据越来越大,查询很慢的话,重新创建一个分区表,复制原有的数据,删除旧表。
subpartition 子分区名字 values 分区规则,
subpartition 子分区名字 values 分区规则,
subpartition sal1000_10 values less than (1001),
subpartition sal2000_10 values less than (2001),
subpartition salmax_10 values less than (maxvalue)
subpartition sal1000_20 values less than (1001),
subpartition sal2000_20 values less than (2001),
subpartition salmax_20 values less than (maxvalue)
subpartition sal1000_30 values less than (1001),
subpartition sal2000_30 values less than (2001),
subpartition salmax_30 values less than (maxvalue)
首先划分父分区,设置父分区的规则,然后在父分区中划分子分区的规则,这样可以在同时对两个列进行查询的时候,有效的减少查询需要消耗的资源和时间。
select * from user_indexes; --查看所有的索引
select * from user_tables; --查看所有的表
select * from user_tab_partitions; --查看所有的分区表
alter table 表名 drop partition 分区名;
alter table 表名 add partition 分区名 values 设置的规则;
什么是索引:就是每一个表格的目录结构,帮你快速的定位表格中的数据在表格里的位置
1. 主键索引:在创建表格的时候,添加了主键约束,那么就会自动生成主键索引
alter table emp_idx add constraint pri_empno primary key(empno);
alter table emp_idx add constraint uni_empno unique(empno);
2.2 在没有约束的前提下,手动创建唯一索引,唯一索引不会反过去创建唯一约束
create unique index idx_emp_empno on emp_idx(empno);
3. 普通索引:这个列经常需要被查询,但是这个列又没有什么特点
create index idx_nor_ename on emp_idx(ename);
4. 组合索引:和普通索引相同,有多个列需要同时被查询,但是这些列也没有什么特点,那么就放在一起,创建一个组合索引
create index idx_sal_job on emp_idx(sal,job);
create index 索引名 on 表名(a,b,c);
5. 函数索引:如果你的列,是需要被使用函数计算之后再用来查询,那么计算过程需要被写在索引里面
create index idx_func_hiredate on emp_idx(to_char(hiredate,'yyyy'));
6. 位图索引:列的内容是由大量的重复的内容组成的 bitmap
create bitmap index idx_emp_deptno on emp_idx(deptno);
create index idx_hash_ename on emp_hash(ename) local;
create index idx_hash_job on emp_hash(job) global;
--本地索引的话,在创建唯一索引的时候,在整个表中,可能会出现重复信息,在一个分区里面,值保证是唯一的,全局索引是整个表中,数据唯一存在
--删除了一个分区或者新增了一个分区,那么全局的索引会失效,需要你删除了索引然后重新建立,本地的索引是不会失效的
主键、唯一、普通、组合、函数(普通的normal类型) 树状结构 b树索引,btree索引
普通索引是通过根节点、分支节点、叶子节点、行数据四个节点块,一层层进行数据范围的筛选。
一个表不要建超过5个索引;索引的数量,不要超过列的数量的15%。
有一个2000W数据的表格,要接着往里面添加2000W的数据,怎么样操作最快?
select * from emp_idx where to_char(hiredate,'yyyy')=1981;
select * from emp_idx where sal+1000=4000 and job='MANAGER'
select * from emp_idx where deptno!=20
select * from emp_idx where not deptno=20
select * from emp_idx where ename is null
表连接的时候,通过执行计划查看到的表连接内部的逻辑:


2. A表和B表的数据,相差很大,并且表连接的列都是有索引的,这个时候的等值连接就不会变成hash join,而是会使用nl嵌套连接。

两个表的连接,筛选条件不是对列和列进行筛选,而是对列和值进行筛选
/* +leading(a b) */ a一定要是小表(驱动表),b一定是大表(匹配表)
/*+ parallel(8) */ 强制使用并行的资源,来执行这个sql语句
在oracle中怎么去优化查询的sql语句/怎么优化数据库?
2.查看表格的数量,如果数据量很大,就先给表格进行分区表的设置
6.使用临时表去存储一个或者多个大表筛选的结果,然后使用临时表进行表格的连接
8. 尽量少使用union minus intersect等集合的运算,这些都是效率很差的关键字
oracle的视图:view 一个或者多个表查询的结果,这个结果就是一个虚拟的表,每次运行视图,都会重新运行视图中的那个查询语句
1. 将一个复杂的select语句,放入到一个视图里面,简化日常的操作
2. 可以隐藏一部分原表的列,简化别人在操作表的时候的业务逻辑
对拥有复杂逻辑的视图,再次表连接等操作,会导致语句更加复杂,运行效率很慢。
oracle的物化视图:是一个真实的物理的表格,将一个或多个表格查询的结果,当成一个新的表格来保存,物化视图的表格,会对原表的数据进行同步,物化视图的表格,本身就是不能更改的
create materialized view 物化视图名字
create materialized view stu_nan
select * from student where ssex='男' and sage>20;
create materialized view stu_nv_20
next to_date(to_char(sysdate+1,'yyyy-mm-dd')||' 10:00:00','yyyy-mm-dd hh24:mi:ss')
select * from student where ssex='女' and sage>20;
1. complete 完全刷新,整个表格全部都更新一次数据
3. force 默认的更新方式,默认的更新方法就是fast
dbms_mview.refresh('物化视图的名字','更新的方法');
1. 视图是一张虚拟的表格,不会占用磁盘空间,物化视图是一个真实的表格,会占用磁盘空间
2. 视图为了简化select操作用的,物化视图也叫做快照表,是为了保存某个表格或者是select语句在某个时间点的数据而存在的
3. 视图是实时更新的,物化视图有两个刷新表格内容的方法,一种是提交数据的时候更新,第二种是定时更新
4. 当原表非常大的时候,视图不会减少查询时间,物化视图是会减少查询时间的
拉链表就是一张普通的表格,这个表格会保存你每一次数据前后变更的状态。
有开始时间和结束时间还有变更状态这三列,用来记录每一行数据前后变更的状态和顺序,这三列叫做缓慢变化维。
会创建列的旧数据的备份列,会保存最近一次的变更的数据,和数据变更的时间
sql语句的分类:dcl(权限的操作 grant revoke) ddl(对数据库对象的操作:用户 表 索引 视图 物化视图 create alter drop truncate) dml(对表里面的数据的操作 insert update delete) dql(表数据的查询 select)
数据类型:integer number number(总长度,小数精度) char(长度) varchar2(长度)
约束条件:primary key unique not null check foreign key
单行函数:数字 round trunc abs floor(6.3 变6) ceil(6.1 变7) mod power
字符串 substr concat replace length
日期 last_day months_between add_months sysdate
本文介绍了withas在临时表构建中的优势,事务的特性,数据库锁和死锁处理,以及数据库分区、索引、视图和物化视图的使用和优化,涉及SQL语句分类、数据类型和函数等内容。
1371

被折叠的 条评论
为什么被折叠?



