Re: Pagination count strategies - Mailing list pgsql-general

From Torsten Förtsch
Subject Re: Pagination count strategies
Date
Msg-id 533D7C1C.20507@gmx.net
Whole thread Raw
In response to Pagination count strategies  (Leonardo M. Ramé <l.rame@griensu.com>)
Responses Re: Pagination count strategies
List pgsql-general
On 03/04/14 15:34, Leonardo M. Ramé wrote:
> Hi, in one of our systems, we added a kind of pagination feature, that
> shows N records of Total records.
>
> To do this, we added a "count(*) over() as Total" field in our queries
> in replacement of doing two queries, one for fetching the records, and
> other for getting the count. This improved the performance, but we are't
> happy with the results yet, by removing the count, the query takes
> 200ms vs 2000ms with it.
>
> We are thinking of removing the count, but if we do that, the system
> will lack an interesting feature.
>
> What strategy for showing the total number of records returned do you
> recommend?.

If you need only an estimated number and if your planner statistics are
up to date, you can use the planner.

Here is my implementation of the explain function. The COMMENT below
shows how to use it:

CREATE OR REPLACE FUNCTION explain(VARIADIC TEXT[])
RETURNS JSON AS $$
    DECLARE
        tmp TEXT;
    BEGIN
        EXECUTE 'EXPLAIN ('
             || array_to_string(array_append($1[2:array_upper($1, 1)],
'FORMAT JSON'), ', ')
             || ') '
             || $1[1] INTO tmp;
        RETURN tmp::JSON;
    END;
$$ LANGUAGE plpgsql VOLATILE;

COMMENT ON FUNCTION explain(VARIADIC TEXT[])
IS $def$
This function is a SQL interface to the planner. It returns the plan
(result of EXPLAIN) of the query passed as TEXT string as the first
parameter as JSON object.

The remaining parameters are EXPLAIN-modifiers, like ANALYZE or
BUFFERS.

The function can be used to store plans in the database.

Another interesting usage is when you need only an estimated row
count for a query. You can use

  SELECT count(*) ...

This gives you an exact number but is usually slow. If your planner
statistics are up to date and the query is not too complicated, the
planner usually gives a good estimate and is much faster.

  SELECT explain('SELECT 1 FROM tb WHERE id>80000000')
           ->0->'Plan'->'Plan Rows';
$def$;


Torsten


pgsql-general by date:

Previous
From: Alban Hertroys
Date:
Subject: Re: Any way to insert rows with ID used in another column
Next
From: "Schnabel, Robert D."
Date:
Subject: window function help