我在计数查询时遇到了麻烦,这太慢了。然后我发现一篇文章谈论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子句中的~
一起使用?
谢谢
答案 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
以获得"实际"行。但是当然它会花费你作为参数传递的查询的实际执行成本,因此如果你在实际运行它之后进行估计,那么在运行实际查询之前估计计数是没有意义的。