简单正确
首先,您可以使用表达式VALUES
而不是更冗长的UNION ALL SELECT
.
如果数据类型不是默认数据类型,integer
并且text
..
其次,aFULL OUTER JOIN
完全没有意义。它所做的只是让你的查询变慢。如果任何行在另一个表中有多个匹配项,则它会在计数中相乘。
WITH t1(col1, col2) AS (VALUES (1, 1), (2, 2), (3, 3))
,t2(col1, col2) AS (VALUES (1, 'A'), (2, 'B'), (2, 'C')) -- 2nd row for "2"
SELECT count(t1.*), count(t2.*)
FROM t1
FULL OUTER JOIN t2 USING (col1);
产量:
4 3
这是错误的。
WITH t1(col2) AS (VALUES (1), (2), ( 3))
,t2(col2) AS (VALUES ('A'), ('B'), ('C'))
SELECT (SELECT count(*) FROM t1) AS t1_ct
,(SELECT count(*) FROM t1) AS t2_ct;
产量:
3 3
这是正确的,除了更简单更快。
诚然,row_number()
新应用,不可能有欺骗。但这只是浪费时间。
表现
大桌子的计数相对较慢。如果您不需要确切的计数但可以接受估计,您可以非常快速地得到这个:
SELECT reltuples::bigint AS estimate
FROM pg_class
WHERE oid = 'myschema.mytable'::regclass;
我在这里引用手册:
它由 VACUUM、ANALYZE 和一些 DDL 命令(如 CREATE INDEX)更新。
此相关答案中的更多详细信息。