7

这个场景非常简单,一个有 10 列(一种分析数据)的表中有大约 1 亿条记录,我需要能够对这 10 列的任意组合执行查询。例如这样的:

  • a = 3 && b > 100过去 3 个月有多少条记录?

基本上所有的查询都将是一种在时间间隔中有多少具有属性的记录XY,其中X可以是这 10 列的任意组合。

数据将不断涌入,它不仅仅是一组预先给定的 1 亿条记录,而且会随着时间的推移而增长。

由于列选择可以是完全随机的,因此很可能无法为流行的组合创建索引。

问题有两个部分:

  • 我应该如何在 SQL 数据库中构建它以使查询尽可能快,我可以采取哪些一般步骤来提高性能?
  • 是否有任何类型的 NoSQL 数据库针对这种搜索进行了优化?我只能想到 ElasticSearch,但我不认为它在这个大型数据集上会表现得很好。
4

6 回答 6

1

如果没有索引,您调整 RDBMS 以支持这种处理的选项会受到严重限制。基本上你需要大量的并行性和超快速的工具包。但很明显,您没有存储实际数据,因此 RDBMS 不适合。

追求并行路线,行业标准是Hadoop。您仍然可以通过Hive使用 SQL 样式查询。

另一个 noSQL 选项是考虑列式数据库。这些是在不使用多维数据集的情况下组织分析数据的另一种方法。他们擅长快速加载数据。Vectorwise 是该领域的最新玩家。我没有亲自使用过它,但是昨晚的 LondonData 聚会上有人对它大加赞赏。 检查出来

当然,远离 SQL 数据库——无论你往哪个方向发展——都会产生陡峭的学习曲线。

于 2012-04-27T09:38:07.910 回答
0

要使用 SQL 解决方案使这些查询快速运行,请使用这些经验法则。不过,这有很多警告,您使用的实际 SQL 引擎将与解决方案非常相关。

我假设您的数据是整数、日期或短定标器。长字符串等改变了游戏。我还假设您只使用固定比较(=、<、>、<> 等)

a) 如果时间间隔 Y 将出现在每个查询中,请确保它已被索引,除非 Y 谓词选择很大比例的行。确保行以“Y”顺序存储,以便它们彼此相邻地打包在磁盘上。对于新数据,随着时间的推移,这将自然而然地发生。如果 Y 谓词非常紧凑(即几百行),那么这可能就是您需要做的所有事情。

b) 你是在做“select ”还是“select count( )”?如果不是“select *”,那么垂直分区可能会有所帮助,具体取决于引擎和其他索引。

c) 为值分布广泛且没有太多重复项的每一列创建单列索引。索引 YEAR_OF_BIRTH 通常是可以的,但索引 FEMALE_OR_MALE 通常不好 - 尽管这是高度特定于数据库引擎的。

d) 如果您有 FEMALE_OR_MALE 之类的列并且“Y 谓词”很宽,那么您会遇到不同的问题 - 从大多数行中选择女性人数会很困难。您可以尝试索引,但取决于引擎。

e) 如果可能,尝试使列“NOT NULL”——通常每行节省 1 位,并且可以简化内部优化器操作。

f) 更新/插入。创建索引通常会损害插入性能,但如果您的速率足够低,则可能无关紧要。只有 100M 行,我假设您的插入率相当低。

g)多段键会有所帮助,但您已经说过它们不行。

h) 获取高速磁盘 (RPM) - 这些类型的查询的问题通常是 IO(TPC-H 基准测试是关于 IO,而您听起来像是“H”问题)

还有更多选择,但这取决于您要花费多少精力“使查询尽可能快”。有很多 No-SQL 和其他选项可以解决这个问题,但我会将这部分问题留给其他人。

于 2012-05-01T02:19:25.320 回答
0

除了上述建议之外,还可以考虑只查询更新的物化视图。我想我只会在桌子上创建一个 select ,count(*) group by cube () 物化视图。

这将为您提供一个完整的立方体。在一个小测试台上玩这个,以了解立方体汇总是如何工作的。查看 Joe Celko 的书籍以获取一些示例,或者直接点击您的特定 RDBMS 文档获取示例。

如果您必须始终能够查询表中最新的微秒数据,您会有点卡住。但是如果你可以放宽这个要求,你会发现物化视图立方体是一个相当不错的选择。

您绝对确定您的用户会以统一的方式点击所有 10 列吗?过去我曾对这种情况进行过早的优化,结果发现用户在他们的大部分报告中确实使用了一两列,并且滚动到那一两列就“足够好”了。

于 2012-05-19T20:52:52.790 回答
0

就 Oracle 而言,这很可能被构造为一个间隔分区表,在您可能查询的每一列上都有本地位图索引,并且通过直接路径插入或分区交换添加新数据。

可以使用一组物化视图优化对流行的列组合的查询,可能使用汇总或多维数据集查询。

于 2012-04-27T13:30:26.173 回答
0

如果您无法从数据中创建 OLAP 多维数据集,是否可以改为基于 X 和 Y 的唯一组合创建汇总表。如果时间段 Y 具有足够高的粒度,您的汇总表可能会相当小。显然取决于数据。

此外,您应该捕获用户运行的查询。通常情况下,用户会说他们想要所有可能的组合,而实际上这种情况很少发生,大多数用户的查询都可以从预先计算的结果中得到满足。汇总表将再次成为此处的一个选项,使用此选项您会得到一些数据延迟,但它可以工作。

如果可能的话,其他选择是查看硬件。过去,我使用Fusion-IO等固态驱动器取得了不错的成绩。这可以大大减少查询时间。这不是好的设计的替代品,但是好的设计和合适的硬件可以很好地工作。

于 2012-05-29T09:40:41.600 回答
0

您应该构建一个 SSAS 多维数据集并使用 MDX 来查询它。

多维数据集具有“聚合”意味着提前计算结果。取决于您如何配置多维数据集(和聚合),您可以在度量值组上拥有 SUM 属性(例如 A),并且每次询问多维数据集如何A有很多记录,它只会读取聚合而不是读取所有表并计算它。

于 2012-04-27T08:06:00.970 回答