2010-07-05 72 views
3

我们有一个应用程序,它将实时数据插入到数据库中。它每天在线4.5小时。我们在17个表中以秒为单位插入数据。在任何时候,用户可以查询最新的第二数据的任何表,并在历史上的一些记录......从内存中插入和查询数据的最佳实践

处理的饲料和插入使用C#控制台应用程序后...

处理用户请求是通过WCF服务完成...

我们发现插入是我们的瓶颈;大部分时间都在那里。我们投入了大量时间试图调整表和indecies但结果不令人满意

假设我们有足够的内存,最好的做法是将数据插入到内存而不是有数据库。目前我们正在使用每秒更新和插入的数据表 我们的一位同事在提要处理程序和WCF用户请求处理程序之间建议了另一个WCF服务,而不是数据库。 WCF中间层应该是基于TCP的,它将数据保存在自己的内存中。有人可能会说饲料处理程序可能会处理用户请求,而不是在两个进程之间有一个中间层,但我们希望分离事物,所以如果饲料处理程序崩溃,我们仍然能够向用户提供当前记录

我们时间有限,我们希望在短时间内将所有内容都移到内存中。在2个进程中间有一个WCF是不好的事情?我知道这些请求会增加一些开销,但所有这3个进程(feed-handler,内存数据库(WCF),用户请求处理程序(WCF))都将位于同一台计算机上,带宽不会那么大的问题。

请帮助!您正在使用什么样的数据库

+0

确实很好的问题。 – Kangkan 2010-07-05 10:13:46

回答

2

我会研究创建数据缓存(这样您还可以减少数据库选择),并在缓存中的数据写入数据库后使数据无效。这样,您可以批量调用更大的插入,而不是更小的插入,但将数据保存在内存中,以便读者可以读取它。实际上,如果您知道数据何时过时,可以避免完全读取数据库并将其仅用作后备存储 - 这样,数据库性能只会影响缓存的大小。

使缓存中的数据无效将基于它是写入数据库还是已经过时,而不是先到达最后

缓存层不需要很复杂,但它应该是多线程来托管数据并将其保存在后台。该层将位于WCF服务的后面,连接媒介和WCF服务应该改进以包含控制台应用程序的逻辑+批处理想法。然后,控制台应用程序可以连接到WCF并在其上投掷结果。

更新:唯一可以说的是投资一个分析器,看看你是否在被屏蔽的代码中引入任何性能问题。另外,分析您的数据库。你提到你需要快速插入和选择 - 不幸的是,它们通常会互相抵消......

+0

感谢您的答案。数据并没有真正陈旧,因为每个记录都可能随时被选中(用户可以指定他/她想要的第二个“记录”)。你的解决方案仍然建议插入到数据库中,尽管创建一个缓存的频率较低,但是我不知道我们是否仍然要从数据库中选择(如果数据不在缓存中,因为历史数据的选择是完全随机的)一张巨大的桌子被插入,是不是会造成选择超时?我们不能把所有东西都堆放在内存中吗? – mustafabar 2010-07-05 10:44:26

+1

这真的取决于 - 每4.5秒插入一次可能会产生大量数据?你的问题是插入性能 - 这可以通过其他方式解决。你可以做的是删除所有的索引,从而为插入性能定制表并为这些选择招致成本,也许使用选择高速缓存来保存更多的内存。 – 2010-07-05 10:51:52

+1

当然,内存是一种可行的方式,但内存也是不稳定的 - 停电并且全部消失。 – 2010-07-05 11:07:26

0

?MySQL有一个存储引擎MEMORY这似乎要适合这样的事情。

+0

我们正在使用SQL数据库。 Microsoft SQL server 2008 – mustafabar 2010-07-05 10:16:07

0

您使用的数据表与DataAdapter?如果是这样,我建议你完全删除它们,直接使用DBCommand插入你的记录,当用户请求报告,使用DataReader读取数据,或者使用DataTable.Load(IDataReader)填充DataTable对象时

内存中的故障数据存在发生崩溃或电源故障时丢失数据的风险。

+0

我们创建一个SQLTransaction连接并使用它通过使用SQLBulkCopy在DataTable中循环来插入它。我们需要交易来扭转可能的崩溃的影响 – mustafabar 2010-07-05 10:50:53