目前我正在通过有趣的行为来解决性能问题。
我有一个非常复杂的SQL语句(85个LEFT-Joins,14个INNER-Joins,几个子选择),我选择了大约180列。其中一些列可以包含分号。由于我还要将数据写成以分号分隔的CSV文件,我必须替换那些分号。 我在一堆列上做了一个简单的REPLACE(Column1,&#39 ;;',',')。
现在问题:
如果没有这些REPLACE函数,查询将在大约30秒内平稳运行,选择1500行。执行计划向我展示了并行性。
整个执行计划(只是想象):
但是,每当我添加REPLACE函数时,就不再存在并行性,查询将永远运行。 (一小时左右就把它杀了)。 估计的执行计划与大量嵌套循环看起来完全不同。 整个执行计划(只是想象):
这种行为有什么解释吗? 为什么优化器没有意识到,他可以像以前那样做并行操作,并在选择数据后最后进行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,并将数据写入文件。