在复合索引上使用多值 eqJoin 的 Rethinkdb 性能
Rethinkdb Performance with multi-value eqJoin on compound index
更新:再看一遍,我想我只需要对数据进行更多的非规范化,然后简单地将相关位置信息 (city/state/etc.) 添加到推荐的每一行 table,而不是对一大组邮政编码进行连接。我在正确的轨道上吗?
原问题:
我有两个 table,一个包含邮政编码信息,另一个 table 包含大约 400 万行,每行都有一个邮政编码和一些其他信息。给定一个特定的邮政编码,我想获得相同状态 and/or 城市中的所有邮政编码(在下面的示例中只是状态),然后从推荐 table 中提取所有匹配那些的行来自系统其他部分的 ZIP 和一些其他类别数据。
我正在使用下面的查询,它有效,但需要大约 10 秒才能到达 运行。
r.table('all_geocodes').getAll('77019',
{index:'postal_code'}).pluck('state_name')
.eqJoin(r.row('state_name'), r.table('all_geocodes'),
{index: 'state_name'}).zip().pluck('location_id').distinct()
.eqJoin(function(v) {
return [v('location_id'), '207P00000X', 1];
},
r.table('fact_referrals_aggregates'),
{index: 'location_and_taxonomy_and_entity_type_code'})
.zip().count()
一些相关的数字:
- 查询的第一部分returns大约2700个邮政编码。
getAll(['207P00000X', 1])
上的引用 returns 大约 100000 行,并且对它进行内部连接与邮政编码比我所拥有的要慢得多。
- 它还有大约 100000 行仅匹配邮政编码。
- 大约有 8000 行在邮政编码和
['207P00000X', 1]
参数上都匹配。
正如您从下面的查询分析器输出中看到的那样,ReDB 正在插入一个占用所有时间的 concatmap。这是我第一天使用 RethinkDB,所以我确定我缺少某些东西,但不知道它是什么。关于如何提高此查询性能的任何建议?是否可以通过不同的结构来避免 concatMap?
{
"description": "Evaluating count.",
"duration(ms)": 9428.348954,
"sub_tasks": [
{
"description": "Evaluating zip.",
"duration(ms)": 9394.828064,
"sub_tasks": [
{
"description": "Evaluating eq_join.",
"duration(ms)": 9198.099333,
"sub_tasks": [
{
"description": "Evaluating concatmap.",
"duration(ms)": 9198.095406,
"sub_tasks": [
{
"description": "Evaluating distinct.", // Distinct ZIP codes
"duration(ms)": 114.880663,
"sub_tasks": [
{ *snipped for brevity* },
{
"description": "Evaluating elements in distinct.",
"mean_duration(ms)": 0.001039,
"n_samples": 2743
}
]
},
{
"description": "Evaluating func.",
"duration(ms)": 0.004119,
"sub_tasks": []
},
{
"description": "Evaluating stream eagerly.",
"mean_duration(ms)": 1.0934,
"n_samples": 8285
}
]
}
]
},
{
"description": "Evaluating stream eagerly.",
"mean_duration(ms)": 0.001005,
"n_samples": 8285
}
]
}
]
非规范化最终成为了解决之道。我在推荐中添加了州和城市字段 table,消除了对 ZIP table 的大量连接,速度大大提高。
更新:再看一遍,我想我只需要对数据进行更多的非规范化,然后简单地将相关位置信息 (city/state/etc.) 添加到推荐的每一行 table,而不是对一大组邮政编码进行连接。我在正确的轨道上吗?
原问题:
我有两个 table,一个包含邮政编码信息,另一个 table 包含大约 400 万行,每行都有一个邮政编码和一些其他信息。给定一个特定的邮政编码,我想获得相同状态 and/or 城市中的所有邮政编码(在下面的示例中只是状态),然后从推荐 table 中提取所有匹配那些的行来自系统其他部分的 ZIP 和一些其他类别数据。
我正在使用下面的查询,它有效,但需要大约 10 秒才能到达 运行。
r.table('all_geocodes').getAll('77019',
{index:'postal_code'}).pluck('state_name')
.eqJoin(r.row('state_name'), r.table('all_geocodes'),
{index: 'state_name'}).zip().pluck('location_id').distinct()
.eqJoin(function(v) {
return [v('location_id'), '207P00000X', 1];
},
r.table('fact_referrals_aggregates'),
{index: 'location_and_taxonomy_and_entity_type_code'})
.zip().count()
一些相关的数字:
- 查询的第一部分returns大约2700个邮政编码。
getAll(['207P00000X', 1])
上的引用 returns 大约 100000 行,并且对它进行内部连接与邮政编码比我所拥有的要慢得多。- 它还有大约 100000 行仅匹配邮政编码。
- 大约有 8000 行在邮政编码和
['207P00000X', 1]
参数上都匹配。
正如您从下面的查询分析器输出中看到的那样,ReDB 正在插入一个占用所有时间的 concatmap。这是我第一天使用 RethinkDB,所以我确定我缺少某些东西,但不知道它是什么。关于如何提高此查询性能的任何建议?是否可以通过不同的结构来避免 concatMap?
{
"description": "Evaluating count.",
"duration(ms)": 9428.348954,
"sub_tasks": [
{
"description": "Evaluating zip.",
"duration(ms)": 9394.828064,
"sub_tasks": [
{
"description": "Evaluating eq_join.",
"duration(ms)": 9198.099333,
"sub_tasks": [
{
"description": "Evaluating concatmap.",
"duration(ms)": 9198.095406,
"sub_tasks": [
{
"description": "Evaluating distinct.", // Distinct ZIP codes
"duration(ms)": 114.880663,
"sub_tasks": [
{ *snipped for brevity* },
{
"description": "Evaluating elements in distinct.",
"mean_duration(ms)": 0.001039,
"n_samples": 2743
}
]
},
{
"description": "Evaluating func.",
"duration(ms)": 0.004119,
"sub_tasks": []
},
{
"description": "Evaluating stream eagerly.",
"mean_duration(ms)": 1.0934,
"n_samples": 8285
}
]
}
]
},
{
"description": "Evaluating stream eagerly.",
"mean_duration(ms)": 0.001005,
"n_samples": 8285
}
]
}
]
非规范化最终成为了解决之道。我在推荐中添加了州和城市字段 table,消除了对 ZIP table 的大量连接,速度大大提高。