小编Zer*_*iny的帖子

多列变量匹配的查询优化

TL; DR - 我正在寻找有关如何更好地编写下面查询的建议。

下面是我的表结构的精简版本,其中包含一些示例数据。我根本无法控制数据结构,因此不幸的是,关于架构更改的建议对我没有帮助。

问题

给定 abuilding_level_key和 afaction_key我需要building_levelsbuilding_culture_variants表中返回从joined到其最接近匹配的记录。

例如,如果我使用goblin_walls&fact_blue我希望goblin_walls加入 building_culture_variant_keyrecord 的记录2

表的示例结构如下所示:

具有 db 结构的示例数据

  • factions- 是真实表格的压缩版本,因为文化/亚文化记录存储在不同的表格中,但它可以理解这一点。该表仅在查询中真正需要,以便可以引用与给定faction_key.

  • building_levels- 作为系统中每个建筑物的基本记录。每个建筑物只有一个记录。

  • building_culture_variants- 顾名思义;可以有用于每个多个记录building_level_key并且每个变体记录是使用针对建筑物水平匹配building_level_key和的组合faction_keyculture_keysubculture_key

匹配的工作原理

匹配从building_level_key在文化变体表中查找给定开始。这是一场艰难的比赛,需要加入任何两个建筑等级和文化变体。

每个建筑级别记录将至少有一个文化变体。通常每个建筑级别有多个文化变体,但平均不超过 4 个。最常见的文化变体是“通用”变体,这意味着faction_keyculture_keysubculture_key列都为空,因此该建筑将与任何派系匹配。但是,派系列的任何组合都可以有一个键,因此我需要将给定的派系与文化变体中的每个派系列进行匹配。

附注:文化变异键始终保持一致,这意味着我永远不会有这样一个场景,一个faction_keysubculture_key在文化变异表不匹配对应faction_key,并subculture_key从派系表(与亚表,它已经为清晰起见,省略) .

我试过的

我提供了一个sql fiddle来使用,并在下面包含了我的查询版本:

SELECT …
Run Code Online (Sandbox Code Playgroud)

postgresql performance query-performance

6
推荐指数
1
解决办法
152
查看次数