作为 ETL 过程的一部分,我们将暂存中的行与报告数据库进行比较,以确定自上次加载数据以来是否有任何列实际发生了更改。
比较基于表的唯一键和所有其他列的某种散列。我们目前使用HASHBYTES该SHA2_256算法,并发现如果许多并发工作线程都在调用HASHBYTES.
在 96 核服务器上进行测试时,以每秒哈希数衡量的吞吐量不会增加超过 16 个并发线程。我通过将并发MAXDOP 8查询的数量从 1更改为12 来进行测试。测试MAXDOP 1显示了相同的可扩展性瓶颈。
作为一种解决方法,我想尝试 SQL CLR 解决方案。这是我试图说明要求的尝试:
NVARCHAR或VARBINARY字符串的输入(所有相关列都连接在一起)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) 我想使用我在 C# CLR 中开发的代码在系统上的所有数据库中使用,这样我就不必将每个数据库都设置为可信赖的并打开 CLR 并在每个数据库中保留一堆相同的代码.
从管理和安全的角度来看,有没有最好的方法来做到这一点?CLR 函数非常基础,如字符串断路器、电子邮件验证、url 编码/解码、base64 等。我希望每个数据库中只有 dbo 模式能够访问这些函数。
谢谢
我需要在 SQL Server CLR 的触发器 c# 代码中使用第三方 DLL
但是当我尝试添加引用时,它只显示来自 SQL Server 的一些 DLL。
如何将我的第三方 dll添加到 SQL Server?
SQL Server Express Edition(2005 和 2008)是否支持安装、启用和运行 CLR 存储过程和函数。
sql-server-2005 sql-server-2008 sql-server sql-server-express sql-clr
我将创建一个包含两个字段的表 - IDasBIGINT和IPAddressasvarchar(45)或者varbinary(16)。这个想法是存储所有唯一的 IP 地址并使用引用ID而不是IP address其他表中的实际地址。
通常,我将创建一个存储过程,该过程返回ID给定的IP address或(如果未找到地址)插入地址并返回生成的ID.
我期望有很多记录(我无法确切说出有多少),但我需要尽快执行上面的存储过程。所以,我想知道如何以文本或字节格式存储实际的 IP 地址。哪个会更好?
我已经编写了SQL CLR用于将 IP 地址字节转换为字符串和反向转换的函数,因此转换不是问题(同时使用IPv4和IPv6)。
我想我需要创建一个索引来优化搜索,但我不确定我应该将该IP address字段包含在聚集索引中,还是创建一个单独的索引以及使用哪种类型的搜索会更快?
database-design sql-server sql-server-2012 sql-clr nonclustered-index
我有这个小型 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) 我想强制重置 SQLCLR 使用的 AppDomain。除了重新启动 SQL Server 实例之外,我还能怎么做?
在 SQL Server 中使用 CLR 是否存在任何特定的安全或性能风险?
当我检查我们的 SQL Prod 服务器时,每次打开活动监视器时,我总是SQLCLR在活动监视器的资源等待部分的第一个列表中看到。它总是有一个很高的数字。是SQLCLR为了什么?SQLCLR在活动监视器中具有高资源等待数的服务器是否有害?
我正在尝试使用 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 不在支持的库列表中,所以有什么想法吗?