测试过一个系统,日流量80万,采用分区表的时候CPU达到100%,而改成普通表后CPU不到50%。
所以最后不得不改成普通表的方式。

解决方案 »

  1.   

    MYGOD!
    为什么要200个分区啊~~~~~
    哥们,你知道分区是干嘛的么?
    一般,是把各分区文件放在不同的物理磁盘(还不是同一磁盘不同分区)上,这样,可以在存储一定范围数据时,在某个磁盘上操作,而存储另一些范围数据时,在另一个磁盘上操作,这样,可以减小磁盘I/O引起的系统延迟.
    你分了200个区,你是不是把各个不同分区文件放在不同磁盘上了?如果不是,那分这样的区有何意义?
      

  2.   


    500 个分区~~~~~
    不要说干别的活了,光建立和分配这些分区就能把你搞晕,然后数据存取的时候把DBMS死.
      

  3.   

    当前两个表,一个是实时表t1,一个历史表t2,使用同一个分区方案。分区表个数500多个。
    表中有多个非聚集索引。每天一个分区,然后每天0点自动将实时表中昨天的数据,交换到历史表的分区中。但是发现实时操作的分区表插入速度比较慢,改成普通表后cpu从100降到了40多。但是普通表交换到历史分区表又存在诸多限制,无法不停机切换(容易出现死锁)。所以想有权威确认一下,如果将实时表t1采用不同的分区方案,比如2个分区,每天自动合并和添加分区。是否就可能既提高性能,又实现平滑交换数据(不停机)?
      

  4.   

    分区操作不是问题。
    我的问题是分区个数少了是不是肯定可以提高插入性能,回到最初的问题。
    “sqlserver2008 分区表个数与性能的关系”,2个和200个的插入性能区别。
    如果没有兄弟做过这样的测试或明确分区表的插入问题,那看来只能再通过测试了。非常感谢各位!
      

  5.   

    一块盘如果都能搞定,存储阵列多块盘做raid10的话,就更没话说了。
      

  6.   


    好吧,看了你的需求,我承认一块磁盘做分区表对你来讲,也有意义。
    你可以尽可能的把当前数据放到新分区中,根据你的需求,可以一月/一周/甚至一天/一个分区。
    只有一块磁盘的话,改为分区表后,相对于普通表,在索引、锁维护方面会减少从而提升性能,但仍会局限于一块磁盘的io读写速度,如果条件允许再加一块磁盘把过往数据交换到该磁盘,那么性能提升才能更明显。
    如果你的io很忙,总是有io队列等待,那么无论是不是分区表,性能都差不多了。
      

  7.   

    最后的解决方案是怎样的?
    实时表t1分两个区,历史表t2分几个(10个以下?)区,t1两个区分为当天数据和昨日数据,每天把昨日区的数据交换到t2表中,再把当天区最为昨日区,新建一个区作为当天区。
    是这样的吗?
    还是只把历史表t2的500多个区合并为几个(10个以下)?
      

  8.   

    那这个问题刚好顺便拿出来讨论一下:如果一个表t分两个区p1,p2,如果只将p2的数据交换到其他表(假设挺占资源的,要一会),对p1分区中的插入,修改,查询会有很大影响吗?
      

  9.   

    事实上,在多个磁盘上建立多个分区,性能也是有可能更差的。
    多分区不只是类似raid的多盘读写带来的性能提高
    楼主呢?来讲讲最后的解决方案呀
      

  10.   

    最后的方案:
    1.实时表3个分区,定义job脚本,每天自动合并就分区和添加新分区
    2.历史表不变500多个分区
    效果是:流量不变的情况下,CPU性能消耗从90%多降到50%以下
      

  11.   

    我测试表A中有2000W数据,用一个模糊查找select top 20 * from a where ordername like '%..%'
    查要6S,按主键ID分了两个区,来查,一样的执行效果,并且读操作还多了上万次。。比较难理解分区表的好处。。
      

  12.   

        表分区相当于对表建立了一个新的主键,对这个新主键的查询会有质的飞跃,而该主键之外的条件进行查询,则速度反而会更慢,在理论上插入操作的速度在分区表上的速度会有所下降,因为增加了对分区的维护
        将不同分区放在不同的阵列上,提高了磁盘的IO和并发性能,读取和写入的速度都会有很大的提高,但提高是有上限的,当IO和并发的能力高于生产的需求后就不会在有回报,这和不进行分区而把数据库文件放在不同的磁盘阵列上是一样的道理
      

  13.   

    忍不住说几句:
    楼主哥们说的是批量数据的迁移(数据库中),如果在一个磁盘迁移数据库中做不到地址指针简单更换,是剪贴了,那么在一个磁盘时,iO很累,数据库操作又有时间限制,死锁肯定是避免不了,与分区索引无关(在迁移前不重做索引的话),这个时候就建议历史数据文件放在其他的磁盘。所以这个问题2个磁盘就可以,多了也没用。
    关于分区:在io允许范围内查询,用分区速度很快,超出IO,一个磁盘建分区反而会慢,呵呵,这个问题不用讨论吧。
      

  14.   

    上楼我发的,我邮箱[email protected],欢迎讨论。