表
1普通表
创建表:
create table test.t1 (id int);
获取表的定义:
sp_tabledef('TEST','T1');
2堆表
创建非并发分支
(模式下拉选择表--右键新建表--存储--堆表选项--选择不设定分支)
创建并发分支为 4,非并发分支为 2
(模式下拉选择表--右键新建表--存储--堆表选项--选择指定并发和非并发分支)
查看表是什么表
select * from dba_indexes where OWNER='TEST';
3 分区表
范围分区(Range)
(分区列是数字或者日期时间类型)
新建表空间:
create tablespace TEST1 DATAFILE 'TEST01.DBF' size 64 ;
create tablespace TEST2 DATAFILE 'TEST02.DBF' size 64;
create tablespace TEST3 DATAFILE 'TEST03.DBF' size 64;
新建表:
选择列和数据类型后,选择分区--勾选创建为分区表--添加分区,选范围分区--添加分区项,修改分区名,选择表空间
查看数据库中的分区表:
select * from dba_tables where PARTITIONED='YES' and OWNER='TEST';
查看分区表的分区信息:
select * from SYS.DBA_TAB_PARTITIONS where TABLE_NAME='T_F1' ;
插入数据:
begin
for i in 1..2900 LOOP
insert into test.t_f1 values(i,i||'AAA');
commit;
end loop;
end;
插入大数据:
ALTER TABLE TEST.T_F1 ADD PARTITION pn VALUES LESS THAN (MAXVALUE);
INSERT INTO TEST.T_F1 VALUES (3500,'3500AA');
SELECT * FROM TEST.T_F1_PN;
新建堆表加分区(主表和子表必须在同一个表空间):
选择列和数据类型后,存储选择堆表不设定分支,选择分区--勾选创建为分区表--添加分区,选范围分区--添加分区项,修改分区名,选择表空间。
列表分区
通过指定表中的某个列的离散值集,来确定应当存储在一起的数据。 列表分区适合字符串类型,例如城市、地区等。
新建表:
create table test.t_sales
(sales_id INT,
saleman char(20),
saledate DATETIME,
city char(10))
PARTITION BY LIST(city)
(PARTITION p1 VALUES ('北京', '天津'),
PARTITION p2 VALUES ('上海', '南京', '杭州'),
PARTITION p3 VALUES ('武汉', '长沙'),
PARTITION p4 VALUES ('广州', '深圳'));
插入语句:
insert into test.T_SALES values(1,'AAA','2007-01-09','北京');
insert into test.T_SALES values(2,'BBB','2006-03-19','南京');
insert into test.T_SALES values(3,'CCC','2017-04-11','武汉');
insert into test.T_SALES values(4,'DDD','2021-09-09','长沙');
COMMIT;
验证:
select * from test.T_SALES
select * from test.T_SALES_P1
select * from test.T_SALES_P2
select * from test.T_SALES_P3
select * from test.T_SALES_P4
插入不在分区范围的数据:
ALTER TABLE TEST.T_SALES ADD PARTITION PN VALUES (DEFAULT);
insert into test.T_SALES values(5,'EEE','2022-09-09','沙');
COMMIT;
Hash分区
Hash 分区数据随机存储,存取速度快,读取数据比较满,各个分区
数据是均匀存放。 如果 hash 分区不指定分区名,通过 hash 分区数量自己创建。
第一种指定分区名:
create table test.t_hash1(id int,name VARCHAR(50))
PARTITION BY hash (id)
(
PARTITION p1,
PARTITION p2,
PARTITION p3,
PARTITION p4 );
插入数据:
BEGIN
for i in 1..400 LOOP
insert into test.t_hash1 values (i,'aaa'||i);
commit;
end loop;
end;
第二种指定分区数量,创建分区表,创建 hash 分区表有 10 个分区
create table test.t_hash2(id int,name VARCHAR(50))
PARTITION BY hash (id) PARTITIONS 10;
间隔分区
间隔分区是范围分区的扩展。间隔分区是按照时间间隔自动创建分区。 时间间隔分区支持年月、时分秒创建。
查询 1 年后今天的时间:
select sysdate,sysdate+numtoyminterval(1,'YEAR');
查询 1 个月后今天的时间:
select sysdate,sysdate+numtoyminterval(1,'MONTH');
查询 1 天后现在的时间
select sysdate,sysdate+numtodsinterval(1,'DAY');
查询 1时后现在的时间
select sysdate,sysdate+numtodsinterval(1,'HOUR');
查询 1分后现在的时间
select sysdate,sysdate+numtodsinterval(1,'MINUTE');
查询 1 秒后的时间
select sysdate,sysdate+numtodsinterval(1,'SECOND');
可以按年、月、日、时、分、秒、创建间隔分区
按年创建间隔分区表
create table test.t_interval_year
( id int,
name varchar(100),
brithday date )
PARTITION BY RANGE (brithday)
INTERVAL (numtoyminterval(1,'YEAR'))
( PARTITION p2014 values less than (to_date('2015-01-01')),
PARTITION p2015 values less than (to_date('2016-01-01')) );
插入数据:
insert into test.T_INTERVAL_YEARvalues(1,'AAA','2013-02-09');
insert into test.T_INTERVAL_YEAR values(2,'BBB','2015-08-02');
insert into test.T_INTERVAL_YEAR values(3,'CCC','2018-02-19');
insert into test.T_INTERVAL_YEARvalues(4,'DDD','2019-01-29');
insert into test.T_INTERVAL_YEAR values(5,'EEE','2020-02-09');
insert into test.T_INTERVAL_YEAR values(7,'FFF','2016-07-18');
Commit;
组合分区 List_range
创建表:
create table test.t_sales2 ( ---创建表
saleman varchar(50),
saledate datetime,
city varchar(50) )
PARTITION BY list (city) --创建主分区列
SUBPARTITION by RANGE (saledate) --创建子分区列
SUBPARTITION TEMPLATE
( --创建子分区
SUBPARTITION p11 VALUES LESS than ('2010-01-01'),
SUBPARTITION p12 VALUES LESS than ('2016-01-01'),
SUBPARTITION p13 VALUES LESS than ('2021-01-01'),
SUBPARTITION p14 VALUES LESS than (MAXVALUE) --不在以上范围内的值存在此分区)
( --创建主分区
PARTITION p1 values('北京','天津'),
PARTITION p2 values ('上海','南京'),
PARTITION p3 values ('武汉','长沙'),
PARTITION p4 values (DEFAULT) );
插入数据验证:
insert into test.t_sales2 values ('AAA','2016-06-09','北京');
insert into test.t_sales2 values('BBB','2018-01-09','南京');
insert into test.t_sales2 values('CCC','2019-03-06','武汉');
insert into test.t_sales2 values('DDD','2020-04-23','北京');
insert into test.t_sales2 values('DDD','2021-08-19','南宁');
Commit;
维护分区
删除分区:
alter table "TEST"."T_F1" drop partition "PN";
合并分区:
alter table "TEST"."T_F1" merge partitions "P1","P2" into partition "p1_p2";
拆分分区:
alter table test.t_f1 SPLIT PARTITION "p1_p2" AT (1001) into (PARTITION p1,PARTITION p2);
修改字段值为不在分区数据:
开启数据库行移动 alter table test.t_f1 ENABLE ROW MOVEMENT;
update test.t_f1 set id=2005 where id=100;
选择子表节点右键可以管理分区,以上都可通过图形化处理,也可给分区更换表空间。
4外部表
第一步:创建目录( su - dmdba )
mkdir -p /dm/backup/data ---将权限分配给dmdba
Ls -ld /dm/backup/data ---看权限
rm -rf /dm/backup/data ---删除目录
第二步:在数据库创建目录
( su - dmdba 进入图形化界面)选择目录--
右键新增目录--
录入目录名称( DMDIR )和目录路径(/dm/backup/data)
第三步:给test用户新建的目录dmdir权限
Grant read,write on directory dmdir to test;
第四步:将控制文件写在建表语句中
打开目录( su - dmdba
cd /dm/backup/data )
写文本 vi ext1.txt
按insert,录入文本,再按esc退出,录入
“:wq”保存并退出编辑模式。
第五步:选择对应的模式下的外部表--
创建表的列名和数据类型--
选择数据文件目录,选择目录名,选择文件名--
分隔符可在参数列表中写“ fields ‘,’ ”,如果不显示第一行数据可在参数列表中写“ fields ‘,’,skip 1 ”
序列、同义词、物化视图
1序列
新建序列:
选择对应模式下--
序列右键模式名TEST, 序列名 SEQ1,起始值 1,增量 1,最小值 1,最大值 10,勾上高速缓冲给值5
初始化(查下一个值)
select test.seq1.nextval;
查询序列当前值
select test.seq1.currval;
修改序列最大值为 100,关闭缓存:
ALTER SEQUENCE "TEST"."SEQ1" MAXVALUE 100 NOCACHE;
删除序列:
drop SEQUENCE SEQ1;
2同义词
对表、视图、序列、函数、存储、触发器有效
把select any table
select any view两个权限给test用户(管理用户,选择用户右键修改,系统权限里面选择)
私有同义词:创建普通同义词:
create SYNONYM emp for dmhr.employee;
创建公共同义词:(图形化,选择公共同义词,右键新建 --
同义词名EMP --
对象所属模式 DMHR --
对象名 EMPLOYEE)
CREATE PUBLIC SYNONYM "EMP" FOR "DMHR"."EMPLOYEE";
查看普通同义词:
select * from user_SYNONYMS;
查看公共同义词:
select * from SYS.DBA_SYNONYMS where OWNER='PUBLIC' and SYNONYM_NAME='EMP';
3物化视图
建立物化视图
图形化方式:选模式--
物化视图右键新建--
视图名MV_T1 --
子查询 select * from T1;
命令方式:CREATE MATERIALIZED VIEW MV_T1 AS SELECT * FROM t1;
查询物化视图 select * from mv_t1;
修改表数据 update t1 set name=’AAABBBCC1’ where id=1; commit;
手动刷新视图 refresh MATERIALIZED VIEW mv_t1;
查视图信息 select * from USER_MVIEWS;
建立物化视图,自动刷新,自动完全刷新
查询建表:
create table emp as select * from dmhr.EMPLOYEE;
命令建立视图(表没有主键就用命令):
create MATERIALIZED VIEW mv_emp
REFRESH on commit force as
select * from emp ;
图形化:新建视图,视图名 MV_EMP --
子查询 select * from emp ; --
刷新--
REFRSH 选项,选择REFRSH ON COMMIT (ON DEMAND手动 ON COMMIT自动)--
选择WITH PRIMARY KEY主键 (WITH PRIMARY KEY主键 WITH ROWID)--
选 COMPLETE ( FAST快速 COMPLETE完全 FORCE默认 )
验证:select * from emp ;
select * from mv_emp;
UPDATE emp SET EMPLOYEE_NAME='马学铭1' WHERE EMPLOYEE_ID=1001;
COMMIT;
创建物化视图,自动-快速刷新-基于主键
查询建表:
create table dept as select * from dmhr.department ;
创建主键:选择表,右键修改,主键勾选 DEPARTMENT_ID
命令:alter table "TEST"."DEPT" add primary key("DEPARTMENT_ID");
创建物化视图日志:物化视图下拉,日志表右键新增,表名 DEPT
命令:create materialized view log on “TEST”.”DEPT”;
创建物化视图:新建视图,视图名 MV_DEPT --
子查询 select * from dept; --
刷新选REFRSH ON COMMIT
WITH PRIMARY KEY
FAST
命令:create materialized view "TEST"."MV_DEPT"
refresh on commit with primary key fast
as select * from dept;
验证:select * from "TEST"."MV_DEPT";
select * from "TEST"."DEPT";
UPDATE DEPT SET DEPARTMENT_NAME='总经理办1'
WHERE DEPARTMENT_ID=101;
COMMIT;
创建物化视图,自动-快速刷新-基于 rowid
创建表:
create table emp2 as
select employee_id,employee_name,salary
from dmhr.EMPLOYEE;
创建物化视图日志表
create MATERIALIZED VIEW log on emp2
with ROWID (employee_id,employee_name,salary);
创建物化视图
create MATERIALIZED VIEW mv_emp2
REFRESH fast on commit
with ROWID as SELECT
a.rowid emp2rowid,a.employee_id,a.employee_name,a.salary from emp2 a;
验证:select * from "TEST"."EMP2" where EMPLOYEE_ID=1001;
select * from "TEST"."MV_EMP2" where EMPLOYEE_ID=1001;
update EMP2 set EMPLOYEE_NAME='马学铭2' where EMPLOYEE_ID=1001;
commit;
修改物化视图不刷新:
alter materialized view "TEST"."MV_T1" never refresh;
删除物化视图日志:
drop MATERIALIZED VIEW log on dept;
删除物化视图:
drop MATERIALIZED view mv_dept;
索引
1统计信息
包含表、列、索引。
DBMS_STATS包
收集表的统计信息:dbms_stats.gather_table_stats ('TEST','T1');
查询表的统计信息:dbms_stats.table_stats_show ('TEST','T1');
查看列的统计信息:
dbms_stats.column_stats_show ('TEST','T1','ID');
(查看列之前先得搜集表的统计信息)
收集模式的统计信息
dbms_stats.GATHER_SCHEMA_STATS ('TEST');
查询模式的统计信息
dbms_stats.SCHEMA_STATS_show ('TEST');
sp_col_stat
查看达梦自带参数
select * from v$ifun where name like 'SP%_STAT';
只搜集表的统计信息,不搜集列:sp_tab_stat_init('TEST','T_F1');
查看表的统计信息:dbms_stats.table_stats_show ('TEST','T_F1');
搜集列的统计信息:
sp_col_stat_init('TEST','T_F1','ID');
查看列的统计信息
dbms_stats.column_stats_show ('TEST','T_F1','ID');
验证:
多插入一些数据
begin
for i in 1001..100000 loop
insert into t1 values (i,'BBB'||i);
commit;
end loop;
end;
新建索引:选择表T1,下拉约束右键新增,索引名称为T1_ID,选择ID。
再更新表统计信息、查看表的统计信息
dbms_stats.gather_table_stats ('TEST','T1');
dbms_stats.table_stats_show ('TEST','T1');
查看表的执行计划(SSCN代表走了索引)
explain select ID FROM T1 WHERE ID LIKE '100%';
2唯一索引
T1表下拉索引右键,新建索引名称为IND_T1_ID---
B树索引,二级索引,唯一索引--
选择ID(ID列不能有重复值)
3复合/组合索引
CREATE INDEX IND_ID_NAME ON T1(ID,NAME);
4位图索引
T_F1表下拉索引右键新增,名称为IND_T_ID,
选位图索引,选ID。
(适合OLAP系统,列上值有大量重复数据)
5函数索引
T1表下拉索引右键新增,名称为T1_ID,
B树索引,二级索引,函数索引,
表达式 UPPER(NAME) (如果数值为小写改为 lower(NAME) )
验证:EXPLAIN SELECT * FROM T1 WHERE LOWER(NAME)='AAA2';
查询索引:SELECT * FROM SYS.USER_INDEXES WHERE TABLE_NAME LIKE '% T1%';
6局部索引
创建:CREATE INDEX T_F1_ID ON T_F1(ID);
查询索引:SELECT * FROM SYS.USER_INDEXES WHERE TABLE_NAME LIKE '%T_F1%';
(分区表创建的索引默认为局部索引)
7全局索引
创建:create INDEX t_f1_name on t_f1(name) GLOBAL;
查询索引:SELECT TABLE_NAME,INDEX_NAME,PARTITIONED FROM SYS.USER_INDEXES
WHERE PARTITIONED='NO' AND TABLE_NAME='T_F1';
(PARTITIONED为NO全局,为YES分区)
8维护索引
查看索引:select table_name,INDEX_NAME,STATUS,VISIBILITY
FROM SYS.USER_INDEXES;
(表名,索引名,状态,可见情况)
索引无效 alter INDEX IND_NAME UNUSABLE;
重建索引 alter INDEX IND_NAME RENUILD;
索引不可见 ALTER INDEX IND_NAME INVISIBLE;
索引可见 ALTER INDEX IND_NAME VISIBLE;
索引监控 ALTER INDEX IND_NAME MONITORING OSAGE;
查看监控 select * from SYS.V$OBJECT_USAGE;
关闭监控 ALTER INDEX IND_NAME NOMONITORING
USAGE;
9全文索引
自动更新统计信息:创建代理环境,添加作业,右键新建作业,作业步骤的步骤类型选更新统计信息。
创建全文索引
新建:CREATE CONTEXT INDEX IND_ADDRESS ON PERSON.ADDRESS(ADDRESS1);
全量更新全文索引
ALTER CONTEXT INDEX PERSON.IND_ADDRESS ON PERSON.ADDRESS REBUILD;
查询四张表
用来保存分词结构
SELECT * FROM PERSON.CTI$IND_ADDRESS$I;
保存基表发生增量变化的数据
SELECT * FROM PERSON.CTI$IND_ADDRESS$P;
保存原纪录 rowid 和新纪录 docid 映射关系
SELECT * FROM PERSON.CTI$IND_ADDRESS$N;
保存了所有将被删除的 docid
SELECT * FROM PERSON.CTI$IND_ADDRESS$D;
执行查询计划,数据少会不走索引
EXPLAIN SELECT * FROM PERSON.ADDRESS WHERE CONTAINS(ADDRESS1,'洪山区');
增量更新全文索引
修改数据:
UPDATE PERSON.ADDRESS SET ADDRESS1='洪山区123456' WHERE ADDRESSID =15;
COMMIT;
增量更新全文索引
ALTER CONTEXT INDEX PERSON.IND_ADDRESS ON PERSON.ADDRESS INCREMENT;
查询数据
SELECT * FROM PERSON.ADDRESS WHERE CONTAINS(ADDRESS1,'洪山区' AND '123456');
创建全文索引填充更新
删除全文索引
DROP CONTEXT INDEX PERSON.IND_ADDRESS ON PERSON.ADDRESS;
创建索引
CREATE CONTEXT INDEX PERSON.IND_ADDRESS ON PERSON.ADDRESS(ADDRESS1) SYNC;
修改数据(不需更新p表有值)
UPDATE PERSON.ADDRESS SET ADDRESS1='洪山区789' WHERE ADDRESSID =15;
COMMIT;
增量更新全文索引
ALTER CONTEXT INDEX PERSON.IND_ADDRESS ON PERSON.ADDRESS INCREMENT;
查询数据
SELECT * FROM PERSON.ADDRESS WHERE CONTAINS(ADDRESS1,'洪山区' AND '789');
DEM管理
1DEM部署说明(su - dmdba 操作)
解压安装包
su - root
分配权限解压到哪个目录给哪个权限cd /opt
chown dmdba:dinstall *
su - dmdba
cd /opt
unzip 压缩文件名称.zip(DEM和TOMCAT)
cd /dm8/data/DM01/
命令:create table "TEST"."T_ENC" ( "ID" INT,
"NAME" VARCHAR(50) encrypt with "DES_ECB" manual );
验证:用户只能查询自己插入的数据
TEST 用户:
SYSDBA 用户操作如下:
DM 数据库支持的加密算法:
select * from sys.V$CIPHERS;
4审计
1.开启审计
用审计操作员登录数据库:SYSAUDITOR
查看数据库是否开启审计:
select * from v$dm_ini where para_name like '%ENABLE_AUDIT%';
0 关闭审计
1 打开普通审计
2 打开普通审计和实时审计
打开数据库审计:
sp_set_enable_audit(1);
关闭审计:
sp_set_enable_audit(0);
查看审计日志文件:
su - dmdba
cd /dm8/data/DAMENG/ ( DAMENG是实例名称 )
查找日志文件 ll AUDIT*
看下文件名称 ll
2语句级审计
用审计操作员登录数据库:SYSAUDITOR
SP_AUDIT_STMT( TYPE VARCHAR(30),
USERNAME VARCHAR (128),
WHENEVER VARCHAR (20) )
参数说明:
TYPE:语句级审计选项,即上表中的第一列
USERNAME :用户名,NULL 表示不限制
WHENEVER :审计时机,可选的取值为:
ALL:所有的
SUCCESSFUL:操作成功时
FAIL:操作失败时
审计 TEST 用户对表的 DDL 操作
sp_audit_stmt('TABLE','TEST','ALL');
验证:
用test用户创建表 create table b(ID INT);
创建表后查看审计信息用SYSAUDITOR
select * from V$AUDITRECORDS;
删除表 drop table b;
删除表后查看审计信息用SYSAUDITOR
select * from V$AUDITRECORDS;
取消审计 TEST 用户对表的 DDL 操作
sp_noaudit_stmt('TABLE','TEST','ALL');
3对象审计
用审计操作员登录数据库:SYSAUDITOR
SP_AUDIT_OBJECT (
TYPE VARCHAR(30),
USERNAME VARCHAR (128),
SCHNAME VARCHAR (128),
TVNAME VARCHAR (128),
COLNAME VARCHAR (128),
WHENEVER VARCHAR (20) )
审计 TEST 用户删除 T1 表记录的操作
Sp_audit_object('DELETE','TEST','TEST','T1','ALL');
用TEST用户删除T1表 delete from T1 where ID=2;
查看审计记录 select * from V$AUDITRECORDS;
审计任何用户插入 TEST.T1 表的操作
sp_audit_object('INSERT','NULL','TEST','T1','ALL');
用TEST用户插入T1表 insert into T1 values (50000,’50000AAAAA’);
查看审计记录: select * from V$AUDITRECORDS;
通过工具查看审计记录
[dmdba@localhost tool]$ ./analyzer
通过审计日志查看器指定文件夹,选择日志文件。
迁移(DTS)
https://eco.dameng.com/document/dm/zh-cn/start/tool-dm-migrate.html
DM--SQL
指定模式
指定对象
验证:su - dmdba
cd /home/dmdba
ll
vi ddl.sql
vi DMHR_DEPARTMENT.sql
vi DMHR_EMPLOYEE.sql
Oracle--DM
达梦快速装载工具
dmfldr
查看帮助手册:
[dmdba@localhost bin]$ ./dmfldr help
1.案例 1:数据导入DM8:
根据数据文件,创建表和编写控制文件:
编写数据文件 su - dmdba cd /dm8/backup/data
vi ext2.txt
文件内容 1|AAA
2|BBB
3|CCC
4|
数据库执行新建表 create table test.fldrtest (id int,name varchar(50));
编写控制文件 vi fldrtest.ctl
文件内容 load data
infile '/dm8/backup/data/ext2.txt'
into table test.fldrtest
fields '|'
查看文件内容 cat fldrtest.ctl
执行导入 su - dmdba cd /dm8/bin
./dmfldr test/DM01SYSDBA control='/dm8/backup/data/fldrtest.ctl'
2.案例 2,大字段导出
创建表插入数据:create table test.clob1(id int,addr CLOB);
insert into test.clob1
values
(1,'ADKJEkdkdkdkDKJDIEMCKDSLAKJFKDDKJASKEJDAKSKDKDHJDFBG');
insert into test.clob1
values
(2,'MMMMMMMMMMMMMMMDDDDDDDHHHHHHEEEEEEEOOOOOA
JKSDFJSASDWAskjsdlksadlk');
commit;
编写控制文件:su - dmdba
cd /dm8/backup/data/
vi clob1.ctl
录入内容 LOAD DATA
INFILE ‘/dm8/backup/data/clob1.txt’
INTO TABLE TEST.CLOB1
FIELDS ‘,’
(ID,ADDR)
导出 cd /dm8/bin
./dmfldr test/DM01SYSDBA control=
'/dm8/backup/data/clob1.ctl' mode='OUT'
3案例 3:大字段数据导入
创建空表:create table clob2 as select * from CLOB1 where 1=2;
编写控制文件:su - dmdba cd /dm8/backup/data
vi clob2.ctl
录入数据 LOAD DATA
INFILE ‘/dm8/backup/data/clob1.txt’
INTO TABLE TEST.CLOB2
FIELDS ‘,’
(ID,ADDR)
导入数据:./dmfldr test/Dameng123
control='/dm8/backup/data/clob2.ctl'
mode='IN'
lob_directory='/dm8/backup/data'
性能优化
文章
阅读量
获赞