我对计数查询有问题,它太慢了。然后我发现一篇文章谈到了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/

10-16 15:19