2

我有一张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几乎是 x2 倍object

4

2 回答 2

2

如果您可以更改数据库的结构,您可以尝试对数据库的这一部分进行非规范化,并使用字段idarg1_namerelation_namearg2_name制作表边缘。并保持表对象不变,以便在插入或更新边缘表时为其命名。

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

但它应该很快选择(没有加入):

SELECT arg1_name, relation_name, arg2_name
FROM edge;
于 2012-11-24T18:13:22.340 回答
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;

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

但我严重怀疑您是否想一次检索 5000 万行,并且没有特定的顺序。你仍然没有给出完整的图片。

于 2012-11-24T00:23:09.017 回答