我对计数查询有问题,它太慢了。然后我发现一篇文章谈到了PostgreSQL上的计数估计。它使用以下函数估计行数:
CREATE OR REPLACE FUNCTION public.count_estimate(query text)
RETURNS integer AS
$BODY$
DECLARE
rec record;
ROWS INTEGER;
BEGIN
FOR rec IN EXECUTE 'EXPLAIN ' || query LOOP
ROWS := SUBSTRING(rec."QUERY PLAN" FROM ' rows=([[:digit:]]+)');
EXIT WHEN ROWS IS NOT NULL;
END LOOP;
RETURN ROWS;
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION public.count_estimate(text)
我就这样用它:
SELECT count_estimate('SELECT * FROM table');
我传递给函数的查询接受条件(=,>,~时,它返回一个错误的计数。
在where子句中,是否需要调整此函数使其与
~
一起工作?谢谢你
最佳答案
https://www.postgresql.org/docs/current/static/sql-explain.html
https://www.postgresql.org/docs/current/static/using-explain.html
您使用的函数只运行EXPLAIN
并分析输出以显示预期的行数。“调整”函数以显示更好的结果的唯一方法是在ANALYZE
之后添加EXPLAIN
以获得“实际”行。但是,它当然会花费您作为参数传递的查询的实际执行时间,因此在运行实际查询之前估计计数是没有意义的,如果您是在实际运行之后估计的话。
关于sql - PostgreSQL上的计数估计,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45930157/