Sql 强制并行联合执行

Sql 强制并行联合执行,sql,tsql,union,union-all,Sql,Tsql,Union,Union All,我有一个从六个相同类型的表中收集数据的查询。要创建最终选择,我使用UNION ALL。不幸的是,优化器依次扫描六个表中的每个表,然后收集到一个表中。有没有办法使优化器并行扫描表 |--Concatenation |--Index Scan(OBJECT:([EGeoCache].[NonClusteredIndex-20190815-105027] AS [GC])) |--Index Scan(OBJECT:([YGeoCache].[NonClusteredI

我有一个从六个相同类型的表中收集数据的查询。要创建最终选择,我使用UNION ALL。不幸的是,优化器依次扫描六个表中的每个表,然后收集到一个表中。有没有办法使优化器并行扫描表

  |--Concatenation
       |--Index Scan(OBJECT:([EGeoCache].[NonClusteredIndex-20190815-105027] AS [GC]))
       |--Index Scan(OBJECT:([YGeoCache].[NonClusteredIndex-20190814-103125] AS [GC]))
       |--Index Scan(OBJECT:([GGeoCache].[NonClusteredIndex-20190814-103358] AS [GC]))
       |--Index Scan(OBJECT:([HGeoCache].[NonClusteredIndex-20190814-103422] AS [GC]))
       |--Index Scan(OBJECT:([DGeoCache].[NonClusteredIndex-20190814-103305] AS [GC]))
       |--Index Scan(OBJECT:([SGeoCache].[NonClusteredIndex-20190814-103457] AS [GC]))

SELECT
    VEGC.AddressID
  , VEGC.Lat
  , VEGC.Lon
FROM    vEGeoCache AS VEGC
UNION ALL
SELECT
    VYGC.AddressID
  , VYGC.Lat
  , VYGC.Lon
FROM    vYGeoCache AS VYGC
UNION ALL
SELECT
    VGGC.AddressID
  , VGGC.Lat
  , VGGC.Lon
FROM    vGGeoCache AS VGGC
UNION ALL
SELECT
    VHGC.AddressID
  , VHGC.Lat
  , VHGC.Lon
FROM    vHGeoCache AS VHGC
UNION ALL
SELECT
    VDGC.AddressID
  , VDGC.Lat
  , VDGC.Lon
FROM    vDGeoCache AS VDGC
UNION ALL
SELECT
    VSGC.AddressID
  , VSGC.Lat
  , VSGC.Lon
FROM    vSGeoCache AS VSGC

要强制执行并行执行计划,可以使用需要系统管理员权限的
选项(QUERYTRACEON 8649)
。在SQL Server 2016+上,您可以使用
选项(使用提示(“启用并行计划首选项”)
,该选项不需要系统管理员权限

QUERYTRACEON 8649和ENABLE_PARALLEL_PLAN_首选项都没有文档记录,这意味着它们在生产中运行是不安全的(在我的书中)。第三种选择是由Adam Machanic使用,它不是没有文档记录的(它只是使用老式数学)

使用每种方法如下所示:

...
FROM    vDGeoCache AS VDGC
UNION ALL
SELECT
    VSGC.AddressID
  , VSGC.Lat
  , VSGC.Lon
FROM    vSGeoCache AS VSGC
OPTION (QUERYTRACEON 8649);

...
FROM    vDGeoCache AS VDGC
UNION ALL
SELECT
    VSGC.AddressID
  , VSGC.Lat
  , VSGC.Lon
FROM    vSGeoCache AS VSGC
OPTION(USE HINT('ENABLE_PARALLEL_PLAN_PREFERENCE'))

...
FROM    vDGeoCache AS VDGC
UNION ALL
SELECT
    VSGC.AddressID
  , VSGC.Lat
  , VSGC.Lon
FROM    vSGeoCache AS VSGC
CROSS JOIN dbo.make_parallel();
使_并行是最安全的方法,但会创建一个臃肿的执行计划。
我这样做的方式是:我在Dev中的测试中使用
选项(QUERYTRACEON 8649)
。需要注意的是,这些选项不能保证并行计划。确保在启用“包含实际执行计划”的情况下运行查询,以查看它是否正常工作。如果存在任何限制并行性的组件(例如作为计算列的标量UDF或check约束),则不会强制执行并行计划。如果我确定强制执行并行计划是一条可行之路(非常谨慎地强制执行),那么我会在生产中使用make_parallel

这是一个非常好的问题。我不认为有办法让它们并行运行,但我想知道是否有办法。因为我无法准确地复制您的案例,所以我从多个表中选择了相同类型的字段,并且执行是并行的,如果启用
包含实时查询统计信息
,并行性甚至可见。这些表是否位于单独的设备(或内存驻留)上,以便并行执行不会造成I/O瓶颈?否则,我们不清楚您期望从并行执行中获得什么好处。