zoukankan      html  css  js  c++  java
  • 锁与分区

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

    2 锁的优点
    一致性
    完整性
    并发性

    3 锁的分类
    行级锁:对正在被修改的行进行锁定。其他用户可以访问除被锁定的行以外的行
    oracle自动加上
    insert
    update
    delete
    select....from...for update [of colums][wait n][no wait];

    表级锁
    锁定整张表,限定其他用户对其操作
    使用命令锁定表,应用表级锁的语法
    lock table 表明 锁的类型名 mode;

    表级锁的分类
    行共享(row shared 简称rs锁); 允许用户进行任何操作,禁止排他锁定
    Example: lock table emp in row shared mode;

    行排他(row Exclusive 简称rx锁):允许用户进行任何操作,禁止共享锁
    Exampel: lock table emp in row exclusive mode;

    共享锁(share 简称s锁) : 其他用户只能查看,不能修改。
    锁定表,仅允许用户查看表中行
    禁止其他用户插入,修改和删除行
    多个用户可以同时在同一张表中应用此锁
    Example: lock table emp in share mode;

    共享行排他:比共享锁有更多的限制,禁止使用共享锁及更高级的锁
    排他锁(Exclusive 简称xs锁):其他用户只能查看,不能修改,不能加其他锁(此等级高于共享锁)
    Example: lock table emp in exclusive mode;

    --使用rollback释放锁

    死锁:
    当两个事物相互等待对方释放资源时,就会形成死锁
    Oracle会自动检测死锁,并通过结束其中的一个事物来解决死锁

    ------------------------------------------------------------------------------------------------------------------------------------
    --表分区:
    分区方法:
    范围分区:以表中的一个列或一组列的值的范围进行分区
    --语法:
    partition by range(column_name){
    partition part1 values less than (range),
    partition part1 values less than (range),
    ......
    partition partN values less than (Maxvalue)
    }
    --案列
    create table sales(
    product_id int,
    sale_cost number
    )
    partition by range(sale_cost)(
    partition p1 values less than(1000),--包含销售额低于10000的所有产品记录
    partition p2 values less than(2000),
    partition p3 values less than(Maxvalue) --这里的Maxvalue大于前面的
    );

    insert into sales values(1001,900);
    insert into sales values(1002,1900);
    insert into sales values(1003,200);
    insert into sales values(1004,30000);
    insert into sales values(1005,50000);

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

    拓展:
    查看当前用户所拥有的分区
    select * from user_tab_partitions;

    散列分区: hash() --dump()
    oracle使用一个散列函数,确定数据应当放在N个分区的哪一个分区。Oracle建议N是2的一个幂
    将数据平均分布到不同的分区

    --语法
    partition by hash(column_name)
    (
    partition part1[tablespace tbs1],
    partition part2[tablespace tbs2],
    ...............
    partition partN[tablespace tbsN]
    );

    --案例
    create table employee(
    emp_id varchar2(20),
    emp_name varchar2(20),
    dept_name varchar2()
    )
    partition by hash(dept_name)
    (
    partition d1,
    partition d2,
    partition d3
    )

    列表分区
    定制分区机制
    允许将不想管的数据组织一起

    --语法
    partition by list(column_name)
    (
    partition part1 values (values_list1);
    partition part1 values (values_list2);
    。。。。。。。。。。。。。。。。。。。。。
    partition part1 values (default)
    );
    --注意:如果定义了default分区,需要增加分区,则要先删除default分区
    --案例
    create table person(
    per_id number,
    per_name varchar2(20),
    per_prov varchar2(20)
    )
    partition by list(per_prov)(
    partition north values('吉林','黑龙江','辽宁'),
    partition west values('甘肃','陕西'),
    partition east values('上海','浙江'),
    partition south values('广东','广西'),
    partition p1 values(default)
    );

    --插入数据
    insert into person values(1001,'yaobol','吉林');
    insert into person values(1002,'yaobo2','黑龙江');
    insert into person values(1003,'yaobo3','广西');
    insert into person values(1004,'yaobo4','广东');
    insert into person values(1005,'yaobo5','吉林');
    insert into person values(1006,'yaobo6','浙江');
    insert into person values(1007,'yaobo7','吉林');
    insert into person values(1008,'yaobo8','上海');
    insert into person values(1009,'yaobo9','吉林');
    insert into person values(10010,'yaobol0','甘肃');
    insert into person values(10011,'yaobol1','陕西');


    复合分区:
    范围分区:
    范围分区与散列分区或列表分区的组合
    --语法
    partition by range(column_name) --创建范围分区
    subpartition by hash(colum_name2)--创建散列子分区
    subpartitions number_of_partitions
    (
    partition part1 values less than(range1),
    partition part2 values less than(range2),
    ................
    partition partN values less than (Maxvalue)

    )

    --案例
    create table emp_sales(
    pro_id varchar2(20),
    sale_date date,
    sale_cost number(10)
    )
    partition by range(sale_cast)
    subpartition by hash(pro_id)
    subpartitions 4
    (
    partition e1 values less than (to_date('2010-10-10','yyyy-MM-dd')),
    partition e2 values less than (to_date('2012-10-10','yyyy-MM-dd')),
    partition e3 values less than (maxvalue)
    );

    --查看当用户的子分区
    select * from user_tab_subpartitions;


    --分区维护操作;
    分区维护操作是修改已分区表的分区
    --分区维护的类型
    计划事件--定期删除最旧的分区
    非计划事件--解决应用程序或系统问题
    --分区维护的操作
    添加分区 --在最后一个分区的后面添加新的分区
    alert table sales add partition p4 values less than(40000);

    删除分区 --删除指定的分区,分区的数据也随之删除
    alert table sales drop partition p3;

    截断分区--删除指定分区中的所有记录
    alert table sales truncate partition p2;

    合并分区 --将范围分区或复合分区的两个相邻的分区合并
    alert table sales merge partition p1,p2 into partition p6

    拆分分区 --将一个大的分区记录拆分到两个分区中
    alert table sales split partition p6 at(1000) into (partition p61,partition p62);

  • 相关阅读:
    http协议详谈
    配置nginx 反向代理
    利用background-positon,background-image ,实现背景渐变
    vue +webpack 打包配置优化
    记项目中易出现的bug点
    vue 中基于html5 drag drap的拖放
    vue 项目技巧
    完整项目搭建全过程(vue-cli+webpack)
    vue+ D3+drag
    项目总结(3.28)
  • 原文地址:https://www.cnblogs.com/yaobolove/p/4732480.html
Copyright © 2011-2022 走看看