Korištenje LIMIT-a prilikom odrađivanja UPDATE-a

Bok,

moram odraditi update na jednoj tablici.
Ovako mi izgleda query:
UPDATE PAYMENT set payout_type = ‘CUSTOM’, last_modified = last_modified
WHERE connection_id =11
AND type != ‘CUSTOM’
and service IN (1,2,3,4,5,6,7,8)

Sada ovaj update bi trebao odraditi preko 3 milijon redova ali pojede mi cijeli disk space i sve mi zalocka.
Mislio sam koristiti LIMIT po jednom updateu ali ne znam kako ga ispravno postaviti.
Može li netko savjetovati ili pomoći?

UPDATE PAYMENT
                              set payout_type = 'CUSTOM',
                              last_modified = last_modified
              WHERE connection_id =11
             AND type != 'CUSTOM'
             AND id < (SELECT MAX(id) AS id FROM PAYMENT LIMIT BY 5000)
             and service IN (1,2,3,4,5,6,7,8)

i onda nakon prvug upita ide

   UPDATE PAYMENT
                                  set payout_type = 'CUSTOM',
                                  last_modified = last_modified
                  WHERE connection_id =11
                 AND type != 'CUSTOM'
                 AND
                       ( id > (SELECT MIN(id) AS id FROM PAYMENT LIMIT BY 5000 OFFSET 4999)
                         AND id < (SELECT MAX(id) AS id FROM PAYMENT LIMIT BY 5000 OFFSET 4999))
                 and service IN (1,2,3,4,5,6,7,8)

Ovo bi bio jedan nacin. Nisam provjeravao u MySQL ali mislim da upit nebi trebao vracati nikakve greske.

da li je ovo ispravno napisano? i “id >” na koji se to id odnosi?

AND
( id > (SELECT MIN(id) AS id FROM PAYMENT LIMIT BY 5000 OFFSET 4999)
AND id < (SELECT MAX(id) AS id FROM PAYMENT LIMIT BY 5000 OFFSET 4999))

Ma je ali zaboravi to. Malo sam ga zakomplicirao iako nije potrebno. Na svoj query nakalami samo ovo LIMIT BY 5000, a onda nakon prvog querya dodas i offset, LIMIT BY 5000 OFFSET 5000 i to bi trebalo biti to

Dakle cjelokupan query onda izgleda ovako:
Prvi:

UPDATE PAYMENT
                              set payout_type = 'CUSTOM',
                              last_modified = last_modified
              WHERE connection_id =11
             AND type != 'CUSTOM'
             and service IN (1,2,3,4,5,6,7,8)
             LIMIT BY 5000

Drugi:

UPDATE PAYMENT
                              set payout_type = 'CUSTOM',
                              last_modified = last_modified
              WHERE connection_id =11
             AND type != 'CUSTOM'
             and service IN (1,2,3,4,5,6,7,8)
             LIMIT BY 5000 OFFSET 5000

Treci:

UPDATE PAYMENT
                              set payout_type = 'CUSTOM',
                              last_modified = last_modified
              WHERE connection_id =11
             AND type != 'CUSTOM'
             and service IN (1,2,3,4,5,6,7,8)
             LIMIT BY 5000 OFFSET 10000

itd. itd itd,

kontam kontam, hvala ti

Nevezano za SQL query … ali na koju foru pojede disk space? Jedino sto ti moze pojesti/povecati tmp file i naravno koristiti vise cpu-a i rama. Drugo nista. Ako ti na 3M zapisa sporo radi … i previse resursa jede … e onda imas problem, buduci da sumnjam da ti je baza dobro optimizirana i da koristis pravi engine koji ti treba. Sto bi recimo da ima 50M zapisa :slight_smile: ?

e upravo to pojede na foru da poveća TMP file, i to ga ogromno poveća, u roku par minuta mi je pojeo preko 15 gigi.
a gle ne radim na održavanju baze, a ta baza je davno napravljena i tek sam počeo raditi sa time. Zato ni ne znam puno stvari i trebam pomoć oko nečega pošto mi u firmu nisu dali mentora i moram se sam snalaziti.

1 Like