【问题标题】:Will the use of CURSOR improve the performance / speed of querying using PIVOT in SQL?CURSOR 的使用会提高在 SQL 中使用 PIVOT 进行查询的性能/速度吗?
【发布时间】: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


【解决方案1】:

找到了解决我的 PIVOT 查询性能不佳的方法:我被告知要在我的表中的 Row_ID 列上创建一个聚集索引。我运行了以下查询:

CREATE CLUSTERED INDEX IX_tbl_Values_Row_ID  
ON dbo.tbl_Values (Row_ID);   
GO  

我之前需要 30 分钟才能加载的问题的查询现在只运行了 6 秒!感谢@MohitShrivastava 的提示!绝对有效。

我在创建聚集索引之前也提到了这一点:
https://docs.microsoft.com/en-us/sql/relational-databases/indexes/create-clustered-indexes?view=sql-server-ver15

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-15
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多