pk+uk+fk+index

来源:互联网 发布:啄木鸟xp优化工具 编辑:程序博客网 时间:2024/05/16 19:30

1.pk
数据库表分为实体表和关系表。
实体表是用来描述在domain(领域模型)里确实存在的实体(人、财、物、时间、空间)及实体元素发生的活动(转移)。实体表的pk一般由系统自动生成(SYS_GUID()和sequence)。
关系表是用来描述两张实体表之间的多对多关系,关系表的pk一般是两张实体表pk的联合,此pk同时具有uk的功能,所以关系表不用再建uk。

--查询pk缺失的表
select table_name from user_tables t where  not exists (select 1 from user_indexes i where i.table_name=t.table_name and uniqueness='UNIQUE' and index_name like '%PK%');
--创建pk
alter table yj_dcjxdy add constraint pk_yj_dcjxdy primary key (id);

2.uk
重复记录的发生:在数据库设计之初就考虑给每张表建UK,一般是不会出现重复记录的情况,重复记录的发生主要是因为uk缺失导致的。
uk在后期的调整大多是增加属性,此时不会出现重复记录的情况;当uk的调整是减少属性是,可能出现重复记录。

--查询uk缺失的表
select table_name from user_tables t where  not exists (select 1 from user_indexes i where i.table_name=t.table_name and uniqueness='UNIQUE' and index_name like 'UK_%');
--删除重复记录
delete from yj_dcjxdy e where e.rowid > (select min(x.rowid) from yj_dcjxdy x where x.dcgid = e.dcgid);
--创建uk
create unique index UK_yj_dcjxdy on yj_dcjxdy (dcgid);

3.fk+index
fk是用来描述两张实体表之间的一对多关系(两张实体表之间一般不存在一对一的关系,如果有一对一的两张实体表,完全可以合并成一张实体表)。
fk与pk的区别在于,oracle自动给pk建索引,但默认不给fk建索引。
fk不建索引的后果是:在多表级联查询时,没有索引,将触发全表扫描,在数据量大的情况下,会慢的一塌糊涂。

--查询fk没有建index的情况
select table_name, constraint_name,
cname1 || nvl2(cname2,','||cname2,null) ||nvl2(cname3,','||cname3,null) || nvl2(cname4,','||cname4,null) ||nvl2(cname5,','||cname5,null) || nvl2(cname6,','||cname6,null) ||nvl2(cname7,','||cname7,null) || nvl2(cname8,','||cname8,null) columns
from (select b.table_name, b.constraint_name, max(decode( position, 1, column_name, null )) cname1, max(decode( position, 2, column_name, null )) cname2,
  max(decode( position, 3, column_name, null )) cname3, max(decode( position, 4, column_name, null )) cname4, max(decode( position, 5, column_name, null )) cname5, max(decode( position, 6, column_name, null )) cname6,
  max(decode( position, 7, column_name, null )) cname7, max(decode( position, 8, column_name, null )) cname8, count(*) col_cnt
  from (select substr(table_name,1,30) table_name,substr(constraint_name,1,30) constraint_name,substr(column_name,1,30) column_name,position from user_cons_columns ) a,
       user_constraints b
  where a.constraint_name = b.constraint_name and b.constraint_type = 'R' group by b.table_name, b.constraint_name
      ) cons
where col_cnt > ALL
  (select count(*)
  from user_ind_columns i
  where i.table_name = cons.table_name and i.column_name in (cname1, cname2, cname3, cname4, cname5, cname6, cname7, cname8 )
   and i.column_position <= cons.col_cnt
   group by i.index_name
  ) order by table_name;

--创建index
create index idx_xt_yh_szbm on xt_yh (szbm);

4.引用
select * from user_constraints                             约束表
select * from user_cons_columns                            约束引用列表   position 列在约束中的位置
select * from user_indexes order by uniqueness,index_name  索引表
select * from user_ind_columns                             索引引用列表   column_position 列在索引中的位置
select * from user_tables order by table_name              物理表
select * from user_segments                        物理表和索引表
segment是指可增长的对象,如:表、索引;
其余的像 procedure、package、package body、type、type body、function、trigger都是不可增加对象,
按行存贮在source$的source varchar2(4000)属性中(即每行不能超多4000字节);
其中trigger还有另外一个限制,trigger的名称存放在obj$.name中;
trigger的内容作为匿名块存放在trigger$.action#(long类型 32MB 32760B)中,
即trigger的长度不能超过32760B。

原创粉丝点击