标签: sql-clr

使用 SQL CLR 标量函数模拟 HASHBYTES 的可扩展方式是什么?

作为 ETL 过程的一部分,我们将暂存中的行与报告数据库进行比较,以确定自上次加载数据以来是否有任何列实际发生了更改。

比较基于表的唯一键和所有其他列的某种散列。我们目前使用HASHBYTESSHA2_256算法,并发现如果许多并发工作线程都在调用HASHBYTES.

在 96 核服务器上进行测试时,以每秒哈希数衡量的吞吐量不会增加超过 16 个并发线程。我通过将并发MAXDOP 8查询的数量从 1更改为12 来进行测试。测试MAXDOP 1显示了相同的可扩展性瓶颈。

作为一种解决方法,我想尝试 SQL CLR 解决方案。这是我试图说明要求的尝试:

  • 该函数必须能够参与并行查询
  • 函数必须是确定性的
  • 该函数必须接受一个NVARCHARVARBINARY字符串的输入(所有相关列都连接在一起)
  • 字符串的典型输入大小为 100 - 20000 个字符。20000 不是最大值
  • 哈希冲突的几率应该大致等于或优于 MD5 算法。CHECKSUM对我们不起作用,因为冲突太多。
  • 该函数必须在大型服务器上很好地扩展(每个线程的吞吐量不应随着线程数量的增加而显着降低)

对于 Application Reasons™,假设我无法保存报告表的哈希值。这是一个不支持触发器或计算列的 CCI(还有其他我不想讨论的问题)。

HASHBYTES使用 SQL CLR 函数进行模拟的可扩展方式是什么?我的目标可以表示为在大型服务器上每秒获得尽可能多的哈希值,因此性能也很重要。我对 CLR 很糟糕,所以我不知道如何做到这一点。如果它激励任何人回答,我计划尽快为这个问题添加赏金。下面是一个示例查询,它非常粗略地说明了用例:

DROP TABLE IF EXISTS #CHANGED_IDS;

SELECT stg.ID INTO #CHANGED_IDS
FROM (
    SELECT ID,
    CAST( HASHBYTES ('SHA2_256', 
        CAST(FK1 AS NVARCHAR(19)) + 
        CAST(FK2 AS NVARCHAR(19)) …
Run Code Online (Sandbox Code Playgroud)

sql-server etl sql-clr hashing sql-server-2016

31
推荐指数
4
解决办法
1948
查看次数

为其他数据库中的内部存储过程设置中央 CLR 存储过程/函数存储库库以使用?

我想使用我在 C# CLR 中开发的代码在系统上的所有数据库中使用,这样我就不必将每个数据库都设置为可信赖的并打开 CLR 并在每个数据库中保留一堆相同的代码.

从管理和安全的角度来看,有没有最好的方法来做到这一点?CLR 函数非常基础,如字符串断路器、电子邮件验证、url 编码/解码、base64 等。我希望每个数据库中只有 dbo 模式能够访问这些函数。

  1. 有没有简单的方法可以做到这一点?
  2. 我也不清楚是否嵌入了 CLR dll,如果我移动数据库,它会标记,或者我是否也必须移动 dll。

谢谢

sql-server-2008 sql-server sql-server-2008-r2 c# sql-clr

18
推荐指数
2
解决办法
1082
查看次数

SQL Server CLR 中的第 3 方 dll

我需要在 SQL Server CLR 的触发器 c# 代码中使用第三方 DLL

但是当我尝试添加引用时,它只显示来自 SQL Server 的一些 DLL。

如何将我的第三方 dll添加到 SQL Server?

sql-server c# sql-clr

14
推荐指数
2
解决办法
2万
查看次数

SQL Server Express Edition 是否支持 CLR 过程?

SQL Server Express Edition(2005 和 2008)是否支持安装、启用和运行 CLR 存储过程和函数。

sql-server-2005 sql-server-2008 sql-server sql-server-express sql-clr

13
推荐指数
1
解决办法
5852
查看次数

存储 IP 地址 - varchar(45) 与 varbinary(16)

我将创建一个包含两个字段的表 - IDasBIGINTIPAddressasvarchar(45)或者varbinary(16)。这个想法是存储所有唯一的 IP 地址并使用引用ID而不是IP address其他表中的实际地址。

通常,我将创建一个存储过程,该过程返回ID给定的IP address或(如果未找到地址)插入地址并返回生成的ID.

我期望有很多记录(我无法确切说出有多少),但我需要尽快执行上面的存储过程。所以,我想知道如何以文本或字节格式存储实际的 IP 地址。哪个会更好?

我已经编写了SQL CLR用于将 IP 地址字节转换为字符串和反向转换的函数,因此转换不是问题(同时使用IPv4IPv6)。

我想我需要创建一个索引来优化搜索,但我不确定我应该将该IP address字段包含在聚集索引中,还是创建一个单独的索引以及使用哪种类型的搜索会更快?

database-design sql-server sql-server-2012 sql-clr nonclustered-index

12
推荐指数
2
解决办法
2万
查看次数

SQL Server 2014 (windows 2012R2) 上的 CLR 崩溃

我有这个小型 CLR,它对列中的字符串执行 RegEX 函数。

在 Windows Server 2012R2 上的 SQL Server 2014 (12.0.2000) 上运行时,进程崩溃

Msg 0, Level 11, State 0, Line 0 当前命令发生严重错误。结果,如果有的话,应该被丢弃。

如果我这样做,并给出堆栈转储

select count (*) from table where (CLRREGEX,'Regex')
Run Code Online (Sandbox Code Playgroud)

但是当我这样做的时候

select * from table where (CLRREGEX,'Regex') 
Run Code Online (Sandbox Code Playgroud)

它返回行。

在 Windows 8.1 上运行的相同 SQL Server 版本上完美运行。

有任何想法吗?

-- 编辑就这么简单

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlTypes;           //SqlString, SqlInt32, SqlBoolean
using System.Text.RegularExpressions; //Match, Regex
using Microsoft.SqlServer.Server;     //SqlFunctionAttribute
public partial class UserDefinedFunctions
{
    public static readonly RegexOptions Options = RegexOptions.IgnorePatternWhitespace | …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-clr sql-server-2014

12
推荐指数
1
解决办法
1268
查看次数

除了重新启动 SQL Server,还有什么方法可以强制重置 SQLCLR AppDomain?

我想强制重置 SQLCLR 使用的 AppDomain。除了重新启动 SQL Server 实例之外,我还能怎么做?

sql-server sql-clr

11
推荐指数
2
解决办法
5120
查看次数

使用 SQL CLR 的安全或性能风险

在 SQL Server 中使用 CLR 是否存在任何特定的安全或性能风险?

performance security sql-server sql-clr

11
推荐指数
2
解决办法
7996
查看次数

SQL Server Management Studio (SSMS) 中活动监视器中的 SQLCLR 等待类型是什么?

当我检查我们的 SQL Prod 服务器时,每次打开活动监视器时,我总是SQLCLR在活动监视器的资源等待部分的第一个列表中看到。它总是有一个很高的数字。是SQLCLR为了什么?SQLCLR在活动监视器中具有高资源等待数的服务器是否有害?

sql-server activity-monitor sql-server-2012 sql-clr

10
推荐指数
1
解决办法
3万
查看次数

程序集“system.web,版本=4.0.0.0,文化=中性,publickeytoken=b03f5f7f11d50a3a。” 在 SQL 目录中找不到

我正在尝试使用 System.Web 的 HTTPUtility.UrlDecode 方法部署 SQL CLR 函数,但我无法部署它。收到错误:

.Net SqlClient 数据提供程序:消息 6503,级别 16,状态 12,第 1 行程序集“system.web,版本=4.0.0.0,文化=中性,publickeytoken=b03f5f7f11d50a3a。” 在 SQL 目录中找不到。

功能(作为SSDT项目的一部分):

using System;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class UserDefinedFunctions
{
    [Microsoft.SqlServer.Server.SqlFunction(IsDeterministic = true)]
    public static SqlString udf_UrlDecode(SqlString encodedXML)
    {
        string decodedXML;

        decodedXML = HttpUtility.UrlDecode(encodedXML.ToString());

        return new SqlString(decodedXML);
    }
}
Run Code Online (Sandbox Code Playgroud)

它与这个线程有关。我是带有 VS2012 SSDT 和数据库项目的 SQL Server 2014。已尝试使用其他目标框架,例如 3、3.5、4 和 4.5。

我也尝试过使用 System.Web 创建程序集,但随后必须添加其他程序集,例如 Microsoft.Build、System.Xaml,直到它们也失败。我看到 System.Web 不在支持的库列表中,所以有什么想法吗?

sql-server sql-clr sql-server-2014

9
推荐指数
3
解决办法
2万
查看次数