Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在使用SQLCLR用户定义聚合函数(UDA)时提高查询性能_Sql Server_Query Optimization_Sqlclr_User Defined Aggregate - Fatal编程技术网

Sql server 如何在使用SQLCLR用户定义聚合函数(UDA)时提高查询性能

Sql server 如何在使用SQLCLR用户定义聚合函数(UDA)时提高查询性能,sql-server,query-optimization,sqlclr,user-defined-aggregate,Sql Server,Query Optimization,Sqlclr,User Defined Aggregate,我们发现使用SQLCLR用户定义聚合函数(UDA)时存在性能问题 以下是我们的场景: 我们需要计算两列:key和value,其值如下: 钥匙 价值 第1排 a/b/c/d/e 1/2/3/2/1 第2排 a/b/c/d/e 2/0/1/2/3 第3排 a/b/c/d/e 2/3/4/1/2 当数据库违反第一个标准形式时,您将永远不会获得任何性能。。。因为这会导致没有关系数据库。。。关系引擎是专门设计用来快速处理关系数据而不是非关系数据的 这不是UDA性能的问题,而是导致严重计数器性能的设计问题

我们发现使用SQLCLR用户定义聚合函数(UDA)时存在性能问题

以下是我们的场景: 我们需要计算两列:key和value,其值如下:

钥匙 价值 第1排 a/b/c/d/e 1/2/3/2/1 第2排 a/b/c/d/e 2/0/1/2/3 第3排 a/b/c/d/e 2/3/4/1/2
当数据库违反第一个标准形式时,您将永远不会获得任何性能。。。因为这会导致没有关系数据库。。。关系引擎是专门设计用来快速处理关系数据而不是非关系数据的

这不是UDA性能的问题,而是导致严重计数器性能的设计问题

第一种范式表示表中的列必须始终具有单个(标量)值。您放置了一个值列表,这些值违反了第一个范式

只需通过添加一个子表重新设计数据库,并将键和值放在这个子表中,您将获得性能

您可以这样尝试:

CREATE TABLE T_CHILD
(ID_CHILD       INT IDENTITY PRIMARY KEY,
 ID_ROW         VARCHAR(32), --REFERENCES T_FATHER (ID_ROW),
 KEY_CHILD      VARCHAR(16),
 VALUE_CHILD    INT);
GO

INSERT INTO T_CHILD
SELECT ID_ROW, k.value, V_EMP.value
FROM   T_FATHER
       OUTER APPLY STRING_SPLIT([key], '/') AS k
       OUTER APPLY STRING_SPLIT([value], '/') AS v;

当数据库违反第一个标准形式时,您将永远不会获得任何性能。。。因为这会导致没有关系数据库。。。关系引擎是专门设计用来快速处理关系数据而不是非关系数据的

这不是UDA性能的问题,而是导致严重计数器性能的设计问题

第一种范式表示表中的列必须始终具有单个(标量)值。您放置了一个值列表,这些值违反了第一个范式

只需通过添加一个子表重新设计数据库,并将键和值放在这个子表中,您将获得性能

您可以这样尝试:

CREATE TABLE T_CHILD
(ID_CHILD       INT IDENTITY PRIMARY KEY,
 ID_ROW         VARCHAR(32), --REFERENCES T_FATHER (ID_ROW),
 KEY_CHILD      VARCHAR(16),
 VALUE_CHILD    INT);
GO

INSERT INTO T_CHILD
SELECT ID_ROW, k.value, V_EMP.value
FROM   T_FATHER
       OUTER APPLY STRING_SPLIT([key], '/') AS k
       OUTER APPLY STRING_SPLIT([value], '/') AS v;

谢谢你的回复和建议。我们使用的是columnstore索引,所以我可能不需要子表来完成这项工作。但是问题是,如果我们想向这个表中添加更多的键和值,我们需要更多的管理效果,而不仅仅是将键和值存储在列表中(这样,我们只需要向列表中添加键和值).Columnstore索引与值列表无关,永远不会从非关系方法生成关系数据库。您必须重新设计表的结构。这是唯一的办法!您的建议是有道理的,但可伸缩性也是我们非常关注的一个指标,这也是我们选择使用列表的原因。可伸缩性将受到限制,因为您不能拥有没有限制的SQL datape。字符/NCHAR限制为8000,NCHAR(NVARCHAR限制为4000…而表中的行数没有限制!并且通过分区来考虑可伸缩性,这在您错误的方式下并不容易…@othree关于您对可伸缩性的担忧:请记住您工作的环境。RDBMS经过高度调优,可以高效地处理—读、写,排序、比较、连接等—离散值,以行为单位,以百万甚至数十亿行为单位。字符串解析虽然可以在必要时完成,但不是RDBMS的主要重点。如果您的目标是可伸缩性,那么您需要发挥所用系统的优势。因此,SQLpro建议。现代RDBMS可以扩展到e许多开发人员都会期望,但仅当用作RDBMS时,而不是应用程序代码。感谢您的回复和建议。我们使用的是columnstore索引,因此可能不需要子表来完成此操作。但问题是,如果我们想向该表添加更多键和值,我们将需要更多的管理效果,而不仅仅是将键和值存储在表中列表(这样,我们只需要将键和值添加到列表中).Columnstore索引与值列表无关,永远不会从非关系方法生成关系数据库。您必须重新设计表结构。这是唯一的方法!您的建议很有意义,但可伸缩性也是我们非常关心的一个指标,这也是我们选择使用列表的原因。可扩展性将受到限制,因为您不能拥有没有限制的SQL datape。CHAR/NCHAR限制为8000,NCHAR(NVARCHAR限制为4000…而表中的行数没有限制!并且通过分区来考虑可伸缩性,这在您错误的方式下并不容易…@othree关于您对可伸缩性的担忧:请记住您工作的环境。RDBMS经过高度调优,可以高效地处理—读、写,排序、比较、连接等—离散值,以行为单位,以百万甚至数十亿行为单位。字符串解析虽然可以在必要时完成,但不是RDBMS的主要重点。如果您的目标是可伸缩性,那么您需要发挥所用系统的优势。因此,SQLpro建议。现代RDBMS可以扩展到e许多开发人员都会期望,但只有当作为RDBMS使用时,而不是应用程序代码。