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