我有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倍。
答案 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万行,而且没有特别的顺序。你仍然没有全面了解。