计算表中未引用的行数

Posted

技术标签:

【中文标题】计算表中未引用的行数【英文标题】:Counting number of non-referenced rows in a table 【发布时间】:2020-08-29 11:30:14 【问题描述】:

我有一个表addresses 和许多表都有一个引用地址的address_id 列(都有外键约束)。我想找出没有从任何其他表中引用的地址数。

我尝试了以下查询,但速度很慢:

SELECT COUNT(*)
FROM addresses A
LEFT JOIN customers C ON C.address_id = A.id
LEFT JOIN agreements AG ON AG.address_id = A.id
LEFT JOIN products P ON P.address_id = A.id
LEFT JOIN letters L ON L.address_id = A.id
WHERE C.id IS NULL
AND AG.id IS NULL
AND P.id IS NULL
AND L.id IS NULL

有什么方法可以做到这一点,而无需永远查询?

【问题讨论】:

每个优化问题都需要 2 件事,一个用于查询的 EXPLAIN 以及所有涉及的所有表的创建表 见meta.***.com/questions/333952/… 【参考方案1】:

我会先用not exists重写这个:

select count(*)
from addresses a
where 
        not exists (select 1 from customers c  where c.address_id = a.id)
    and not exists (select 1 from agreements g where g.address_id = a.id)
    and not exists (select 1 from products p   where p.address_id = a.id)
    and not exists (select 1 from letters l    where l.address_id = a.id)

然后,确保有以下索引以加快查询速度:

customers(address_id)
agreements(address_id)
products(address_id)
letters(address_id)

如果您已将address_id 列正确定义为address(id) 的外键,那么这些索引已经存在。

【讨论】:

以上是关于计算表中未引用的行数的主要内容,如果未能解决你的问题,请参考以下文章

如何加快计算 PostgreSQL 表中的行数?

jQuery:计算表中的行数

php 计算表中的行数

如何计算小于 Hive 表中特定行的行数?

根据另一个表中的条件计算表中的行数

计算另一张工作表中的行数并应用公式