/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
[postgresql] update af stor tabel tager en~
Fra : Morten Lindow


Dato : 09-02-04 16:58

Jeg har en stor tabel

miRNA=# select count(*) from foldbackjobs;
count
---------
3135441
(1 row)

miRNA=# \d foldbackjobs;
Table "public.foldbackjobs"
Column | Type |
Modifiers
-------------------+-----------------------+-------------------------------------------------------
foldbackjobs_id | bigint | not null default
nextval('foldbackjobs_id_seq'::text)
source_id | bigint |
source_type | character varying(25) |
sequence | text |
result_id | bigint |
status | character varying(25) |
designated_worker | integer |
Indexes: foldbackjobs_pkey primary key btree (foldbackjobs_id),
foldbackjobs_result_id_idx unique btree (result_id),
foldbackjobs_source_id_idx unique btree (source_type, source_id),
foldbackjobs_designated_worker_idx btree (designated_worker)


Nedenstående update tager cirka 13 sekunder

update foldbackjobs set status = 'completed' where foldbackjobs_id
between 3135442 and 3135552

Det virker relativt uafhængigt af hvor mange række jeg updater, så i
øjeblikket prøver jeg at komme omkring det ved at samle sammen inden jeg
gør det, men det er ikke rigtigt tilfredstillende.

Hvad kan jeg gøre for at speede det op. Er der nogle serverindstillinger
der hjælper når man har store tabeller? Eller andre fif?
Det skader vel ikke at jeg index på felter som jeg ikke updater?

Kan man få serveren til at loade en hele tabel ind i memory for at
speede det op?



mvh
Morten


 
 
Troels Arvin (09-02-2004)
Kommentar
Fra : Troels Arvin


Dato : 09-02-04 17:11

On Mon, 09 Feb 2004 16:57:39 +0100, Morten Lindow wrote:
> update foldbackjobs set status = 'completed' where foldbackjobs_id between
> 3135442 and 3135552

Mon det hjælper at køre det som

update foldbackjobs
set status = 'completed'
where foldbackjobs_id between 3135442::bigint and 3135552::bigint

Hvis det hjælper, er det fordi at indeces nogle gange ikke benyttes, med
mindre datatyperne stemmer fuldstændig overens.

Ved du, om den benytter index eller ej?

> Hvad kan jeg gøre for at speede det op. Er der nogle serverindstillinger
> der hjælper når man har store tabeller? Eller andre fif? Det skader vel
> ikke at jeg index på felter som jeg ikke updater?

Generelt om performance i PostgreSQL-sammenhæng:
http://www.varlena.com/varlena/GeneralBits/Tidbits/perf.html

--
Greetings from Troels Arvin, Copenhagen, Denmark


Morten Lindow (09-02-2004)
Kommentar
Fra : Morten Lindow


Dato : 09-02-04 17:30

Troels Arvin wrote:
> On Mon, 09 Feb 2004 16:57:39 +0100, Morten Lindow wrote:
>
>>update foldbackjobs set status = 'completed' where foldbackjobs_id between
>>3135442 and 3135552
>
>
> Mon det hjælper at køre det som
>
> update foldbackjobs
> set status = 'completed'
> where foldbackjobs_id between 3135442::bigint and 3135552::bigint
JA!! vupti ingen tid.

>
> Hvis det hjælper, er det fordi at indeces nogle gange ikke benyttes, med
> mindre datatyperne stemmer fuldstændig overens.
Det er da rimeligt dumt lavet, men desto mere vigtigt at vide.

Tak!


Stig Johansen (10-02-2004)
Kommentar
Fra : Stig Johansen


Dato : 10-02-04 06:39

Troels Arvin wrote:

> Mon det hjælper at køre det som
>
> update foldbackjobs
> set status = 'completed'
> where foldbackjobs_id between 3135442::bigint and 3135552::bigint
>
> Hvis det hjælper, er det fordi at indeces nogle gange ikke benyttes, med
> mindre datatyperne stemmer fuldstændig overens.

Nu kan jeg se, at dit input var løsningen her.
Men når vi snakker BETWEEN, har jeg været ude for, at en optimizer hellere
ville have >= AND <=.
Jeg kan ikke huske hvilket system det var, men det var ikke PostgreSQL.

--
Med venlig hilsen
Stig Johansen

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste