- 临时表
在平时,每个用户创建表之后,会存储到内存当中,当用户过多的时候,我们可以新建一个临时表,将表存储到磁盘当中去。
DM 临时表的特点:
1.在临时表中,可以像普通表一样增删改查;
2.临时表的操作相较于普通表产生较少的 REDO 日志;
3.临时表支持建索引,以提高查询性能;
4.在一个会话或事务结束后,数据将自动从临时表中删除;
5.不同用户可以访问相同的临时表,每个用户只能看到自己的数据;
6.临时表的数据量很少,所以能够减少内存,更快的查询;
7.临时表的被删除后,只删除的是表数据而不是整个表;
8.临时表的权限管理跟普通表一致。
临时表分为两种类型:
on commit preserve rows --session 会话级临时表(当整个会话完成之后,临时表删除)
on commit delete rows --transaction 事务级临时表(当整个事务完成之后,临时表删除)
创建临时表语法:
Create global temporary table + 表名 ()on commit delete rows
create global temporary table temp_transaction (id int,name varchar(20)) on commit delete rows;(创建一个表名为temp_transaction的临时事务表,在事务完成后,将临时表删除)
--插入数值
insert into temp_transaction values (1,'aaa');
insert into temp_transaction values (2,'bbb');
select * from temp_transaction;
当commit提交表之后,临时事务表表删除
分区表
达梦数据库分区表主要包括范围分区、哈希分区和列表分区三种方式, 企业可以使用合适的分区方法,如日期(范围)、区域(列表),对大量数据进行分区。由于达梦数据库划分的分区是相互独立且可以存储于不同的存储介质上的,完全可满足企业高可用性、 均衡IO、降低维护成本、提高查询性能的要求。
(1) 范围(range)分区:对表中的某些列上值的范围进行分区,根据某个值的范围,决定将该数据存储在哪个分区上。
(2) 哈希(HASH)分区:通过指定分区编号来均匀分布数据的一种分区类型,通过在I/O设备上进行散列分区,使得这些分区大小基本一致。
(3) 列表(list)分区:通过指定表中的某个列的离散值集,来确定应当存储在一起的数据。
(4) 多级分区表:上述三种方式的任意组合。
测试目的 | 测试各种类型的分区表:范围分区表;哈希分区表;列表分区表;垂直分区表;组合分区表 |
测试要求 | 数据库服务器已启动并以管理员身份登录 sql执行环境默认为自动提交事务 |
create table t1(a1 int,a2 varchar(20),a3 date)
partition by range(a3)
(partition p1 values less than ('1995-1-1'),
partition p2 values less than ('2000-1-1'),
partition p3 values less than ('2005-1-1'),
partition pmax values less than (maxvalue));
Ps:(partition后的数字表示哈希分区的分区数)
--(1)创建哈希分区表,插入数据并查询;
create table t2(a1 int,a2 varchar(50) not null,a3 date)
partition by hash(a2)(partition p1,partition p2,partition p3)
--(2)插入数据
insert into t2 values('34','aaa123','2005-1-1');
insert into t2 values('45','aaa187','2005-1-1');
insert into t2 values('56','aaat4133','2005-1-1');
insert into t2 values('78','aaa1v53','2005-1-1');
insert into t2 values('21','aaaert156','2005-1-1');
insert into t2 values('45','bb245b156','2005-1-1');
insert into t2 values('56','bbb156','2005-1-1');
insert into t2 values('38','bbb34187','2005-1-1');
select * from t2 partition(p1);
查询结果如下
创建列表分区表,增加、交换、删除分区;
(1)创建分区
create table t3(a1 int,a2 varchar(50))
partition by list(a1)(
partition p1 values('34','45'),
partition p2 values('21','38','87'),
partition p3 values('56','78'))
(2)插入数据
insert into t3 select * from t2;
commit;
创建视图
create table stt1(a1 int,a2 varchar(50),a3 date)
insert into stt1 values(1,'aaa','2009-09-22');
insert into stt1 values(2,'bbb','2010-11-12');
insert into stt1 values(3,'ccc','2012-09-28');
create view st1 as select * from stt1 where a1=3;
select * from st1;
--3.修改基表并重新编译视图
alter table stt1 add column(a4 char(10));
select * from st1;
alter view st1 compile;
select * from st1;
--4.对视图进行数据更新、删除操作
update st1 set a2='eee' where a1=3;
select * from st1;
drop view st1;
--创建临时会话表
临时会话表语法:
Create global temporary table + 表名 ()on commit preserve rows;
create global temporary table temp_session (id int,name varchar(20)) on commit preserve rows;
insert into temp_session values (1,'a');
insert into temp_session values (2,'b');
Commit;
Select * from temp_session;
再commit提交之后,依旧可以查询到表数据。
当关掉整个会话页面,再新建一个查询时候,便查不到数据
总结:事务级临时表当你commit提交之后,表中数据会被删除,但表存在。
会话级临时表当你commit提交之后,数据不会被删除,当你的会话框关闭之后,表数据会被删除。
两个临时表的表不会被删除,只有表中的数据会被删除
外部表
外部表,是指不存在于数据库中的表。可以通过控制文件ctl文件来进行对txt表进行建表操作,通过INFILE的路径来进行读取操作
测试表test1.txt : 路径保存在D:\中
控制文件test1.ctl保存在E:\中
控制文件test1.ctl配置文件为:
LOAD DATA
INFILE 'D:\test1.txt'
INTO TABLE TEST1
FIELDS ','
测试表test1.txt
1,2,3
4,5,6
再DM管理工具中新建查询
外部表的创建语法为:
create external table 表名(c1,c2,c3(定义的字段)) from '+ctl控制文件路径';
示例:
create external table test1 (c1 int,c2 int,c3 int) from 'E:\test1.ctl';
select * from test1;
所遇问题:
外部表数据查询出错
解决方法:
Ctl控制文件路径的\和linux系统下的/混淆 以及test文件中的中英文的”,”出错
设置自动提交
由于dm管理工具默认的是非自动提交
可以手动设置为自动提交
--查询表空间
select * from v$tablespace;
--查询数据文件
select * from v$datafile;
创建视图
--建一个表名为stt1的表并插入数据
create table stt1(a1 int,a2 varchar(50),a3 date)
insert into stt1 values(1,'aaa','2009-09-22');
insert into stt1 values(2,'bbb','2010-11-12');
insert into stt1 values(3,'ccc','2012-09-28');
--创建视图名为st1 a1=3的视图
create view st1 as select * from stt1 where a1=3;
select * from st1;
----对视图进行数据更新、删除操作
更新第三条视图的A2值为fff,并查询
update st1 set a2='fff' where a1=3;
select * from st1;
原本a1=3的a2的值为=’eee’修改为’fff’
drop view st1; --删除视图st1
物化视图
create table stt2(a1 int,a2 varchar(50),a3 date);
create table stt3(b1 int,b2 varchar(50),b3 date);
insert into stt2 values(1,'aaa','2009-09-22');
insert into stt2 values(2,'bbb','2010-11-12');
insert into stt2 values(3,'ccc','2012-09-28');
insert into stt3 values(3,'aaa','2009-09-22');
insert into stt3 values(4,'bbb','2010-11-12');
insert into stt3 values(2,'ccc','2012-09-28');
create materialized view st2(v1,v2,v3)--创建物化视图v1,v2,v3 关键词:materialized view
build immediate refresh complete enable query rewrite
as select
stt2.a1 as v1,stt2.a2 as v2,stt2.a3 as v3
from stt2,stt3 where stt2.a1=stt3.b1;
alter materialized view st2 disable query rewrite;
完全刷新视图
refresh materialized view st2 complete;
删除物化视图
drop materialized view st2;
索引
create tablespace TS datafile 'TS.dbf' size 128;
新建一个新模式TS之后
create table TS.t1(a1 int,a2 varchar(50),a3 date);
建表,并在某一列建立普通B树索引
create index t1_inx on TS.t1(a1)
storage (initial 50,next 50,on TS);
select * from TS.t1;
并在某一列上建立聚集索引
create table TS.t2(a1 int,a2 varchar(50),a3 date);create cluster index t2_inx on TS.t2(a1);
建立分区索引
create table TS.t3(a1 int,a2 varchar(50),a3 date
) storage(branch(2,4));
create index t3_inx on TS.t3(a1) global partition by range(a1)(partition p1 values less than (20),
partition p2 values less than (maxvalue));
建立唯一索引
create table TS.t4(a1 int,a2 varchar(50),a3 date);
create unique index t4_inx on TS.t4(a1);
位图索引
create table TS.t5(a1 int,a2 varchar(50),a3 date);
create bitmap index t5_inx on TS.t5(a1);
删除索引
Drop index + 索引名
重建索引语法
Alter index 索引名 rebuild online;
如果错误,欢迎各位大佬指出
更多资讯请上达梦技术社区了解: https://eco.dameng.com