1

假设我有一张桌子

    id col1 col2 col3
    1 ABC 定义 XYZ
    2 XXX YYY ZZZ

最常见的查询将是

SELECT * from XYZ where col1='abc' and col2='def'
SELECT * from XYZ where col1='abc' and col2='def' and col3='xyz'

根据 VoltDB 文档:-

  1. 应在将要执行大多数搜索的列上进行分区。
  2. 分区应该在一列上完成

我找不到在多个列上执行搜索的任何示例。

我想知道为多列搜索分区表的最佳方法是什么?

编辑:-

或者如果我的查询是这样的:-

SELECT * from XYZ where col1 IN ('abc', ..., ...) and col2 IN ('def', ...) and col3 IN ('xyz', ...).
4

2 回答 2

4

选择列的准则:

首先,您应该选择一个具有许多不同值的分区列。举例来说,如果您有两个以上的分区(常见),则选择男性/女性列分区的效果不佳。

选择一个具有一些支配其他值的值的列也是一个坏主意。如果 20% 的值是 NULL,那么超过 20% 的行将分区到同一个位置。分布不必是均匀的,但如果你有“热”值,那么至少有比分区更多的“热”值是有帮助的。

如果时间戳的进展速度慢于摄取速率,那么选择时间戳也可能很棘手。在这种情况下,当时间戳前进时,您的负载将一次一个地轮询分区。尽管在实践中,单个分区通常每秒可以处理 10-50k 次插入,因此这实际上适用于非扩展用例。

因此,如果您在具有大量均匀分布的值的列上进行分区,您的插入将很好地分区并且您将能够摄取一些严重的负载。

选择一列来优化查询:

现在问题变成了,给定一组候选列,你能选择一个让你的查询运行得更快吗?

在相等性测试中与分区列匹配的任何查询都可以发送到单个分区。在上面的示例中,如果您在 col1 或 col2 上进行分区,则两个查询都将是单个分区。如果您在 col3 上进行分区,则只有第二个查询是单分区的。

很多时候,分区列很明显,可能是客户 ID 或票号。但即使它很明显,特别是如果不是,你也会想要运行不分区的查询。好消息是 VoltDB 4.0 使只读跨分区查询比以前的版本快得多。我们的内部基准测试表明每秒数万次查询是可能的。

这种级别的跨分区读取性能通常优于非分区 RDBMS 的读取性能。所以在 VoltDB 4.0 中,写操作的分区比读操作更重要。这使得分区更简单一些。

于 2014-04-24T14:07:57.533 回答
0

以下是一些可能有助于选择分区列的标准:

基础注意事项:

  • 应该具有足够基数的值,以便它使用所有分区

  • 理想情况下,这些值应该均匀散列,以便分区的分布是均匀的。

这可能会给你留下几个选择。如果工作负载主要是插入,那么任何都可以,因为插入将始终提供分区列值,因此插入将始终在单个分区中执行,因此可以很好地扩展。要确定哪一列最好,您可以考虑:

  • 对于查询和其他事务,最常提供哪一列作为输入参数?

  • 如果有涉及多个表的事务,所有相关表共享哪一列?

  • 如果您需要将该表与另一个分区表连接,则必须在其中一个连接键上进行分区。

希望这将明确什么是最佳选择。可能需要权衡取舍,因此有时值得测试不同的方法。有时,为了为相关表提供公共分区键而稍微进行非规范化可能会导致更高百分比的单分区事务或启用更多连接。此外,将查询作为多分区事务运行是完全可以的。这些可以扩展到每秒数千,在某些情况下每秒数千。因此,尽管您确实希望最大化单个分区的工作负载百分比,但您仍然可以拥有一个不是的百分比。

索引也很重要。在您的示例中,如果您选择 col1 或 col2,则两个查询都将作为单分区事务执行,但在单分区内可能有许多具有不同分区键值的记录。将列定义为分区键不会自动在该列上创建索引。您仍然希望定义索引以支持您需要快速且频繁地执行的查询。VoltDB 是一种行存储,因此您在传统 RDBMS 上创建索引时使用的许多相同考虑因素都将适用。根据示例查询,(col1,col2,col3) 上的索引将支持这两个查询。如果您有很多不同的搜索查询需要频繁运行,那么创建多个索引可能会有所帮助。

在设计索引时,有助于检查查询的解释计划。您可以使用以下命令在 VoltDB 的 SQL 界面中执行此操作: https://voltdb.com/docs/UsingVoltDB/sysprocexplain.php https://voltdb.com/docs/UsingVoltDB/...xplainproc.php

您还可以在运行“voltdb compile”时输出的 html 目录报告中看到这些解释计划。目录报告也可通过端口 8080 上的 Web 界面获得。

该计划将显示查询执行是否涉及表扫描,或者是否将使用索引。

于 2014-04-24T14:27:31.843 回答