![]() |
1
3
我想 habe 是正确的。
您可以使用
要使两个查询都快速进行,您必须使用第二个表来取消规范化,正如您所建议的那样。只需记住在加载数据后集群和分析第二个表,这样所有链接到节点的EGDE都将物理分组。 如果您不想一直查询这个表,并且不想存储和备份第二个表,那么您可以在查询之前临时创建它:
您不必集群这个临时表,因为它将在创建时按物理顺序排列。它对一个查询没有意义,但对一行中的多个查询有帮助。 |
![]() |
2
5
我想这是因为磁盘上相同的键记录有一个__密度__。 我认为具有相同ID的记录存储在密集的(即块的数量很少)中,而具有相同链接的记录存储在稀疏的(即分布到大量块中)。 如果已按ID的顺序插入记录,则可能会发生这种情况。 假设: 1。有10000条记录, 2。它们按顺序存储,例如(id,link)=(1,1),(1,2),…,(1,100),(2,1)…,和 三。50条记录可以存储在一个块中。 在上述假设中,块1 3分别由记录(1,1)~(1,50)、(1,51)~(1,100)和(2,1)~(2,50)组成。
当你
|
![]() |
3
3
如果您需要良好的性能,并且可以在不受外键约束的情况下进行处理(或使用触发器手动实现它们),请尝试
intarray
和
intagg
扩展模块。而不是边表有一个
PostgreSQL有很高的行开销,所以幼稚的边缘表只为表产生1g的空间,而索引则增加了1.5。考虑到数据集的大小,如果使用整数数组存储关系,则很有可能将大部分数据集保存在缓存中。这将使任何查找都非常迅速。我看到了大约0.08ms的查找时间来获取给定节点任意方向的边。即使您不把它全部放在内存中,您仍然可以在内存中拥有更大的比例和更好的缓存位置。 |
![]() |
4
1
您的问题似乎与磁盘IO相关。Postgres必须读取索引匹配的元组,以查看行是否可见(这不能从索引中完成,因为它不包含必要的信息)。 如果您有大量删除的行和/或更新的行,真空分析(或简单分析)将有助于。先运行它,看看是否有任何改进。 集群也可能有帮助。基于您的示例,我想说使用link_idx作为集群密钥。”使用链接“idx”群集边缘。但是,它可能会降低ID查询的性能(您的ID查询可能很快,因为它们已经在磁盘上排序)。记住在集群之后运行分析。 接下来的步骤包括微调内存参数、添加更多内存或添加更快的磁盘子系统。 |
![]() |
5
-1
你在www.neo4j.org上试过这样做吗?在一个图形数据库中,这几乎是微不足道的,应该可以在MS范围内为您的用例提供性能。 |
|
tggtsed · PostgreSQL从平均值中排除值 1 年前 |
![]() |
Dawid · 为什么我不能在子查询中使用表别名? 2 年前 |
![]() |
CraZyCoDer · 在PostgreSQL中锁定潜在事务 2 年前 |
![]() |
ranebec · 计数时如何返回0而不是null? 2 年前 |
![]() |
Flo · 分组依据中的SQL大小写 2 年前 |