我试图为下游流程获取有效的数据Feed,但生成的查询计划尝试在传递任何内容之前缓存整个输出。
我的输入数据是一个包含以下内容的表:
ID,Attribute1,Attribute2,Attribute3,otherID
- Clustered index on ID(not unique)
- OtherID is unique)
about 10M rows, output query has up to 50 rows per ID, but 7 is typical
有一些辅助表,每个otherID包含0-5个属性,结构类似
Attribute4Table:
id4(PK),OtherID, Attribute4
Attribute5Table:
id5(PK),OtherID, Attribute5
,所需的输出是:
ID Dimension Value
4 'Attribute1' w
4 'Attribute4' x
4 'Attribute4' y
4 'Attribute3' z
5 'Attribute2' a
5 'Attribute3' b
5 'Attribute1' c
按当前查询看起来像: ## quoteHistory(id)
上有一个聚簇索引select * from (
select ID, 'Attribute1' Dimension, cast(thing1 as varchar(400)) Value from ##quoteHistory
UNION ALL
select ID, 'Attribute2' Dimension, cast(thing2 as varchar(400)) Value from ##quoteHistory
UNION ALL
... couple of other similer clauses, 'Dimension' is unique
) x order by ID where Value is not null
输出要求:给定ID的所有行一起输出(下游应用程序按ID组使用数据ID组,处理此数据的成本远远超过查询)。
问题:当它(正确)检测到它可以使用合并联合时,sql server会不必要地预先排序数据..
由"不必要的"如果你删除"值"从查询中获得我期待的查询计划,这是一个没有阻塞组件的流输出:
select * from (
select ID, 'Attribute1' Dimension from ##quoteHistory
UNION ALL
select ID, 'Attribute2' Dimension from ##quoteHistory
UNION ALL
... couple of other similer clauses
) x order by ID
问题: 如何强制生成第二个计划的第一个查询,因为该计划确实产生了我感兴趣的输出排序。
编辑: 在完整数据集中,其他表有时会以1:多的关系连接到## quoteHistory,以获取该维度的多个值。