【发布时间】:2019-11-20 07:45:43
【问题描述】:
EAV(实体-属性-值)模型在 SQL 中的 DB 的新手。
只是背景:我正在使用 SQL Server 2016。使用 EAV 是工作中的一种要求,所以我正在学习一步一步地做。
我最近学习了如何进行动态 PIVOT 以在 EAV 表中返回 800+ 行 和 200+ 列。
在此处查看详细信息: Converting 200+ rows to column in SQL Server using PIVOT
由于成功返回了我需要的数据,但是性能速度太慢了——查询大约需要30分钟。顺便说一句,我使用的代码如下:
declare @pivot_col varchar(max);
declare @sql varchar(max);
select @pivot_col = STUFF(
( SELECT ',' + CAST([Col_Name] AS VARCHAR(max) ) AS [text()]
FROM ( select distinct [Col_Name] from tbl_Values ) A
ORDER BY [Col_Name] FOR XML PATH('')), 1, 1, NULL
);
set @sql = 'SELECT *
FROM ( SELECT [Row_ID], [Col_Name], [Col_Value] FROM tbl_Values ) AS a
PIVOT (
MAX([Col_Value])
FOR [Col_Name] in (' + @pivot_col + ' )
) AS p
ORDER BY [Row_ID]';
exec ( @sql );
我正在尝试将 CURSOR 与此合并,但还没有走多远。在我进一步研究之前,您能否提供关于它在性能/速度方面是否有任何影响的意见?
谢谢!
【问题讨论】:
-
这当然是 EAV 的缺点之一。游标可能会更慢。您的查询中没有任何谓词或连接(where 子句),因此您无能为力。
-
也许您可以从在 row_id 列上创建聚集索引开始。默认情况下,pivot 运算符对 PIVOT 内未使用的列进行分组,因此索引可能会有所帮助
-
@Nick.McDermaid 感谢您的意见。自从我开始使用 EAV 以来,这一直是挑战。
-
@MohitShrivastava 你应该把这个作为答案!当我的查询在创建聚集索引后 6 秒内返回 800 多行和 200 多列时,我真的从座位上跳了起来。我阅读了几篇关于这方面的文章,聚集索引确实显着提高了 EAV 表的性能。
-
聚集索引对任何表都有改进
标签: sql pivot-table sql-server-2016