Re: Query optimizing - Mailing list pgsql-sql

From Richard Huxton
Subject Re: Query optimizing
Date
Msg-id 4918230A.5060306@archonet.com
Whole thread Raw
In response to Re: Query optimizing  (Richard Huxton <dev@archonet.com>)
Responses Re: Query optimizing
List pgsql-sql
Richard Huxton wrote:
> Do you have an index on (id,dt_modified) for manage_followup? Can you
>  provide an EXPLAIN ANALYSE for this?

> Hi Richard,
>
> Firstly, thank-you very much for your swift reply. To answer your
> question,
> I had not been using an index on dt_modfied. I have added it now and
> ran explain analyse on the function snippet. I am almost too
> embarrassed
to show
> the result....
>
> QUERY PLAN
[snip]
> Total runtime: 412464.804 ms!!!!

Something wrong here. I've attacked a small script that generates 10,000
issues and 10 follow-ups for each. It then pulls off the most recent
follow-ups for all issues occurring on a given date.

The explain analyse should show both indexes being used and a runtime of
a few milliseconds.

--
  Richard Huxton
  Archonet Ltd
BEGIN;

CREATE SCHEMA issuefup;

SET search_path = issuefup;

CREATE TABLE issues (
    id integer,
    dt_created timestamp(0) with time zone,
    dt_modified timestamp(0) with time zone,
    t_title varchar(100),
    t_description text
);

CREATE TABLE followups (
    id integer,
    dt_created timestamp(0) with time zone,
    dt_modified timestamp(0) with time zone,
    t_description text,
    n_issue integer NOT NULL
);

INSERT INTO issues
    (id, dt_created, dt_modified, t_title, t_description)
SELECT
    (d*100 + i),
    '2008-01-01'::date + (d * '1 day'::interval),
    '2008-01-01'::date + (d * '1 day'::interval),
    'issue title ' || d || '/' || i,
    'issue description ' || d || '/' || i
FROM
    generate_series(0,99) AS d,
    generate_series(0,99) AS i
;


INSERT INTO followups
    (id, dt_created, dt_modified, t_description, n_issue)
SELECT
    (i.id * 10) + d,
    '2008-01-01'::date + ((i.id + d) * '1 day'::interval),
    '2008-01-01'::date + ((i.id + d) * '1 day'::interval),
    'followup description ' || ((i.id * 10) + d),
    i.id
FROM
    generate_series(0,9) AS d,
    issues AS i
;

ALTER TABLE issues ADD  PRIMARY KEY (id);
ALTER TABLE followups ADD PRIMARY KEY (id);
ALTER TABLE followups ADD CONSTRAINT n_issue_fkey FOREIGN KEY (n_issue) REFERENCES issues (id);
CREATE INDEX issues_dt_idx ON issues (dt_modified);
CREATE INDEX followups_nissue_dt_idx ON followups (n_issue, dt_modified);

ANALYSE ;

EXPLAIN ANALYSE
SELECT
    fu.*
FROM
    issues i,
    followups fu
WHERE
    i.dt_modified = '2008-01-07 00:00:00+00'
    AND fu.id = (
        SELECT f.id
        FROM followups f
        WHERE f.n_issue = i.id
        ORDER BY f.dt_modified DESC LIMIT 1
    )
;

ROLLBACK;

pgsql-sql by date:

Previous
From: "Sebastian Ritter"
Date:
Subject: Re: Query optimizing
Next
From: "Sebastian Ritter"
Date:
Subject: Re: Query optimizing