在引用的表中显示多列的另一个字段,并考虑到性能问题

时间:2012-11-23 04:50:33

标签: sql performance postgresql indexing bigdata

我有edge这样的表:

-------------------------------
| id | arg1 | relation | arg2 |
-------------------------------
| 1  |   1  |     3    |   4  |
-------------------------------
| 2  |   2  |     6    |   5  |
-------------------------------

其中arg1,relation和arg2引用另一个object表中对象的id:

--------------------
| id | object_name |
--------------------
| 1  |   book      |
--------------------
| 2  |   pen       |
--------------------
| 3  |   on        |
--------------------
| 4  |   table     |
--------------------
| 5  |   bag       |
--------------------
| 6  |   in        |
--------------------

我想要做的是,考虑到性能问题(一个非常大的表,超过5000万个条目)显示每个边条目的object_name而不是id,例如:

---------------------------
| arg1 | relation | arg2  |
---------------------------
| book |    on    | table |
---------------------------
|  pen |    in    | bag   |
---------------------------

执行此操作的最佳选择查询是什么?此外,我愿意接受优化查询的建议 - 在表格上添加更多索引......

编辑:基于以下评论:

1)@Craig Ringer:PostgreSQL version: 8.4.13,两个表的唯一索引为id

2)@andrefsp:edge几乎是object的x2倍。

2 个答案:

答案 0 :(得分:2)

如果您可以更改数据库的结构,则可以尝试对数据库的这一部分进行非规范化,并使用 id arg1_name <字段创建表 edge / strong>, relation_name arg2_name 。并且保留表对象而不进行更改,以便在插入或更新 edge 表时为其取名。

这不好。您的数据将是重复的(数据库的大小将更大),并且可能难以插入或更新表。

但它应该快速选择(没有JOIN):

SELECT arg1_name, relation_name, arg2_name
FROM edge;

答案 1 :(得分:0)

它不会比这更便宜:

SELECT o1.object_name, r1.object_name, o2.object_name
FROM   edge e
JOIN   object o1 ON o1.id = e.arg1
JOIN   object  r ON  r.id = e.relation
JOIN   object o2 ON o2.id = e.arg2;

而且您不需要更多索引。 object.id上的那个是此查询所需的唯一一个。

但我严重怀疑你想要一次检索5000万行,而且没有特别的顺序。你仍然没有全面了解。