Sql 在参考表中为多列显示另一个字段,并考虑性能问题

Sql 在参考表中为多列显示另一个字段,并考虑性能问题,sql,performance,postgresql,indexing,bigdata,Sql,Performance,Postgresql,Indexing,Bigdata,我有一张像这样的edge表格: ------------------------------- | id | arg1 | relation | arg2 | ------------------------------- | 1 | 1 | 3 | 4 | ------------------------------- | 2 | 2 | 6 | 5 | ------------------------------- 其中,arg1、r

我有一张像这样的
edge
表格:

-------------------------------
| id | arg1 | relation | arg2 |
-------------------------------
| 1  |   1  |     3    |   4  |
-------------------------------
| 2  |   2  |     6    |   5  |
-------------------------------
其中,arg1、relation和arg2引用了另一个
对象
表中的对象ID:

--------------------
| id | object_name |
--------------------
| 1  |   book      |
--------------------
| 2  |   pen       |
--------------------
| 3  |   on        |
--------------------
| 4  |   table     |
--------------------
| 5  |   bag       |
--------------------
| 6  |   in        |
--------------------
我想做的是,考虑到性能问题(一个超过5000万条目的非常大的表),显示每个边缘条目的
对象\u名称
,而不是
id
,例如:

---------------------------
| arg1 | relation | arg2  |
---------------------------
| book |    on    | table |
---------------------------
|  pen |    in    | bag   |
---------------------------
执行此操作的最佳选择查询是什么?此外,我愿意接受优化查询的建议——在表上添加更多索引等

编辑:基于以下评论:

1) @Craig Ringer:
PostgreSQL版本:8.4.13
,两个表的唯一索引是
id


2) @andrefsp:
edge
几乎是
对象的2倍

它不会比这个便宜:

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万行,并且没有特定的顺序。您仍然没有给出完整的情况。

如果您可以更改数据库的结构,您可以尝试对数据库的这一部分进行反规范化,并使用字段idarg1\u namerelationship\u namearg2\u name创建表edge。并保持表对象不变,以便在插入或更新时为表命名

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

但选择(无连接)应该很快:


任何解决方案都需要对
边缘
中的每个条目进行三次
对象
索引扫描。请显示两个表的psql
\d
输出,以便我们知道您有哪些索引,如果可能,请添加您的PostgreSQL版本和一些示例数据,这样每个人都不必伪造自己的数据。完成编辑后,请发表评论。50mil条目不是一个大表。正如@CraigRinger所问的,我们希望看到表定义和
解释分析
,用于您迄今为止所做的所有查询。哪一个表更大?哦,我的错。我应该包括更多的信息,正如你们所说的。谢谢你们的回复;)然而,我认为我不能改变数据库的结构。@israkir:另外,对一个有5000万行的表进行非规范化可能会使一切都变慢。由于行的大小要大得多,表的较小部分将在任何给定时间驻留在缓存中。->更少的缓存命中->更多的磁盘访问。这实际上取决于字符串的中等长度。如果字符串像您的示例中那样短,则反规范化可以使其更快,但我怀疑情况是否如此。
整数
占用4个字节,
文本
占用1个字节+实际字符串(每个字符1个或更多字节)。您必须进行测试才能找到最佳点。我当然不想一次查询5000万行。我的程序正在为特定的边行添加条件。这和我提出的解决方案差不多。我只是想对这件事有另一种看法。谢谢
SELECT arg1_name, relation_name, arg2_name
FROM edge;