计算PostgreSQL的估计值

时间:2017-08-29 03:15:43

标签: sql postgresql count

我在计数查询时遇到了麻烦,这太慢了。然后我发现一篇文章谈论PostgreSQL上的Count Estimate。它使用下面的函数来估计行数:

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');

我传递给函数的查询接受条件(=,>,<,LIKE,SIMILAR TO ...),但是当我尝试使用此特定条件~时,它返回错误的计数

是否有适应此功能以使其与where子句中的~一起使用?

谢谢

1 个答案:

答案 0 :(得分:1)

https://www.postgresql.org/docs/current/static/sql-explain.html

https://www.postgresql.org/docs/current/static/using-explain.html

您使用的函数只运行EXPLAIN并解析输出以显示预期的行数。唯一能够适应"这里显示更好结果的功能是在ANALYZE之后添加EXPLAIN以获得"实际"行。但是当然它会花费你作为参数传递的查询的实际执行成本,因此如果你在实际运行它之后进行估计,那么在运行实际查询之前估计计数是没有意义的。