【发布时间】:2011-06-14 09:47:07
【问题描述】:
我考虑使用 CLR 触发器而不是传统的 T-SQL 触发器,因为我需要使用一些已经在 C# 中实现的逻辑。我知道 SQL Server 支持 CLR 集成,就我而言,这似乎是一个值得一试的解决方案。
但是,我想要执行的操作可能有点慢。速度不足以完全排除在触发操作中使用它们的可能性,但在插入数十万条记录时可能会明显变慢。最慢的部分可以从缓存中受益匪浅,我想这将是很少的缓存未命中和数千次缓存命中。至此,一切都引出了一个问题:CLR触发器可以有任何状态吗?而且,更重要的是,这个状态的生命周期是什么?
我想我可以使用触发器类的静态字段来保存一些状态,但我不知道它何时被初始化(服务器何时启动?事务开始时?未指定?)。我不确定这是否是安全路线,因此询问在 CLR 触发器中使用某些状态的常见做法是什么(如果有的话)。
为避免混淆:我需要缓存 CLR 对象,而不是某些 SQL 查询的结果,所以这与 SQL Server 本身在缓存方面有多好无关,我想缓存一些没有'不属于数据库。另外,我认为 CLR 不是因为我不能在 T-SQL 中进行字符串操作和绑定检查。我需要执行一些在 CLR 类库中实现并且有很多依赖关系的逻辑。在这种情况下我是否应该使用触发器是另一个几乎与此无关的问题。
非常感谢。
PS:我会感谢任何有关主题的 cmets 和见解,即使是那些不直接回答我的问题的人,但请不要全说“触发器是邪恶的,不应该”永远不会被使用”和“CLR 集成很慢并且是一个主要的兼容性问题”。另外,我知道它可能会向某人尖叫“过早的优化”,但目前我只想知道我的优化选项会发生什么,因为我是 SQL Server 中 CLR 集成的新手。除非分析结果表明,否则我不会对其进行优化,但我不想实现整个事情以意识到它太慢而且我无能为力。
我使用 SQL Server 2008 和 .NET 3.5。
【问题讨论】:
-
缓存在内存中?这是 SQL Server 已经擅长的事情之一。
-
@Mitch Wheat:你能详细说明一下吗?
-
对于正确指定和配置的 SQL Server 上的大多数数据库,80% 的“热”页面将由 RAM 提供,而不是文件系统(大型数据库除外)。如果不是这样,你还有其他问题......(不是我的反对票)
-
您的触发器有表访问权限吗?如果是(这是一个触发器,当然你有),那么 CLR 不是 最好的选择。它是慢:您选择了错误的解决方案。没有任何调整可以优化它:这就是我们使用纯 SQL 的原因。你的附言烦人:接受您选择的解决方案的局限性
-
@Mitch Wheat:我需要缓存 POCO,而不是关系数据
标签: c# sql-server triggers sqlclr