存储大量分析数据

4

我通常使用SQL Server和C#来完成所有的项目,但是我正在考虑一个可能涉及数十亿行数据的项目,而我不太确定在SQL Server中处理这种情况是否合适。

我将存储以下数据:

  • 日期时间
  • IP地址
  • 链接ID
  • 可能还有其他字符串相关的数据

我之前只接触过关系型数据库,因此正在寻求一些指导,了解哪种数据库技术最适合这种类型的数据存储。一种可以扩展并且成本较低的方式(与SQL Server分片相比)

然后我需要根据链接ID提取这些数据。

查询中是否能够进行排序,或者最好在应用程序中执行排序操作?

编辑:它将是基于云的。因此,我正在查看SQL Azure,我已经广泛使用它,但随着行数的增加,它开始出现问题。


1
我想象Facebook拥有跨越数十亿行的数据。他们使用MySQL(以及许多其他“辅助”技术),所以我认为坚持你现在知道和有效的东西,并稍后优化性能可能是有意义的。 - Jonathon Reinhart
你可能是对的,就像他们所说的那样,过早地进行了扩展。 - Adam
1
根据我在这些问题方面的有限经验,我认为可以肯定地说,你期望的不会是实际发生的情况 :-) - Jonathon Reinhart
2个回答

4
由于您正在寻求一般指导,我觉得提供一个您过早排除的答案是可以的;-)。 Microsoft SQL Server绝对可以处理这种情况(在拥有那些字段和数十亿行的表的通用意义上)。我个人曾经参与过一个数据仓库的工作,其中有4个节点,每个节点都有主要事实表,保存着12-15亿行(并且不断增长),尽管数据模型和索引的某些方面可能做得更好,但它仍然可以快速响应查询。这是一个基于Web的应用程序,每天都有很多用户使用它(尽管一天中的某些时期比其他时期更加艰难)。此外,该事实表比您描述的表宽得多,除非“可能还有其他字符串相关数据”相当大(但也有适当的建模方法)。确实,免费的Express版本可能无法满足您的需求,但标准版很可能会,并且价格不是太高。企业版具有进行在线索引重建的不错功能,但仅此可能不足以证明巨大的许可费用。
请记住,如果没有或只有很少关于您实际尝试使用此数据的描述,那么很难说MS SQL Server是否一定能满足您的需求。但是,考虑到您似乎已经完全排除了它,仅基于可能获得的大量行数,我至少可以谈论一下这种情况:通过良好的数据建模、良好的索引设计和定期的索引维护,MS SQL Server绝对可以处理数十亿行。现在,它是否是您项目的最佳选择取决于您尝试做什么、客户对维护的舒适程度等因素。
祝你好运 :)
编辑:
当我说(上面)查询返回“足够快”时,我的意思是从1秒到90秒不等,具体取决于各种因素。请记住,这些不是简单的查询,并且在我看来,可以对数据建模和索引策略进行若干改进。
我故意省略了表分区功能,不仅因为它只在企业版中提供,而且因为它更容易被误解和错误使用,而不是理解和正确使用。在SQL Server中,表/索引分区不是“分片”的手段。
我也没有提到列存储索引,因为它们仅在企业版中提供。但是,对于大到足以证明成本的项目,值得研究列存储索引。它们在SQL Server 2012中引入,并带有一个限制,即一旦创建了列存储索引,就无法更新表。您可以使用表分区在某种程度上绕过该限制,但在SQL Server 2014中,该限制将被删除。

1
感谢您详细的回复。为了进一步阐述我对MSSQL犹豫的原因,我目前在另一个项目中使用SQL Azure。虽然有些表格达到了数百万行,但其中一个表格只有大约50万行。当进行带有排序的SQL查询时,它会超时。然后几个小时后,一切都恢复正常。与微软提出了多个工单,结果只是得到“看起来好像卡住了,我们不知道原因,但是我们将您转移到另一个服务器上,现在一切都正常了”的回复。但是我只需要等待几周,问题就会再次发生。为了解决这个问题,我现在在代码中进行排序。 - Adam
@Adam,这个需要是基于云的解决方案吗?如果是的话,那就是一个非常重要的细节,需要在问题中明确。我还有另一个针对基于云的答案,稍后有时间会发布,以及对这个答案的更新,提供更多信息。但是,根据你期望返回的行数,应用程序层面上的排序可能会很困难。 - Solomon Rutzky
是的,它将基于云。因此,如果我选择MS SQL路线,将使用SQL Azure。 - Adam
@Adam,感谢您澄清云端需求。我没有使用SQL Azure的经验,所以无法发表评论,但我已添加了另一个答案来解决云端问题。 - Solomon Rutzky

1
考虑到这个需求需要基于云端,并且使用.Net/C#,如果你只是谈论几个表格(目前只有一个明确的表和隐含的“Link”表——LinkID的来源),因此可能不需要关系或其他RDBMS功能,那么一个选择是使用Amazon的DynamoDB。 DynamoDB是AWS(Amazon Web Services)的一种NoSQL数据库。通过他们的低端免费层,开发甚至项目的初始阶段都变得更加容易。截至2013-11-04,主要的DynamoDB页面声明:

AWS免费层包括100MB的存储空间、5个写入能力单位和10个读取能力单位与Amazon DynamoDB。

这里有一些文档:概述, .Net如何查询, 和 一般的.Net SDK

请注意:在估算费用时,一定要考虑相关的AWS组件,例如网络使用等。


谢谢。你有关于Azure Hadoop或MongoDB的任何知识吗? - Adam
很遗憾,我没有使用过那些。不过我可以说,在继续深入这条路之前,你应该更清楚你打算如何处理这些数据。有几种存储大量数据的选项,但你打算如何使用它将是决定它们之间选择的关键因素。 - Solomon Rutzky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接