更新:再看一遍,我认为我只需要更多地对数据进行非规范化,只需将相关的位置信息(城市/州/等)添加到推荐表的每一行,而不是而不是在一大堆邮政编码上进行连接。我是在正确的轨道上吗?
原始问题:
我有两个表,一个包含邮政编码信息,一个推荐表包含大约400万行,每个表都有一个邮政编码和一些其他信息。给定一个特定的邮政编码,我想让所有的ZIP处于相同的州和/或城市(仅在下面的例子中说明),然后从推荐表中提取所有与这些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()
一些相关数字:
getAll(['207P00000X', 1])
返回大约100000行,并且与邮政编码进行内连接比我的速度慢得多。 ['207P00000X', 1]
参数大约有8000行匹配。从下面的查询分析器输出中可以看出,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
}
]
}
]
答案 0 :(得分:2)
非规范化最终成为了这里的方式。我将状态和城市的字段添加到引用表中,消除了对ZIP表的大量连接,并且速度大大提高。