Re: **SPAM** Faster count(*)?

Поиск
Список
Период
Сортировка
От Michael Fuhr
Тема Re: **SPAM** Faster count(*)?
Дата
Msg-id 20050810133157.GA46247@winnie.fuhr.org
обсуждение исходный текст
Ответ на Re: **SPAM** Faster count(*)?  (Michael Fuhr <mike@fuhr.org>)
Список pgsql-sql
On Tue, Aug 09, 2005 at 09:29:13PM -0600, Michael Fuhr wrote:
> On Tue, Aug 09, 2005 at 10:49:14PM -0400, Tom Lane wrote:
> > Current best practice is to run the explain and parse out the "rows"
> > figure using a perl (or axe-of-choice) regexp, though we could be
> > persuaded to supply a simpler API if there's enough demand for it.
> 
> Somebody else requested a row-count-estimate function a couple of
> weeks ago:
> 
> http://archives.postgresql.org/pgsql-admin/2005-07/msg00256.php

Here's a simple example that parses EXPLAIN output.  It should work
in 8.0.2 and later:

CREATE FUNCTION count_estimate(query text) RETURNS integer AS $$
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;
$$ LANGUAGE plpgsql VOLATILE STRICT;

CREATE TABLE foo (r double precision);
INSERT INTO foo SELECT random() FROM generate_series(1, 1000);
ANALYZE foo;

SELECT count_estimate('SELECT * FROM foo WHERE r < 0.1');count_estimate 
----------------            97
(1 row)

EXPLAIN SELECT * FROM foo WHERE r < 0.1;                    QUERY PLAN                      
-----------------------------------------------------Seq Scan on foo  (cost=0.00..17.50 rows=97 width=8)  Filter: (r <
0.1::doubleprecision)
 
(2 rows)

-- 
Michael Fuhr


В списке pgsql-sql по дате отправления:

Предыдущее
От: Andrew Sullivan
Дата:
Сообщение: Re: **SPAM** Faster count(*)?
Следующее
От: Richard Huxton
Дата:
Сообщение: Re: Faster count(*)?