我们想要尽快查询300 Gb +数据数组。传统的SQL数据库(特别是SQL Server)无法像我们需要的那样有效地处理这个卷(比如,在select
子句中执行where
10-20条件,不到10秒),所以我' m调查此问题的其他解决方案。
我一直在阅读关于NoSQL的内容,这一切看起来很有希望,但我更愿意听听那些在现实生活中使用它的人。
你能在这里建议什么?
编辑以澄清我们的目标。
我们是一家开发应用程序的公司,用户可以搜索旅行团并预订所述旅行团,用塑料卡付款。这一切肯定都是针对俄罗斯的,所以请耐心等待。
当用户登录该网站时,会向她显示与此类似的表单:
alt text http://queenbee.alponline.ru/searchform.png
在这里,用户可以选择离开的地点和去往的地点,日期,持续时间以及所有这些。
点击“搜索”后,请求进入我们的数据库服务器,该服务器无法处理此类负载:查询包含各种参数。分片也不能很好地工作。
所以我所追求的是某种伪数据库,它可以快速查询。
答案 0 :(得分:18)
如果您想对报告或分析进行临时查询,那么最好使用能够与现成的报告工具很好地配合使用的东西。否则,您可能会发现自己一直被拖下来编写一些小报告程序来查询数据。这是对NoSQL类型数据库的攻击,但根据您的具体情况,它可能是也可能不是问题。
300GB不应超出现代RDBMS平台的能力,即使是MS SQL Server。此类型的大型数据库查询的其他一些选项是:
查看您是否可以使用SSAS多维数据集和聚合来缓解查询性能问题。基于使用情况的优化可以在不必使用其他数据库系统的情况下获得足够的性能。 SSAS还可以在无共享配置中使用,允许您在具有直连磁盘的相对便宜的服务器群集中划分查询。如果你这样做的话,请看ProClarity的前端。
Sybase IQ是一个RDBMS平台,它使用针对报告查询优化的基础数据结构。它的优点是它可以与各种传统的报告工具很好地配合使用。存在这种类型的其他几种系统,例如Red Brick,Teradata或Greenplum(使用PostgreSQL的修改版本)。对这些系统的主要打击是它们不是大众市场项目,而且价格昂贵。
Microsoft在管道中有一个无共享版本的SQL Server,您可以使用它。然而,他们已将其与第三方硬件制造商联系在一起,因此您只能使用专用(因此也很昂贵)的硬件来获取它。
寻找机会使用汇总数据构建数据集市,以减少某些查询的数量。
看看你的硬件调整。直接连接SAS阵列和RAID控制器可以非常快速地通过表扫描中使用的排序I / O.如果您通过大量镜像对对表进行分区,则可以获得非常快的流式传输性能 - 很容易使SAS通道饱和。
实际上,您正在寻求获得10-20GB /秒的速度如果你想要你描述的性能目标,你的I / O子系统,并且可以在不使用真正奇特的硬件的情况下做到这一点。
答案 1 :(得分:16)
我不确定我是否同意传统的SQL数据库无法处理这些卷,我可以在这些时间范围内查询更大的数据集,但它专门用于处理这类工作并置于合适的硬件上,特别是一个旨在处理大数据请求的IO子系统。
答案 2 :(得分:14)
正确设置的SQL服务器应该能够处理terrabytes中的数据而不会出现性能问题。我有几个管理SQl Server数据库的朋友,这些数据库的大小没有性能问题。
您的问题可能是以下一种或多种:
确定不是SQL Server处理这些负载的能力。如果你有一个这样大小的数据库,你需要聘请一位具有优化大型系统经验的专业dba。
答案 3 :(得分:5)
我希望“传统”数据库可以做你想要的,只要你为你正在进行的查询适当地构建数据。
您可能会发现,为了生成相应的报告,您需要在生成(或加载,转换等)数据时汇总数据并报告摘要数据。
SELECT的速度(在大多数情况下直接)与WHERE子句中的条件数(通常)无关,但它与解释计划和检查的行数有关。有些工具可以为您分析。
最终,在300G(这不是很大)你可能需要至少在某些时候将一些数据保存在光盘上(=慢速),这样你就可以开始减少所需的IO操作数量。减少IO操作可能意味着使用不同的聚簇索引覆盖索引,汇总表和数据副本。这使你的300G更大,但谁在乎。
IO ops为王:)
显然,就开发人员的时间而言,做这些事情是非常昂贵的,所以你应该首先在问题上投入大量硬件,并且只有在软件不足时才尝试用软件修复它。大量的RAM是一个开始(但它不能以当前的成本效益水平一次存储大约10-20%的数据集)甚至SSD现在也不是那么昂贵。
答案 4 :(得分:3)
这实际上取决于您在WHERE中的条款以及您对数据所需的投影类型。
在你的桌子上创建适当的索引可能已经足够了。
此外,即使拥有最佳数据结构也没有用,如果你必须为每个查询读取100GB,因为这也需要时间。
答案 5 :(得分:3)
从我理解的很少,传统的RDBMS是基于行的,可以优化插入速度。但是使用基于列的存储系统可以最好地实现检索速度优化。
请参阅Column oriented DBMS以获得比我能给出的更全面的解释
答案 6 :(得分:2)
NoSQL
不是关系数据库。
这是一个存储键值对的数据库,您可以使用专有API
进行遍历。
这意味着您需要自己定义数据的物理布局,以及进行任何代码优化。
我对此已经过时了,但几年前我参与了一个BerkeleyDB
项目,处理的数据量略少但仍然很大(约为100Gb
)。
完全可以满足我们的需求。
请注意,虽然您可能会觉得可以优化查询。您能否发布您在此处使用的查询?
答案 7 :(得分:-1)
尝试MemberSerialization.Fields,它具有Clickhouse的功能,即使在大多数情况下,即使使用MemSQL,它也更快,但是您无法更新记录,只能插入/删除