如何保证SQL Server 2008 R2的插入内容首先缓存在RAM中?


17

想象一下一个“突发”的数据流,即可能有10,000个事件很快到达,随后一分钟什么也没到达。

在此处输入图片说明

您的专家建议:如何编写SQL Server的C#插入代码,以确保SQL立即将所有内容缓存在其自己的RAM中,而不会阻塞我的应用程序,而不会超出将数据馈入所述RAM所需的时间?为此,您是否知道用于设置SQL Server本身的任何模式,或者用于设置我要写入的单个SQL表的模式?

当然,我可以做自己的版本,这涉及在RAM中构造自己的队列-但我不想重塑旧石器时代的石斧。


1
您在谈论C#客户端代码吗?因此,您对确保写入缓存的SQL代码感兴趣吗?
理查德

6
如果RDBMS支持,我倾向于将自己插入队列,因为(a)并不难,(b)完全在您的控制之下,并且(c)不受供应商依赖。

我对包含SQL代码以确保写入被缓存的C#客户端代码感兴趣。但是,我确定我可以使用直接的T-SQL并编写自己的C#包装器

Answers:


11

您是否尝试过只是写作,看看会发生什么?您是否有已知的瓶颈?

如果您需要防止应用程序被阻止,那么一种方法是将写操作排队以推迟数据库调用。但是,我希望队列能在1或2秒钟后清除,所以如果可以的话,您是否需要一个队列?

或者,您可以后台处理到临时表,然后稍后刷新?我们使用这种技术来处理每分钟持续写入数百万个新行的情况(我们实际上使用具有简单恢复功能的分段数据库):但是直到我们有只写行的经验,我们才实现它。

注意:SQL Server中的每个写操作都会作为预写日志记录(WAL)协议的一部分进行磁盘处理。这适用于该写入的t-log条目。

带有该行的数据页将在某个时候进入磁盘(基于时间,使用情况,内存压力等),但是通常您的数据仍然会在内存中。这称为“检查点”,它不会从内存中清除数据,只是刷新更改(2011年11月24日编辑)

编辑:

出于整体考虑,请根据上面的最后一段,将此数据库的LDF移到一组专用磁盘上以提高性能。同上一个临时数据库(对于MDF / LDF,每个数据库)。数据库服务器通常有十几个或3个不同的卷(通常通过SAN)是很常见的


1
假脱机到临时表可能是最好的方法。我还得到了我的一位朋友的确认,他在一个拥有数十亿行表的环境中工作,他说他使用临时表进行更快的分析。

7

除非我缺少任何内容,否则这将违反ACID(http://en.wikipedia.org/wiki/ACID)的耐用性要求。也就是说,如果您的应用程序将数据“写入”到RAM,然后服务器崩溃,则数据将丢失。

因此,您要寻找的是要么作为最终存储到数据库中的队列的非数据库系统,要么是对您正在做的事情足够快的数据库系统。我建议先尝试后者,看看是否足够;别麻烦


+1我应该提到这个。ACID需要WAL
gbn

2

我曾经为此使用过一个数据集。我正在将行插入到数据集中,然后又有一个线程每两秒钟左右将行刷新到数据库一次。您还可以使用xml文档进行cachin,然后一次调用将xml传递给数据库,这可能更好。

问候

皮特

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.