在非常繁忙的表中连续查找而不阻塞它的简单方法

Nie*_*nch 5 sql-server

我有一个每分钟接收数千次插入的表,重要的是插入速度非常快,否则会在我的应用程序的其他地方导致性能问题。这就是为什么这个表根本不包含任何索引的原因。这效果很好,插入性能令人满意。

但是,我也想经常在这个表中查找,就像复杂查询的每一秒一样。我不能按原样在桌子上做,因为如果没有索引,它的执行速度会太慢。

所以我想不断地将数据从这个表移动到另一个包含索引的表。但是,假设我每分钟都用一个简单的 sql 脚本移动它,恐怕我在移动记录(在事务中插入 + 删除)时可能会阻止插入到表中,这会影响我的应用程序的性能.

那么,实现这一目标的明智(但/和简单)方法是什么?

到目前为止,这是我最好的想法:

1. 使用 SQL Server 服务代理

我在桌子上放了一个触发器并向服务代理添加新项目,我认为这应该是异步的,不会导致性能问题。然后我需要另一个工作从队列中读取。我以前没有这样做过,我不确定这个解决方案有多好。

2.使用“复制”

我不喜欢这个解决方案,因为复制设置很复杂,所以我在这里提到它是为了说我很乐意不收到关于此的建议。

3. 就去做

可能是我多虑了。我应该每分钟运行一次吗?

BEGIN Transaction
-- Insert all rows in other table
-- Delete all rows from table
END Transaction
Run Code Online (Sandbox Code Playgroud)

请注意,目标表也将非常繁忙,因此该作业可能会在队列中等待大量查询完成。

期待听到您关于如何应对这一挑战的建议。

Dan*_*vey 0

这是一个有趣的问题。可以肯定的是,在辅助节点上进行读取的集群上的复制可能是最干净的解决方案,但如果您无法将该基础设施部署到位或无法负担企业许可证,那么我会选择代理。

您需要测试这两个解决方案,但我的猜测是“Just do it”解决方案将遇到许多死锁并导致缓慢问题。

我知道这是一个老问题所以我想知道你最终选择了什么解决方案?
我的票投给了经纪人。

由于您的读取查询很复杂,您可以采用一种“大数据”架构,其中代理不仅将数据复制到另一个表,而且还预先计算大量读取查询中所需的一些内容。例如,如果您需要获取一段日期内某些数据的平均值或总和,您可以使用代理预先计算这些数据,以便您的读取查询更容易运行。这样,系统上的其他查询也会更轻松。