管理模式
模式与用户之间的关系:
模式定义:模式是一个特定的对象集合,在概念上可将其看作是包含表、视图、索引等若干
对象的对象集
模式对象: 表、视图、约束、索引、序列、触发器、存储过程/函数、包、同
义词、类、域
模式与用户之间的关系:
当系统建立一个用户时,会自动生成一个同名的模式
用户还可以建立其他模式,DM 中用户和模式是一对多的关系,一个用户可以拥有多个模式,
一个模式仅能归属于一个用户。Oracle 中用户和模式是一对一的关系。
关于达梦模式和用户的关系,可以查看达梦社区贴:
对达梦数据库用户和模式的理解 | 达梦技术社区 (dameng.com)
select * from SYSOBJECTS t where t."TYPE$" ='SCH'; --查看模式
select * from SYSOBJECTS t where t."SUBTYPE$" ='USER'; --查看用户
--查询模式和用户的对应关系:
select a.id scheid, a.name schename, b.id userid, b.name username
from SYS.SYSOBJECTS a, SYS.SYSOBJECTS b
where a."TYPE$" = 'SCH' and a.pid = b.id;
模式管理
--创建模式
create schema hrtest01 AUTHORIZATION HRTEST;
create table hrtest01.t_test(id int, name varchar(20));
--查看当前模式和当前用户
select sys_context('USERENV','CURRENT_SCHEMA');
select sys_context('USERENV','CURRENT_USER'); 或 select user;
--切换模式(仅对当前会话生效)
set SCHEMA dmhr;
[dmdba@KylinDCA03 ~]$ disql sysdba/Dameng123
服务器[LOCALHOST:5236]:处于普通打开状态
登录使用时间 : 1.497(ms)
disql V8
SQL> select sys_context('USERENV','CURRENT_SCHEMA');
行号 SYS_CONTEXT('USERENV','CURRENT_SCHEMA')
---------- ---------------------------------------
1 SYSDBA
已用时间: 1.471(毫秒). 执行号:2100.
SQL> set schema dmhr;
操作已执行
已用时间: 1.039(毫秒). 执行号:0.
SQL> select sys_context('USERENV','CURRENT_SCHEMA');
行号 SYS_CONTEXT('USERENV','CURRENT_SCHEMA')
---------- ---------------------------------------
1 DMHR
--删除模式
drop SCHEMA IF EXISTS HRTEST01;
drop SCHEMA IF EXISTS HRTEST01 CASCADE; --级联删除模式下对象,生产环境慎用。
管理表
表包含:索引组织表、堆表、分区表、HUGE 列存储表、外部表、临时表。
DM 默认创建的是索引组织表,Oracle 默认创建的是堆表。
索引组织表和堆表的区别:
索引组织表:有且仅有一个聚簇索引键,表数据按照聚簇索引键排序(数据是有序的,插入有序),如果在创建表时未指定聚簇索引键,默认使用 rowid 为聚簇索引键。rowid 是逻辑rowid,占用存储空间,所以索引组织表比堆表占用较多空间。
堆表:数据是无序的,插入无序,堆表插入效率较高,rowid 是物理 rowid,不占用存储空间。所以堆表比索引组织表节约空间。
对聚簇索引键的范围查询,索引组织表更高效。
DM 默认创建的索引组织表,由参数 LIST_TABLE 指定。
select * from v$parameter t where name ='LIST_TABLE';
DM 创建表时如果指定了主键,则主键为聚簇索引键(部分版本是这样,由参数
PK_WITH_CLUSTER 指定);如果创建表示未指定主键,则 rowid 为聚簇索引键;
select * from v$parameter t where name ='PK_WITH_CLUSTER';
SQL 管理表
创建表:
create table hrtest.t_testpid(
pid int,
pname varchar(20),
sex bit,
logtime datetime)
TABLESPACE dmtbs;
CTAS方式创建表:
create table t_emp01 as select * from dmhr.employee;
create table t_emp02 like dmhr.employee;
create table t_emp03 as select * from dmhr.employee where 1=0;
--使用CREATE table as创建表时,默认不会复制表的约束信息,由参数
CTAB_SEL_WITH_CONS指定:
select * from SYS."V$PARAMETER" t where t.name like 'CTAB_SEL_WITH_CONS%';
添加字段:
alter table hrtest.t_testpid add column email varchar(20);
修改字段类型:
alter table hrtest.t_testpid modify email varchar(50);
删除字段:
alter table hrtest.t_testpid drop logtime;
对字段添加默认值(大表不建议添加字段时给默认值,耗时很长):
alter table hrtest.t_testpid add column logtime datetime default sysdate;
重命名表或字段:
alter table t_test rename to t_testoa;
alter table t_testoa rename column id to pid;
数据字典:
select * from dba_tables t where t.owner='HRTEST';
select * from dba_tab_columns t where t.owner='HRTEST';
select t.TABLE_NAME, t.TABLESPACE_NAME from user_tables t;
select t.TABLE_NAME, t.COLUMN_NAME, t.NULLABLE from USER_TAB_COLS t;
对表和字段添加注释:
comment on column t_testpid.sex is 'sex. 0:female 1: male';
comment on table t_testpid is 'this is a test table';
select * from user_tab_comments;
select * from user_col_comments;
修改表的表空间(DM 会自动重建该表上的索引)
alter table hrtest.T_TESTPID move tablespace main;
select * from dba_tables t where t.TABLE_NAME like 'T_TEST%';
数据的导入
DM 在 DISQL 下用 start 或`都可以, Oracle 用@:
SQL> start /dm8/backup/dts/t_department.sql
SQL> `/dm8/backup/dts/t_department.sql
或者 disql 可以直接调用脚本:
[dmdba@KylinDCA04 backup]$ disql hr/'"Dameng@123"' '`city.sql'
可以关闭回显以提高导入效率:
SQL> set TIMING off;
SQL> set FEEDback off;
SQL> set echo off;
DM 管理工具只能使用`, `后面的文件路径不能有空格,导入后需要手工 commit;
/dm8/backup/dts/t_department.sql
DM 管理工具创建表
DM 管理工具上创建表
注意,客户端操作区分大小写,建议统一使用大写。否则,使用时,小写需要加双引号。
管理约束
约束类型:
NOT NULL:非空约束
UNIQUE:唯一约束
PRIMARY KEY:主键约束 (唯一约束+非空约束)
FOREIGN KEY:外键约束
CHECK:检验约束
SQL 管理约束
非空约束
alter table hrtest.t_testpid modify pname not null;
唯一约束
alter table hrtest.t_testpid add CONSTRAINT uk_testpid_email unique (email);
主键约束
alter table hrtest.t_testpid ADD CONSTRAINT pk_testpid_pid PRIMARY KEY(pid);
检验约束
alter table hrtest.t_testpid add salary number(10,2);
alter table
hrtest.t_testpid ADD CONSTRAINT ck_testpid_salary CHECK
(salary>=2100);
外键约束(外键引用两一张表的主键或者唯一键)
alter table hrtest.t_test add CONSTRAINT fk_test_id FOREIGN KEY(id) REFERENCES
hrtest.t_testpid(pid);
--约束的禁用和启用、删除
alter table hrtest.t_test disable CONSTRAINT fk_test_id;
alter table hrtest.t_test enable CONSTRAINT fk_test_id;
alter table hrtest.t_test drop CONSTRAINT fk_test_id;
SQL> desc t_testpid;
行号 NAME TYPE$ NULLABLE
---------- ------- ----------- --------
1 PID INTEGER N
2 PNAME VARCHAR(20) N
3 SEX BIT Y
4 EMAIL VARCHAR(50) Y
5 LOGTIME DATETIME(6) Y
6 SALARY DEC(10, 2) Y
6 rows got
已用时间: 8.086(毫秒). 执行号:2801.
SQL> insert into t_testpid(pid, pname, sex, email, salary) values(1, 'test', 0, 'test@qq.com', 2300);
影响行数 1
已用时间: 0.812(毫秒). 执行号:2802.
SQL> insert into t_testpid(pid, pname, sex, email, salary) values(1,'test', 0, 'test@qq.com', 2300);
insert into t_testpid(pid, pname, sex, email, salary) values(1,'test', 0, 'test@qq.com', 2300);
[-6602]:违反表[T_TESTPID]唯一性约束.
已用时间: 0.721(毫秒). 执行号:0.
SQL> insert into t_testpid(pid, pname, sex, email, salary) values(2, null, 0, '123@qq.com', 2300);
insert into t_testpid(pid, pname, sex, email, salary) values(2, null, 0, '123@qq.com', 2300);
[-6609]:违反列[PNAME]非空约束.
已用时间: 0.651(毫秒). 执行号:0.
SQL> insert into t_testpid(pid, pname, sex, email, salary) values(2, '123', 0, 'test@qq.com', 2300);
insert into t_testpid(pid, pname, sex, email, salary) values(2, '123', 0, 'test@qq.com', 2300);
[-6602]:违反表[T_TESTPID]唯一性约束.
已用时间: 0.747(毫秒). 执行号:0
SQL> insert into t_testpid(pid, pname, sex, email, salary) values(2, '123', 0, '123@qq.com', 2300);
影响行数 1
已用时间: 0.610(毫秒). 执行号:2806.
SQL> insert into t_testpid(pid, pname, sex, email, salary) values(3, 'ccc',0,'ccc@qq.com',2000);
insert into t_testpid(pid, pname, sex, email, salary) values(3, 'ccc',0,'ccc@qq.com',2000);
[-6604]:违反 CHECK 约束[CK_TESTPID_SALARY].
已用时间: 0.757(毫秒). 执行号:0.
相关数据字典:
select * from dba_constraints t where t.owner='HRTEST';
select * from DBA_CONS_COLUMNS t where t.owner='HRTEST';
批量禁用外键约束:
select 'alter table '||owner||'.'||table_name||' disable constraint '|| t.CONSTRAINT_NAME ||';'
from DBA_CONSTRAINTS t
where t.OWNER ='DMTEST' and t.CONSTRAINT_TYPE = 'R';
DM 管理工具管理约束
可以在创建表是指定约束信息,也可以表创建完成后添加约束。
管理索引
索引类型包含:聚簇索引、二级索引、函数索引、位图索引(主要用于 OLAP 系统)、位图连接索引、全文索引、组合索引等。
索引:二级索引(B 树索引),索引的存在是为了提高查询速度。索引存放的是索引列值、聚簇索引键和 rowid。
一种数据库对象,通过指针加速查询速度,通过快速定位数据的方法,减少磁盘 I/O。
索引特点:索引与表相互独立,索引占用存储空间(如果一个表越大,其索引也会越来越大),索引相当于一个小表,索引是有序的(按照索引字段排序),在查询时服务器自动使用索引,DML
操作时自动维护索引。
索引的优点:提高查询性能、减少排序。
索引的缺点:索引不是越多越好,索引会降低 DML 的效率(DML 操作需要维护索引)。
组合索引创建时要注意索引列的顺序(一般经常查询的列放在前面,等值查询列放在前面)。
SQL 管理索引
explain select * from hrtest.t_emp01 t where T.EMPLOYEE_NAME = '马学铭';
create index ix_emp01_employeename ON HRTEST.T_EMP01(EMPLOYEE_NAME);
create table t_EMP like DMHR.EMPLOYEE;
create index ix_emp_employeename ON T_EMP(EMPLOYEE_NAME);
统计信息的收集:
dbms_stats.gather_table_stats('HRTEST','T_EMP01');
统计信息的查看:
dbms_stats.table_stats_show('HRTEST','T_EMP01');
dbms_stats.index_stats_show('HRTEST','IX_EMP01_EMPLOYEENAME');
索引的监控:
alter index HRTEST.IX_EMP01_EMPLOYEENAME MONITORING USAGE; --开启索引监控
alter index HRTEST.IX_EMP01_EMPLOYEENAME NOMONITORING USAGE; --关闭索引监控
select * from v$object_usage; --查看索引的监控信息
索引的重建(生产环境建议使用 online 方式重建,不影响表的 DML 操作):
alter index HRTEST.IX_EMP01_EMPLOYEENAME rebuild ONLINE;
索引的数据字典:
select * from dba_indexes t where t.OWNER ='HRTEST';
select * from dba_ind_columns t where t.index_OWNER ='HRTEST';
删除索引:
drop index HRTEST.ix_emp01_employeename;
DM 管理工具创建索引
管理视图
普通视图(物化视图除外)中不包含数据,数据来源于基表。视图提供一个查询窗口。
从用户角度来看,一个视图是从一个特定的角度来查看数据库中的数据
从数据库系统内部来看,一个视图是由 SELECT 语句组成的查询定义的虚拟表
简单视图:单表查询,不包含聚合函数、group by 等。一般可以支持 DML 操作,对视图的
DML 操作都会转化为对基表的 DML 操作,DML 操作要满足基表的约束条件。
复杂视图:多表连接,包含聚合函数、group by 等。一般不支持增删改操作。
create view hrtest.v_emp
as
select a.EMPLOYEE_ID, a.EMPLOYEE_NAME, a.EMAIL, a.PHONE_NUM
from dmhr.employee a
where a.DEPARTMENT_ID = 1001;
create or REPLACE view hrtest.v_emp
as
select a.EMPLOYEE_ID, a.EMPLOYEE_NAME, a.EMAIL, a.PHONE_NUM, a.SALARY
from dmhr.employee a
where a.DEPARTMENT_ID = 1001;
select * from hrtest.v_emp ;
创建复杂视图:
create or REPLACE view hrtest.v_emp_salary
as
select a.DEPARTMENT_ID, sum(A.SALARY) SUM_SALARY
from dmhr.employee a
group by a.DEPARTMENT_ID
having sum(A.SALARY) > 100000;
select * from hrtest.v_emp_salary ;
create or REPLACE view v_empnum
as select t.DEPARTMENT_ID, count(*) empnum
from t_emp01 t
group by t.DEPARTMENT_ID
having count(*) > 25;
select * from v_empnum;
--排行榜视图:
create view hrtest.v_salarytop as
select emp.employee_name,
dept.department_name,
emp.salary,
rank()over(order by salary desc) rank,
dense_rank()over(order by salary desc) dense_rank,
row_number()over(order by salary desc) rownumber
from dmhr.employee emp, dmhr.department dept
where emp.department_id = dept.department_id(+);
select * from hrtest.v_salarytop;
DM管理工具创建视图: