在一个包含大量数据的表中优化子/父结构

时间:2015-04-24 11:09:46

标签: sql performance postgresql database-performance

我有一个具有简单父子结构的表

products:
- id
- product_id
- time_created
- ... a few other columns

如果product_id为NULL,则为父级。产品ID在这里表现得像parent_id。内部数据如下所示:

id | product_id 
 1     NULL 
 2      1      
 3      1         
 4     NULL         
 4      4         

此表每晚都会更新新版本。

每个用户都使用了很多这些产品,但只有一个版本。如果为product_id添加了新行,则会通知用户。

他可以停止使用id:2并开始使用id:3。另一个用户将继续使用id:2等。

产品表每晚更新,并且增长速度非常快。目前大约有500000行,每晚增加大约20000行,每年大约有5-7000000个变化(新行)。

有没有办法优化这个数据库/表结构?我该改变什么吗?在一个表中有这么多数据是一个问题吗?

1 个答案:

答案 0 :(得分:1)

你的问题不明确。样本数据表明父子关系只有一个层次。如果是这样,这不是一个特别难的问题。您可以创建查询以查找每个产品的最新产品ID - 我假设这是具有最大id的产品ID:

select id, product_id,
       max(id) over (partition by coalsesce(product_id, id)) as biggest_id
from table t;

这是一个查找表,以获得最大的id。它会产生:

id | product_id | biggest_id
 1     NULL           3
 2      1             3
 3      1             3
 4     NULL           4
 4      4             4

如果您的表具有更深层次结构,则可以使用递归CTE解决问题,或者在更新表时进行计算。