• 分区表实验 之二


             在前面的实验中,完成了分区表的建置,分区合并与删除的操作 ,最近计划做sql server的读写分离操作,用订阅发布的方法。

    在订阅发布的过程中,需要订阅发布的表要有主键,于是我想当然的加了一个自增id列做主键,本以为是一个很简单的操作,结合却碰到了困难。

    系统系统提示在建立主键,唯一索引,聚集索引的时候,分区列必须包含在其中。

    1.查看表结构,发现没有建主键

    exec sp_help [PRODUCT_WORKORDER_PROCESS_DEFECT_DETAIL];

    2. 给表格加一个主键data id (自增列)

    alter table product_workorder_process_defect_detail
    add dataid bigint identity(1,1)  primary key.

     系统报错,主键建立失败。

    3.于是,我就先将自增列加上再说,不管主键

    alter table product_workorder_process_defect_detail
    add dataid bigint identity(1,1)

    这一部执行成功

    4. 我试着执行了一句如下语句,太慢,执行了一分钟左右后取消了,分析是因为没有index的情况下,做全表扫描,所以很慢
    select max(dataid) from product_workorder_process_defect_detail

    5,按2中的提示,我尝试将createDT列加入主键中

     alter table product_workorder_process_defect_detail
    add  constraint pk_product_workorder_process_defect_detail  primary key (createDT,dataid);

    结果还是报错,提示createDT上nullable为yes,不能做为primary key column.

    6.我想当然的想改掉createDT上的nullable 为no

    alter table product_workorder_process_defect_detail
    alter column createDT datetime not null;

    结果不行,提示createDT列已被其它对象引用,不能执行此操作

    7.我想可能是因为分区表的原因,一不做二不休,将分区表变回普通表,先删掉上面的分区聚集index

       drop index cidx_product_workorder_process_defect_detail_createDT on product_workorder_process_defect_detail

    8, 又试着执行了一下如下语句,还是不成功

    alter table product_workorder_process_defect_detail
    alter column createDT datetime not null;

     9, 老老实实的重新生成普通clustered index on primary,将分区表变回普通表

    CREATE CLUSTERED INDEX [cidx_createDT] ON [dbo].[PRODUCT_WORKORDER_PROCESS_DEFECT_DETAIL]
    (
    [CreateDT]
    )
    ON[PRIMARY];

     执行完成后再检查,发现变回了普通表

    10 此时虽然不是分区表了,但因为针对createDT建立了index,所以还是不能执行alter colum的操作,下面的语句还是执行失败

    alter table product_workorder_process_defect_detail
    alter column createDT datetime not null;

    11.索性将这个clustered index也删除了,这一步操作成功

    drop index [cidx_createDT] ON [dbo].[PRODUCT_WORKORDER_PROCESS_DEFECT_DETAIL]

    12.现在没有任何对象参照到createDT列,再将它改为not null

    alter table product_workorder_process_defect_detail
    alter column createDT datetime not null;

    操作终于成功了

    13 .再次加主键,操作成功

    alter table product_workorder_process_defect_detail
    add constraint pk_product_workorder_process_defect_detail
    primary key (createDT,dataid);

    13,重建分区表,这一步又失败了,提示只能有一个clustered index.

    create clustered index cidx_createDT ON product_workorder_process_defect_detail
    (
    CreateDT
    )
    with (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF)
    on [PS_PFUN_DATETIME]([CreateDT])

    无法对 表 'product_workorder_process_defect_detail' 创建多个聚集索引。请在创建新聚集索引前删除现有的聚集索引 'pk_product_workorder_process_defect_detail'。

    14.我想drop掉主键上的index,保留主键,不行,哈 哈 .

    drop index pk_product_workorder_process_defect_detail on product_workorder_process_defect_detail

    不允许对索引 'product_workorder_process_defect_detail.pk_product_workorder_process_defect_detail' 显式地使用 DROP INDEX。该索引正用于 PRIMARY KEY 约束的强制执行

    15 分析了一下,上一步create primary key 的时候弄错了,应该用no clustered.,只能先drop掉主键

         alter table product_workorder_process_defect_detail
         drop constraint pk_product_workorder_process_defect_detail

    16. 然后再建立分区索引

    create clustered index cidx_createDT ON product_workorder_process_defect_detail
    (
    CreateDT
    )
    with (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF)
    on [PS_PFUN_DATETIME]([CreateDT])

    17. 再次建 立主键

    alter table product_workorder_process_defect_detail
    add constraint pk_product_workorder_process_defect_detail
    primary key (createDT,dataid);

  • 相关阅读:
    Jupsh_flutter Android 收不到消息 / 排查不出请根据第 9 点说明提供信息
    angular表单 Dom获取表单值以及双向数据绑定
    angular中的组件以及组件中的模板合成
    Flutter开发的app进行设备判断是Ios还是android
    Java的封装
    GCD编程 之 略微提高篇
    多线程基础(六)GCD基础
    我遇到的CocoaPods的问题(也许后期会解决,持续更新)
    iOS之通过PaintCode快速实现交互动画的最方便方法 未解问题
    多线程基础(五)NSThread线程通信
  • 原文地址:https://www.cnblogs.com/yuchsheng/p/13296758.html
Copyright © 2020-2023  润新知