想象一个“突发”的数据流,即它可能有 10,000 个事件很快到达,随后一分钟内什么都没有。
您的专家建议:我如何为 SQL Server 编写 C# 插入代码,以保证 SQL 立即将所有内容缓存在其自己的 RAM 中,而不会阻塞我的应用程序超过将数据输入所述 RAM 所需的时间?为实现这一点,您是否知道用于设置 SQL 服务器本身的任何模式,或用于设置我正在写入的各个 SQL 表的模式?
当然,我可以做我自己的版本,这涉及在 RAM 中构建我自己的队列——但可以这么说,我不想重新发明旧石器时代的石斧。
你有没有试过只写,看看会发生什么?你有一个已知的瓶颈吗?
如果您需要防止您的应用程序被阻止,那么您的一种方法是将写入排队以推迟数据库调用。但是,我希望队列会在一两秒钟内清除:如果可以的话,您需要队列吗?
或者您可以将假脱机到暂存台,然后再冲洗?我们使用这种技术来处理每分钟数百万新行的持续写入(我们实际上使用了具有简单恢复功能的暂存数据库):但是直到我们有了只写行的经验后才实施它。
注意:作为预写日志记录 (WAL) 协议的一部分,SQL Server 中的每次写入都将转到磁盘。这适用于该写入的 t-log 条目。
带有该行的数据页将在某个时候(基于时间、使用、内存压力等)进入磁盘,但通常您的数据无论如何都会在内存中。这称为“检查点”并且不会从内存中逐出数据,只是刷新更改(2011 年 11 月 24 日编辑)
编辑:
出于整体考虑,根据上文最后一段,将此数据库的 LDF 转移到一组专用磁盘以获得更高性能。同上一个暂存数据库(MDF/LDF 各一个)。数据库服务器有十几个或三个不同的卷(通常通过 SAN)是很常见的
除非我遗漏了什么,否则这将违反 ACID ( http://en.wikipedia.org/wiki/ACID ) 的耐久性要求。也就是说,如果您的应用程序将数据“写入”RAM,然后服务器崩溃,您的数据就会丢失。
因此,您寻求的是一个非数据库系统,作为最终存储到数据库中的队列,或者是一个对您正在做的事情足够快的数据库系统。我建议先尝试后者,看看是否足够;不要借麻烦。
我为此使用了一次数据集。我在数据集到达时将行插入到数据集中,并且有另一个线程每 2 秒左右将行刷新到数据库中。也可以用xml文档做cachin,然后一次调用传xml到数据库,这样可能更好。
问候
彼得