none
单表2亿数据(20G)做分区后,查询性能没有提升!为什么? RRS feed

  • 问题

  • 1年的数据量在2亿出头(20G),起初是该表只有INSERT动作,最近业务上需要SELECT了,

    故我先后测试了一把在SYSTIME(插入记录时间)创建聚集索引:一次是按月分区,另一个未分区。

    但测试下来查询性能没有差异!请教下为什么?是不是因为我ALL TO ([PRIMARY])并且只有一个数据文件?

    分区和SCHEME如下:

    CREATE PARTITION FUNCTION PF_bd_ArrivalTime(DATETIME)
    AS RANGE RIGHT FOR VALUES
    (
    '2010-02-01','2010-03-1','2010-04-01','2010-05-01','2010-06-01','2010-07-1','2010-08-01','2010-09-01','2010-10-1','2010-11-01','2010-12-01'
    )

    CREATE PARTITION SCHEME PS_bd_ArrivalTime
    AS PARTITION PF_bd_ArrivalTime ALL TO ([PRIMARY])

    2013年4月17日 9:18

答案

  • 扯,当要从磁盘读取数据而没有IO分离(如果查询的数据分布在多个独立的磁盘含RAID上),扫描当然没有提升

    太多人把易管理性误认为性能目标。在正确设计的CPU、文件组、磁盘文件时的分区才会有性能提升


    Try SQL Server 2008 QQ:315054403 dgdba@hotmail.com

    • 已建议为答案 Steven.桦仔 2013年4月18日 5:37
    • 已标记为答案 lynn磷 2013年4月18日 7:25
    2013年4月17日 9:40

全部回复

  • 你是如何查询的?执行计划可以贴出来吗?按照我的理解,即使保存在一个数据文件,根据Range查询也是可以提高性能的。

    2013年4月17日 9:30
  • 扯,当要从磁盘读取数据而没有IO分离(如果查询的数据分布在多个独立的磁盘含RAID上),扫描当然没有提升

    太多人把易管理性误认为性能目标。在正确设计的CPU、文件组、磁盘文件时的分区才会有性能提升


    Try SQL Server 2008 QQ:315054403 dgdba@hotmail.com

    • 已建议为答案 Steven.桦仔 2013年4月18日 5:37
    • 已标记为答案 lynn磷 2013年4月18日 7:25
    2013年4月17日 9:40
  • Partitioning will not improve query performance if that query touches all partitions.
    2013年4月17日 12:50
  • 针对于楼主的问题,Partion都放到一个Filegroup,一个文件,如果查询的数据来自三个Partition区间而不是整个Table数据,性能是否会有提升呢?
    2013年4月17日 13:05
  • 没啥提升。。。我试过。

    因为服务器上没做raid,硬盘的话只分了C、D、E三个逻辑分区;如果我建立2个数据文件(都加入PRIMARY),是否有用啊?

    2013年4月18日 3:25
  • 谢谢啊!我也这么认为,但就是因为自己不会RAID,而且服务器上也没有多余的物理磁盘了。。。
    2013年4月18日 3:26
  • 我测试查询时并未跨区操作。。。
    2013年4月18日 3:26
  • 没啥提升。。。我试过。

    因为服务器上没做raid,硬盘的话只分了C、D、E三个逻辑分区;如果我建立2个数据文件(都加入PRIMARY),是否有用啊?

    Will not if files are on same physical disk.
    2013年4月18日 3:30
  • Thanks!
    2013年4月18日 3:40
  • 没啥提升。。。我试过。

    因为服务器上没做raid,硬盘的话只分了C、D、E三个逻辑分区;如果我建立2个数据文件(都加入PRIMARY),是否有用啊?

    Will not if files are on same physical disk.

    我看MSDN上面说过,如果是多个Filegroup并且查询跨区,可以使用并行计划,这样也不会提高效率吗?

    Please Mark As Answer if it is helpful.

    2013年4月18日 4:12
  • 其实个人觉得多少会有提升,只是如果没有像dgdba大侠说得那样"如果查询的数据分布在多个独立的磁盘含RAID上" 的话,性能提升不大

    因为物理IO都是同一个,但是因为以前的数据都在同一个分区 ,所以如果按月份来查询的话需要查询整个分区,现在按照月份来分区了

    那么当他查询某个月的时候只需要到那个月份的分区去查询数据,但是如果他查的数据夸了几个月份,那么SQL需要夸多个分区去查询数据

    所以性能会有所下降。反正见仁见智了,不同的业务场景不同的预算有不同的解决方案,不能一概而论

    建议LZ还是像dgdba大侠说得那样"如果查询的数据分布在多个独立的磁盘含RAID上" 


    给我写信: QQ我:点击这里给我发消息



    2013年4月18日 5:39
  • 嗯!谢谢大家!
    2013年4月18日 6:59
  • 没啥提升。。。我试过。

    因为服务器上没做raid,硬盘的话只分了C、D、E三个逻辑分区;如果我建立2个数据文件(都加入PRIMARY),是否有用啊?

    Will not if files are on same physical disk.


    我看MSDN上面说过,如果是多个Filegroup并且查询跨区,可以使用并行计划,这样也不会提高效率吗?

    Please Mark As Answer if it is helpful.

    嗯,我是看到有并行的,但效果也不怎么明显。。。谢谢!
    2013年4月18日 7:26
  • 没啥提升。。。我试过。

    因为服务器上没做raid,硬盘的话只分了C、D、E三个逻辑分区;如果我建立2个数据文件(都加入PRIMARY),是否有用啊?

    Will not if files are on same physical disk.


    我看MSDN上面说过,如果是多个Filegroup并且查询跨区,可以使用并行计划,这样也不会提高效率吗?

    Please Mark As Answer if it is helpful.

    嗯,我是看到有并行的,但效果也不怎么明显。。。谢谢!

    个人觉得有提升,但是不大

    以上纯属个人意见



    给我写信: QQ我:点击这里给我发消息

    2013年4月18日 8:25