我有一张包含
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;
$$
这个问题没有解决办法。
如果您想获得精确的结果集计数,您必须计算结果集并对其进行计数。这可能需要很长时间。
EXPLAIN (ANALYZE)
执行该语句,因此它不会比显式计算行数的查询快。
我的建议是您不要显示确切的结果集计数。要么使用
EXPLAIN
提供的近似值(没有 ANALYZE
),或者至少不自动显示结果集计数。相反,显示估计值并提供“精确计数”按钮。准备好等待的人可以按下按钮。