Oracle Class3. 锁和表分区

数据库锁与分区详解
本文详细介绍了数据库中的锁机制,包括DML锁如行锁、表级锁、死锁及DDL锁如排他DDL锁、共享DDL锁等,并探讨了锁在并发控制中的作用。此外,还深入讲解了表分区技术,包括范围分区、列表分区、散列分区及复合分区的创建和维护方法。

------------------------2013-5-8------------------------

DML锁可以分为,行锁,表级锁,死锁。
DDL锁可以分为,排他DDL锁,共享DDL锁,分析锁。

--查看当前数据库里锁的情况。
select object_id,session_id,locked_mode from v$locked_object;
如果出现了锁的问题,某个DML操作可能等待很久没有反应。


grant select on emp to newlifeyhj;

Grant delete on emp to newlifeyhj;

Grant all on emp to newlifeyhj;

-- 访问权限精细到列。 报错 ORA-00905: 缺少关键字
Grant update on emp(sal) to newlifeyhj;
Grant select on emp(ename,sal) to newlifeyhj;

--修改,锁定资源。只到提交了才会执行。
update scott.emp set sal = sal +100 where empno = '7369';
将scott.emp表的查询,修改权限给newlifeyhj来测试。


--表拥有者执行加锁查询
--select * from emp where empno = '7369' for update wait 5;

--select * from emp where empno = '7369' for update nowait;

commit;

--for update of 专用于连接查询中锁定某一个或是某几个表。


--表拥有者对表进行共享锁定
--lock table emp in share mode;

select * from emp where empno='7369'

--rollback;


--共享更新
--lock table emp in share update mode;

select * from scott.emp where empno = '7369';

--排他锁
--lock table emp in exclusive mode;

--rollback;

--同义词,类似表的别名。
--create synonym o_emp for emp;

select * from o_emp where empno = '7369';

##表分区##
#范围分区#
create table student(
 stu_name varchar2(8),
 stu_age number(2)
)
partition by range(stu_age)
(
partition p1 values less than(12),
partition p2 values less than(16),
partition p3 values less than(20),
partition p4 values less than(maxvalue)
);

desc user_tab_partitions

select table_name,partition_name from user_tab_partitions where table_name = 'STUDENT';   //表名区分大小写。
select table_name,partition_name,high_value,tablespace_name from user_tab_partitions where table_name = 'STUDENT';

--分区查询--
select * from student partition(p1);
select * from student partition(p2);
select * from student partition(p3);
select * from student partition(p4);

#列表分区#
create table student2(
  stu_name varchar2(8),
  stu_age number(2),
  stu_address varchar2(12)
)
partition by list(stu_address)(
partition east values('向阳村','红旗广场'),
partition south values('南大门','摩托车大市场'),
partition west values('马家河','炎帝广场'),
partition north values('响石广场','清石广场')
);

insert into student2 values ('ANiu',12, '向阳村');
insert into student2 values ('ANiu',15, '南大门');
insert into student2 values ('ANiu',17, '清石广场');
insert into student2 values ('ANiu',19, '炎帝广场');

select * from student2;
select * from student2 partition(east);
select * from student2 partition(west);

按分区删除数据。
delete from student2 partition(east);

select table_name, partition_name, high_value, tablespace_name from user_tab_partitions where table_name = 'STUDENT2';

#散列分区#
create table employee(
  employee_id varchar2(5),
  employee_name varchar2(20),
  department varchar2(10)
)
partition by hash(department)(
  partition D1,
  partition D2,
  partition D3
);


#复合分区#
范围分区与散列分区或列表分区的组合。
CREATE TABLE SALES
(
    PRODUCT_ID VARCHAR2 (5),
    SALES_DATE DATE NOT NULL,
    SALES_COST NUMBER (10)
)
PARTITION BY RANGE (SALES_DATE)
SUBPARTITION BY HASH (PRODUCT_ID)
SUBPARTITIONS 5 
(
    PARTITION S1 VALUES LESS THAN (TO_DATE(‘01/4月/2001',
    'DD/MON/YYYY')),
    PARTITION S2 VALUES LESS THAN (TO_DATE(‘01/7月/2001',
    'DD/MON/YYYY')),
    PARTITION S3 VALUES LESS THAN (TO_DATE(‘01/9月/2001',
    'DD/MON/YYYY')),
    PARTITION S4 VALUES LESS THAN (MAXVALUE)
);

 

##表分区维护##
--删除分区-- 删除一个指定的分区,分区的数据也随之删除。
--alter table student drop partition p4;

--增加分区--
--alter table student add partition p5 values less than(90);

--截断分区-- 删除指定分区中的所有记录
--alter table student truncate partition p3;
--合并分区--  ORA-14012: 结果分区名与现有分区名发生冲突, p6新的分区名。
alter table student merge partitions p1,p2 into partition p6;

--拆分分区--
alter table sales split partition p2 at(1500) into (partition p21,partition p22)


select table_name, partition_name from user_tab_partitions where table_name = 'STUDENT';


##序列##
#创建序列#
create sequence seqTest start with 1 increment by 1 maxvalue 9;

select seqTest.nextval from dual;  //下一个值    注意:不是value是val
select seqTest.currval from dual;  //查询当前值  注意:不是value是val

查看数据字典的结构
desc user_sequences;

删除序列
drop sequence seqTest;

锁是数据库用来控制共享资源并发访问的机制。
锁用于保护正在被修改的数据。
直到提交或回滚了事务之后,其他用户才可以更新数据。

锁定的优点:一致性和完整性。并行性
行级锁和表级锁。
使用commit或rollback语句释放锁。

表级锁类型
行共享  行排他  共享  共享行排他  排他

将一个表分成多个分区,只访问表中的特定分区。
将不同的分区存储在不同的磁盘,提高访问性能和安全性。
独立地备份和恢复每个分区。

<think>好的,我需要帮助用户确定如何检查数据库中的表是否为分区表。根据用户提供的引用内容,不同数据库系统可能有不同的方法。用户提到了Oracle、PostgreSQL达梦数据库,所以我需要分别针对这三个数据库系统来解答。 首先,对于Oracle数据库,引用[1]提到创建分区表的步骤,比如使用PARTITION BY子句。因此,检查一个表是否是分区表,可以查询数据字典视图,比如USER_PART_TABLES或者ALL_PART_TABLES。如果表存在其中,说明是分区表。 然后是PostgreSQL,引用[2]说明PostgreSQL的分区表是通过继承实现的,但较新版本也支持声明式分区。可能需要查询pg_class或pg_inherits表,查看表是否有子表,或者检查pg_partitioned_table是否存在对应的条目。 至于达梦数据库,引用[3]中的例子使用了交换分区的操作,所以可能需要查询系统表如SYSOBJECTS或DBA_TAB_PARTITIONS,检查是否存在分区信息。 此外,可能需要考虑其他常见数据库如MySQLSQL Server的方法,但用户没有提到这些,可能不需要展开。但为了全面,可以简要提及或建议用户查阅具体数据库的文档。 现在需要将这些方法整理成结构清晰的回答,分点说明每个数据库的检查步骤,并确保使用正确的LaTeX格式。同时,生成相关问题,比如不同数据库的分区表管理方法或性能差异等。</think>要确定数据库中的表是否为分区表,不同数据库系统的检查方法有所差异。以下是针对Oracle、PostgreSQL达梦数据库的具体方法: --- ### 一、Oracle数据库 1. **查询数据字典视图** 使用以下SQL语句检查表的分区属性: ```sql SELECT partitioning_type FROM user_part_tables WHERE table_name = &#39;表名&#39;; ``` 若查询结果返回分区类型(如$RANGE$、$HASH$、$LIST$等),则该表为分区表[^1]。 2. **查看分区信息** 通过以下视图查看具体分区: ```sql SELECT partition_name FROM user_tab_partitions WHERE table_name = &#39;表名&#39;; ``` --- ### 二、PostgreSQL数据库 1. **声明式分区(10及以上版本)** 查询`pg_partitioned_table`系统表: ```sql SELECT partrelid::regclass FROM pg_partitioned_table WHERE partrelid = &#39;表名&#39;::regclass; ``` 若返回结果,则表为分区父表[^2]。 2. **继承式分区(旧版本)** 检查表的继承关系: ```sql SELECT inhparent FROM pg_inherits WHERE inhrelid = &#39;表名&#39;::regclass; ``` 若存在父表,则可能是分区子表。 --- ### 三、达梦数据库 1. **查询系统表** 使用`DBA_TAB_PARTITIONS`视图: ```sql SELECT partition_name FROM dba_tab_partitions WHERE table_name = &#39;表名&#39;; ``` 若返回分区名称,则表为分区表[^3]。 2. **检查表属性** 通过`SYSOBJECTS`系统表查看表类型: ```sql SELECT partitioned FROM sysobjects WHERE name = &#39;表名&#39;; ``` --- ### 四、通用方法 - **查看建表语句** 执行`SHOW CREATE TABLE 表名`或查询数据库元数据,观察是否包含$PARTITION BY$子句。 - **管理工具** 使用数据库客户端工具(如Oracle SQL Developer、pgAdmin等)直接查看表的属性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值