a very big table - Mailing list pgsql-sql
From | _moray |
---|---|
Subject | a very big table |
Date | |
Msg-id | lkf2e.2987$aH3.649@news.edisontel.com Whole thread Raw |
Responses |
Re: a very big table
|
List | pgsql-sql |
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 P4@1,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: =========== SELECTripete.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 AStestata,inserzionisti.sigla AS inserzionista,materiali.descrizione AS materiale,pagine.descrizione AS pagina FROMpubblicitaLEFT OUTER JOIN materiali ON (pubblicita.codice_materiale=materiali.codice_materiale)LEFT OUTER JOIN pagine ON (pubblicita.codice_pagina=pagine.codice_pagina)LEFTOUTER 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) WHEREpubblicazioni.anno ILIKE '2003%'AND inserzionisti.sigla ILIKE 'starline%'ORDER BY testate.testata ASC LIMIT 15 OFFSET0 =========== 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=54942width=325) (1 row) cioe2=# explain SELECT * from pubblicita where soggetto ilike 'a%'; QUERY PLAN ------------------------------------------------------------------- Seq Scan on pubblicita (cost=0.00..3000.78 rows=54942width=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 ); ===========