sql - 这种方法可以扩展 SQL 查询吗?

标签 sql parallel-processing database

我有一个数据库,其中包含一个巨大的表。目前,一个查询可能需要 10 到 20 分钟,而我需要将其缩短到 10 秒。我花了几个月的时间尝试不同的产品,比如 GridSQL。 GridSQL 工作正常,但使用它自己的解析器,它不具备所有需要的功能。我还以各种方式优化了我的数据库,但没有获得我需要的加速。

我有一个关于如何扩展查询的理论,这意味着我利用多个节点并行运行单个查询。一个前提是数据被分区(垂直),一个分区放在每个节点上。这个想法是接受一个传入的 SQL 查询,并像在所有节点上一样简单地运行它。当结果返回到协调器节点时,将在结果集的联合上运行相同的查询。我意识到像 average 这样的聚合函数需要重写为对节点的计数和求和,并且协调器将总和的总和除以计数的总和以获得平均值。

使用此模型无法轻松解决哪些类型的问题。我认为一个问题是 count distinct 函数。

编辑:我收到了很多不错的建议,但没有一个解决了该方法。

最佳答案

是数据量问题,不一定是架构问题。

无论是在 1 台机器还是 1000 台机器上,如果您最终汇总 1,000,000 行,就会遇到问题。

与其对数据进行规范化,不如对其进行反规范化。

您在评论中提到您的数据库“非常适合您的目的”,但很明显,事实并非如此。太慢了。

所以,必须有所付出。您的完美模型不起作用,因为您需要在太短的时间内处理太多数据。听起来您需要比原始数据更高级别的数据集。也许是数据仓库解决方案。谁知道,没有足够的信息来真正说出来。

但是您可以做很多事情来满足具有良好响应时间的特定查询子集,同时仍然允许在“10-20 分钟”内响应的临时查询。

编辑评论:

我不熟悉“GridSQL”,也不熟悉它的作用。

如果您向单独的“分片”数据库发送多个相同的 SQL 查询,每个都包含一个子集,那么简单的选择查询将扩展到网络(即您最终将成为网络绑定(bind)到 Controller ),因为这是一个真正的、并行的、无状态的过程。

正如您提到的,问题变成了二次处理,特别是排序和聚合,因为这只能在最终的“原始”结果集上完成。

这意味着您的 Controller 最终不可避免地成为您的瓶颈,并且最终,无论您的“横向扩展”程度如何,您仍然必须应对数据量问题。如果你将查询发送到 1000 个节点,并且不可避免地需要对每个节点的 1000 行结果集进行汇总或排序,导致 1M 行,你仍然有很长的结果时间和单机上的大数据处理需求。

我不知道您使用的是什么数据库,我也不知道各个数据库的具体细节,但是您可以看到如果您实际上将数据分区到多个磁盘轴上,并且拥有一个像样的、现代的、多核心处理器,数据库实现本身可以为您处理并行磁盘轴请求方面的大部分扩展。哪些实现确实做到了这一点,我不能说。我只是建议他们有可能这样做(有些人可能会这样做)。

但是,我的一般观点是,如果您正在运行,特别是聚合,那么如果您每次都访问原始数据源,那么您可能会处理过多的数据。如果您分析您的查询,您很可能能够在各种粒度级别“预汇总”您的数据,以帮助避免数据饱和问题。

例如,如果您正在存储个人网络点击,但对基于一天中每个小时的事件(而不是您可能记录的亚秒级数据)更感兴趣,则仅汇总到一天中的小时可以减少您的数据需求急剧增加。

因此,横向扩展当然有帮助,但它可能不是解决问题的唯一方法,而是一个组件。数据仓库旨在解决这类问题,但不能很好地处理“即席”查询。相反,您需要对要支持的查询类型有一个合理的想法,并相应地进行设计。

关于sql - 这种方法可以扩展 SQL 查询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2447909/

相关文章:

sql - 两列上的 PSQL 唯一约束

Java 7 |我们可以并行下载 applet JAR 吗?

arrays - 查询返回具有特定日期范围编号的文档,然后对它们进行排序,然后排序

mysql - 将多个mysql数据库从远程服务器下载到本地计算机的正确方法

mysql - 如何在 IBM Worklight 中设置 MySQL

mysql - 无法在 iReport 中处理复杂的查询?

mysql - 在具有 1.28 亿行的表上重建索引

mysql - joomla上的sql查询

c - C中图像接收和处理的并行操作

multithreading - 这个 OpenMP 屏障有什么解决方法吗?