好的,首先是免责声明。我在我的几个表中使用实体属性值方法。所以基本上我在一个表的单列中有一个属性列表,然后我想在单独的视图中将其填充到单行中。
我找到了这个解决方案,效果很好:
然而,初始加载非常慢(填充 514 行需要 27 分钟)。我认为有些事情似乎根本不正确,所以我使用 TOP 选择了 Client 表的部分。我得到了立竿见影的结果。我发现我可以通过这种方式立即将整个数据库排队。但是我发现了一个非常奇怪的警告。我最多可以选择 5250 条记录。
到目前为止,我仍然得到了立竿见影的效果。如果我尝试选择 5251,则查询挂起。我在测试服务器上尝试过,得到了相同的限制,但数量不同(我可以在那里选择最多 5321)。请记住,该表只有 514 条记录,所以我不知道为什么将 1 个数字添加到 TOP 选择会导致它挂起。有人对此有任何意见吗?下面是我的工作 sql 查询:
DECLARE @cols AS NVARCHAR(MAX)
DECLARE @query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(a.AttributeName)
from AttributeCodes a
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT TOP 5250 ClientID, ' + @cols + ' from
(
select c.ClientID
, c.[Value]
, a.AttributeName
from Client c
inner join AttributeCodes a
on a.AttributeCodeId = c.AttributeCodeID
)x
pivot
(
min([Value])
for AttributeName in (' + @cols + ')
)p'
execute(@query)
编辑:
好的,似乎问题在于执行计划通过添加另一个数字而完全改变。我将在下面发布两个结果。我仍然不知道它为什么会改变,如果有什么方法可以阻止它使用哈希匹配而不是内部连接。
执行计划 1(即时):
执行计划 2(30 分钟以上):