Sql 强制并行联合执行
我有一个从六个相同类型的表中收集数据的查询。要创建最终选择,我使用UNION ALL。不幸的是,优化器依次扫描六个表中的每个表,然后收集到一个表中。有没有办法使优化器并行扫描表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
|--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瓶颈?否则,我们不清楚您期望从并行执行中获得什么好处。