有一张很大的表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。不知道哪位大侠有过类似的经验,再此先行谢过
insert into #t(...) select ... from A(partition P2) where ...
insert into #t(...) select ... from A(partition P3) where ...
...为了进一步优化查询写入效率,我考虑是否可以用并行的方法去做这样的操作呢?因为以上的查询都是在独立的分区上进行的,只是写入时会共同操作同一张表#t。不知道哪位大侠有过类似的经验,再此先行谢过
insert into 要写日志的 查出的数据量比较大的话 日志会溢出的。
直接select ... into #t from A where...
比对一下你tempdb的大小
查询出来数据所占有的空间大小>tempdb的话 那就麻烦了!!!!!!。要是可以的话你可以把各个分区的数据查询到不同的临时表中啊
select into 不写日志 效率会大大的增加的。还有 要注意分区索引和全表索引的区别 查询一定要保证走正确的索引。
我感觉insert占用的时间应该是很小的,瓶颈应该在查询那边。我的想法是如果查询能够并行的话就好了。在各个分区上并行查询,然后写入。我甚至试过用union的方式,期望它能够并行运行,可是结果也是失望的insert into #t(...)
select ... from A(partition P1) where ...
union all
select ... from A(partition P2) where ...
你还不如全表走索引查询
单独查询一个分区的效率如何 先别插入 分析下执行计划 看走了索引没有 。
再优化就得靠硬件了。
还是一句话 注意临时表的空间
tempdb满了 就只能哭了
option (maxdop 10)
--这里就启动了并行操作呢.10的意思是10线程.对于多CPU有作用