hullo all,

I have a problem with a table containing a lot of data.

referred tables "inserzionista" and "pubblicazioni" (referenced 2 times) have resp. 1909 tuples and 8300 tuples, while this one 54942.

now the problem is that it is slow, also a simple "select * from pubblicita". (it takes 5-6 seconds on my [EMAIL PROTECTED],6Ghz laptop...)

I tried using some indexes, but the main problem is that I am using a php script to access the data that builds the query according to user input.

f.i. I made a simple interface where a user can specify multiple filters on almost all the columns of the table and a resulting query could be:

===========
SELECT
ripete.numero as ripete_numero,
pubblicita.soggetto,pubblicita.colore,
pubblicazioni.anno,pubblicazioni.numero,
pubblicita.codice_pubblicita,pubblicita.annullata,
pubblicita.codice_pagina,pubblicita.codice_materiale,
pubblicita.note,pubblicita.prezzo,
testate.testata AS testata,
inserzionisti.sigla AS inserzionista,
materiali.descrizione AS materiale,
pagine.descrizione AS pagina
FROM
pubblicita
LEFT OUTER JOIN materiali ON (pubblicita.codice_materiale=materiali.codice_materiale)
LEFT OUTER JOIN pagine ON (pubblicita.codice_pagina=pagine.codice_pagina)
LEFT OUTER JOIN inserzionisti ON (pubblicita.codice_inserzionista=inserzionisti.codice_inserzionista)
LEFT OUTER JOIN pubblicazioni ON (pubblicita.codice_pubblicazione=pubblicazioni.codice_pubblicazione)
LEFT OUTER JOIN testate ON (pubblicazioni.codice_testata=testate.codice_testata)
LEFT OUTER JOIN pubblicazioni ripete ON (pubblicita.ripete_da=ripete.codice_pubblicazione)
WHERE
pubblicazioni.anno ILIKE '2003%'
AND inserzionisti.sigla ILIKE 'starline%'
ORDER BY testate.testata ASC LIMIT 15 OFFSET 0
===========


As you can see it is a quite heavy query...but also with simple queries:

===========
cioe2=# explain SELECT * from pubblicita;
                            QUERY PLAN
-------------------------------------------------------------------
 Seq Scan on pubblicita  (cost=0.00..2863.42 rows=54942 width=325)
(1 row)

cioe2=# explain SELECT * from pubblicita where soggetto ilike 'a%';
                            QUERY PLAN
-------------------------------------------------------------------
 Seq Scan on pubblicita  (cost=0.00..3000.78 rows=54942 width=325)
   Filter: (soggetto ~~* 'a%'::text)
(2 rows)
===========

suggestions on how to make things smoother?
(the table is below)

thnx

Ciro.

===========
create table pubblicita (
        codice_pubblicita               bigserial,
        codice_inserzionista    int             NOT NULL,
        codice_pagina           varchar(2),
        codice_materiale        varchar(2),
        codice_pubblicazione    bigint          NOT NULL,
        
        data_registrazione      timestamp,
        
        ripete_da               bigint,
        soggetto                text,
        inserto                 text,
        
        prezzo                  numeric,
        ns_fattura              int,
        ns_fattura_data         date,
        vs_fattura              int,
        vs_fattura_data         date,
        
        colore                  bool,
        data_prenotazione       date,
        data_arrivo             date,
        data_consegna           date,
        note_prenotazione       text,
        note_consegna           text,
        
        note                    text,
        
        annullata               bool DEFAULT 'f',
        
        PRIMARY KEY (codice_pubblicita),
        FOREIGN KEY (codice_pubblicazione)
                REFERENCES pubblicazioni
                ON UPDATE CASCADE,
        FOREIGN KEY (ripete_da)
                REFERENCES pubblicazioni (codice_pubblicazione)
                ON UPDATE CASCADE,
        FOREIGN KEY (codice_inserzionista)
                REFERENCES inserzionisti
                ON UPDATE CASCADE,
        FOREIGN KEY (codice_pagina)
                REFERENCES pagine
                ON UPDATE CASCADE,
        FOREIGN KEY (codice_materiale)
                REFERENCES materiali
                ON UPDATE CASCADE
);
===========

---------------------------(end of broadcast)---------------------------
TIP 9: the planner will ignore your desire to choose an index scan if your
     joining column's datatypes do not match

Reply via email to