6

我一直在努力将 SQL Server 变成某种东西,坦率地说,它永远不会。我的分析工作需要一个数据库引擎。DB 需要快速,并且不需要典型数据库(SQL Server、Oracle、DB2 等)中的所有日志记录和其他开销

昨天我在 Money:Tech 会议上听了Michael Stonebraker 的演讲,我一直在想,“我并不是真的疯了。有更好的方法!” 他谈到使用列存储而不是面向行的数据库。我访问了列商店的 Wikipedia 页面,看到了一些开源项目(我喜欢)和一些商业/开源项目(我不完全理解)。

我的问题是:在应用分析环境中,基于列的不同数据库有何不同?我应该怎么想他们?有人对基于多列的系统有实际经验吗?我可以利用我对这些数据库的 SQL 经验还是我必须学习一门新语言?

我最终会将数据提取到 R 中进行分析。

编辑:我被要求澄清我到底想要做什么。所以,这是我想做的一个例子:创建一个有 400 万行和 20 列的表(5 个维度,15 个事实)。创建 5 个聚合表,计算每个事实的最大值、最小值和平均值。将这 5 个聚合加入到起始表中。现在计算每行与平均值的百分比偏差、最小值的百分比偏差和最大值的百分比偏差,并将其添加到原始表中。此表数据不会每天都有新行,它会被完全替换并重复该过程。如果必须停止该过程,上天禁止。还有原木……哦,原木!:)

4

6 回答 6

8

简短的回答是,对于分析数据,列存储往往更快,所需的调整更少。

行存储,传统的数据库架构,擅长插入少量行、就地更新行和查询少量行。在行存储中,这些操作可以通过一个或两个磁盘块 I/O 来完成。

分析数据库通常一次加载数千条记录;有时,就像您的情况一样,他们会重新加载所有内容。它们往往是非规范化的,所以有很多列。并且在查询时,他们经常读取表中很大比例的行,但只读取其中的少数列。因此,从 I/O 的角度来看,将同一列的值存储在一起是有意义的。

事实证明,这为数据库提供了进行值压缩的巨大机会。例如,如果一个字符串列的平均长度为 20 个字节,但只有 25 个不同的值,那么数据库可以将每个值压缩到大约 5 位。列存储数据库通常可以在不解压缩数据的情况下运行。

通常在计算机科学中存在 I/O 与 CPU 时间的权衡,但在列存储中,I/O 改进通常会改善引用的局部性,减少缓存分页活动,并允许更大的压缩因子,因此 CPU 也有所提高。

列存储数据库还倾向于具有其他面向分析的功能,例如位图索引(另一种情况,更好的组织允许更好的压缩、减少 I/O 并允许更高效的 CPU 算法)、分区和物化视图。

另一个因素是是否使用大规模并行 (MMP) 数据库。有 MMP 行存储和列存储数据库。MMP 数据库可以扩展到数百或数千个节点,并允许您存储大量数据,但有时会出现妥协,例如较弱的事务概念或非 SQL 查询语言。

我建议您尝试一下 LucidDB。(免责声明:我是 LucidDB 的提交者。)它是开源列存储数据库,针对分析应用程序进行了优化,还具有其他功能,例如位图索引。它目前只在一个节点上运行,但有效地利用了多个核心,并且可以毫不费力地处理合理的数据量。

于 2009-07-29T09:59:55.180 回答
3

400 万行乘以 20 列乘以 8 字节的双精度为 640 mb。根据 R 为每个对象创建三个临时副本的经验法则,我们得到大约 2 GB。按照今天的标准,这并不多。

因此,这应该可以在合适的 64 位机器上的内存中实现,该机器具有“相当”数量的 ram(比如 8 gb 或更多)。安装 Ubuntu 或 Debian(可能在服务器版本中)可以在几分钟内完成。

于 2009-07-29T13:47:39.597 回答
2

我对 Infobright 社区版有一些经验——专栏或。db,基于mysql。

临:

  • 您也可以使用 R 中的 mysql 接口/odbc mysql 驱动程序
  • 对大量数据选择进行足够快的查询(由于 KnowledgeGrid 和数据包)
  • 用于 ETL(talend、kettle)的非常快速的本机数据加载器和连接器
  • 优化了我(我认为我们大多数人)使用的操作(按因素水平选择,加入等)
  • 用于优化存储 R 因子变量的特殊“查找”选项;)(好的,具有相对较小级别数/行数的 char/varchar 变量)
  • 开源软件
  • 付费支持选项
  • ?

缺点:

  • 社区版中没有插入/更新操作(还没有?),仅通过本机数据加载器/ETL 连接器加载数据
  • 没有 utf-8 官方支持(整理/排序等),计划在 2009 年第三季度推出
  • 聚合查询中没有函数 fe select month (date) from ...),计划在 2009 年 7 月(?),但由于列存储,我更喜欢简单地为每个聚合级别(周数、月份、.. 。) 我需要
  • 不能作为存储引擎安装在现有的 mysql 服务器上(因为自己的优化器,如果我理解正确的话),但如果需要,您可以在不同的端口上安装 Infobright 和 mysql
  • ?

简历:日常分析任务的良好 FOSS 解决方案,我认为您的任务也是如此。

于 2009-06-14T23:30:32.277 回答
1

这是我的 2 美分:SQL 服务器不能很好地扩展。我们尝试使用 SQL 服务器实时存储财务数据(即 100 个品种的价格变动)。它在前 2 周工作得很好——然后随着数据库大小的增加,它变得越来越慢,最后停了下来,太慢了,无法在收到每个价格时插入。我们试图通过每晚将数据从活动数据库移动到离线存储来解决这个问题,但最终该项目被放弃了,因为它不起作用。

底线:如果您计划存储大量数据(> 1GB),则需要适当扩展的东西,这可能意味着列数据库。

于 2010-12-19T21:58:45.537 回答
0

它看起来像实现更改(以列优先顺序排列的二维数组,而不是行优先顺序),而不是接口更改。

思考“战略”模式,而不是整个范式转变。当然,我从未使用过这些产品,所以它们实际上可能会迫使你改变范式。不过,我不知道为什么。

于 2009-03-18T20:33:17.527 回答
0

如果您描述 [1] 您的具体目标和 [2] 您在使用 SQL Server 时遇到的问题,我们可能会更好地帮助您做出明智的决定。

于 2009-03-18T21:43:51.430 回答