有一张很大的表A(好几亿的数据),上面按月进行了分区。我现在要从这张大表A中查询满足条件的数据写入另一张临时表#t中,如果全表查询会很慢,我考虑按分区做单独查询,然后写入。在存储过程中,代码类似如下insert into #t(...) select ... from A(partition P1) where ...
insert into #t(...) select ... from A(partition P2) where ...
insert into #t(...) select ... from A(partition P3) where ...
...为了进一步优化查询写入效率,我考虑是否可以用并行的方法去做这样的操作呢?因为以上的查询都是在独立的分区上进行的,只是写入时会共同操作同一张表#t。不知道哪位大侠有过类似的经验,再此先行谢过

解决方案 »

  1.   

    别用insert into 
    insert into  要写日志的 查出的数据量比较大的话 日志会溢出的。
    直接select ... into #t from A where...
      

  2.   

    注意:首先 你要与估计你查询出来数据所占有的空间大小  
    比对一下你tempdb的大小  
    查询出来数据所占有的空间大小>tempdb的话 那就麻烦了!!!!!!。要是可以的话你可以把各个分区的数据查询到不同的临时表中啊 
    select into 不写日志 效率会大大的增加的。还有 要注意分区索引和全表索引的区别 查询一定要保证走正确的索引。
      

  3.   


    我感觉insert占用的时间应该是很小的,瓶颈应该在查询那边。我的想法是如果查询能够并行的话就好了。在各个分区上并行查询,然后写入。我甚至试过用union的方式,期望它能够并行运行,可是结果也是失望的insert into #t(...)
    select ... from A(partition P1) where ...
    union all
    select ... from A(partition P2) where ...
      

  4.   

    union 就算了吧 
    你还不如全表走索引查询 
    单独查询一个分区的效率如何 先别插入 分析下执行计划 看走了索引没有 。
      

  5.   

    那也不错了 就这样吧 
    再优化就得靠硬件了。
    还是一句话 注意临时表的空间 
    tempdb满了 就只能哭了
      

  6.   

    insert into #t(...) select ... from A(partition P1) where ...
    option (maxdop 10)
    --这里就启动了并行操作呢.10的意思是10线程.对于多CPU有作用