根据条件从大表中最快获取所有数据COUNT

问题描述 投票:0回答:1

我有一张包含

10TB
数据的表格。

我想执行

COUNT(1)/COUNT(*)
来检查主表和存档表之间的 EXACT COUNT

我尝试遵循 SQL,但没有得到最佳解决方案,查询持续运行超过 15 分钟并且还在计数...

我的尝试:

尝试 1:不起作用,查询继续运行。

SELECT COUNT(*) FROM large_table WHERE column_date <= '2023-01-01 00:00:00';

尝试 2:这可行,但如何应用条件,也不确定 EXACT 计数。

SELECT reltuples AS estimate FROM pg_class where relname = 'large_table';

尝试3:这也继续运行,运行超过

10min
后没有得到结果。使用 EXPLAIN ANALYZE 获取精确计数。

do $$
declare 
r record; 
count integer; 
begin
FOR r IN EXECUTE 'EXPLAIN ANALYZE SELECT * FROM large_table where column_date <= 
''2023-01-01 00:00:00'';'
LOOP
    count := substring(r."QUERY PLAN" FROM ' rows=([[:digit:]]+) loops');
    EXIT WHEN count IS NOT NULL;
END LOOP;
raise info '%',count;
end;
$$
postgresql count query-optimization postgresql-14
1个回答
0
投票

这个问题没有解决办法。

如果您想获得精确的结果集计数,您必须计算结果集并对其进行计数。这可能需要很长时间。

EXPLAIN (ANALYZE)
执行该语句,因此它不会比显式计算行数的查询快。

我的建议是您不要显示确切的结果集计数。要么使用

EXPLAIN
提供的近似值(没有
ANALYZE
),或者至少不自动显示结果集计数。相反,显示估计值并提供“精确计数”按钮。准备好等待的人可以按下按钮。

© www.soinside.com 2019 - 2024. All rights reserved.