您的考虑可能不仅仅是匹配的吞吐量。例如,您需要维护规则。
但是,让我们假设一组静态规则和消息,其中包含满足所有规则所需的所有字段。使用 SQL,该结构将从message
表开始。该表将有一个insert
触发器。插入触发器将负责匹配规则。做这个的最好方式是什么?
每秒有 10 多条消息,您的处理本质上是并行的,即使每个匹配都是单线程的。我不确定您需要多少努力才能并行化匹配。数据库中的并行性通常出现在 SQL 语句中,而不是它们之间。
有各种各样的解决方案。例如,您可以将规则编码为巨型存储过程中的代码。这将是一场噩梦,可能会超出存储过程的长度限制,并且速度可能非常缓慢。
另一个疯狂的想法。将规则的匹配消息存储在表中,针对该规则,并且约束只加载匹配的消息。然后,您的过程看起来像无数个插入语句。
更严重的是,您将进一步使用以下代码:
select *
from rules
where . . .
结果集将具有匹配规则。该where
子句可能类似于:
select *
from rules r
where @wordcount > coalesce(r.wordcount, 0) and
@topic = coalesce(r.topic, @topic) and
. . .
也就是说,所有规则的所有可能比较都将在where
子句中。并且,规则将被预处理以确定他们需要哪些条款。
您甚至可以省去外部变量,直接访问查询:
select *
from rules r cross join inserted i
where i.wordcount > coalesce(r.wordcount, 0) and
i.topic = coalesce(r.topic, @topic) and
. . .
所以,是的,这在 SQL 中是可行的。而且,您可以并行进行匹配。您只需要努力以适合数据库比较的格式获取您的规则。