REPLACE函数抑制并行性

时间:2017-08-17 16:28:00

标签: sql sql-server ssis parallel-processing

目前我正在通过有趣的行为来解决性能问题。

我有一个非常复杂的SQL语句(85个LEFT-Joins,14个INNER-Joins,几个子选择),我选择了大约180列。其中一些列可以包含分号。由于我还要将数据写成以分号分隔的CSV文件,我必须替换那些分号。 我在一堆列上做了一个简单的REPLACE(Column1,&#39 ;;',',')。

现在问题:
如果没有这些REPLACE函数,查询将在大约30秒内平稳运行,选择1500行。执行计划向我展示了并行性。 GoodExecPlan 整个执行计划(只是想象): enter image description here

但是,每当我添加REPLACE函数时,就不再存在并行性,查询将永远运行。 (一小时左右就把它杀了)。 估计的执行计划与大量嵌套循环看起来完全不同。 enter image description here 整个执行计划(只是想象): enter image description here

这种行为有什么解释吗? 为什么优化器没有意识到,他可以像以前那样做并行操作,并在选择数据后最后进行REPLACE?

我尝试在subselect中打包整个select(没有替换)并在外部select中执行REPLACE。但它仍然没有并行化。 像:

SELECT A.col1
      ,REPLACE(A.col2,';', ',')
      ,REPLACE(A.col3,';', ',')
      ,A.col4
    FROM (  my complex query without the replace functions here
         ) A

任何提示&欢迎提出想法。

目前我正在考虑删除SQL语句的REPLACE并在我的SSIS包中执行REPLACE,并将数据写入文件。

0 个答案:

没有答案