UPDATE na dużej tabeli Informix

0

Cześć,

Potrzebuję zrobić update 5 tys rekordów na tabeli która ma 270 mln rekordów. Na testowej bazie zajmuje to dobre parę godzin. Jak mogę to przyspieszyć?
Będę testować wyłączenie indexów przed. Czy podpowiecie coś jeszcze? Może da się to skrócić do jakiejś godziny chociaż? :)

1

ile trwa select z warunkami takimi samymi jak update, jak wygląda jego plan? Wyłączenie indeksów to w 99% przypadków najgorsze co możesz zrobić

0
abrakadaber napisał(a):

ile trwa select z warunkami takimi samymi jak update, jak wygląda jego plan? Wyłączenie indeksów to w 99% przypadków najgorsze co możesz zrobić

select trwa pare sekund...

update wygląda jak poniżej, gdzie X to tabela ok 200 mln, a Y 5 tys.

update X
set X.1 = Y.1, X.2 = Y.2
from Y
where Y.id = X.id 
and Y.id2 = X.id2;
0

Jeśli zwrócisz sobie selectem klucz główny to możesz potem zrobić pętlę i wykonać update dla każdego wiersza, na podstawie klucza głównego. Po kluczu głównym, dla jednej wartości czas w jakim zrobi się update powinien być <1 sekunda, więc dla Twoich 5000 wierszy łączny czas byłby z zakresu - 1-1.5h.

2

Jak nie ma powiązań, to wywal rekordy i wrzuć z poprawnymi danymi...

0

może pokaż faktyczne zapytanie i plan wykonania (zarówno na SELECT jak i UPDATE)

0

Google pokazuje, że Informix ma ROWID. Zbuduj tabelkę pomocniczą, w której bedziesz mial rowidy wierszy do aktualizacji i nowe wartości kolumn. Później update po ROWID.

0

Potrzebuję zrobić update 5 tys rekordów na tabeli która ma 270 mln rekordów. Na testowej bazie zajmuje to dobre parę godzin. Jak mogę to przyspieszyć?

Stawiam na brak odpowiednich indeksów .
Dobrze zdefiniowany indeksy sprawią że 5 tys rekordów do updatowania uzyskasz w ułamku sekundy

4

Patrząc na plan rzeczywiście UPDATE nie korzystał z indexu... Zrobiłam inaczej i poszło w parę sekund:

MERGE INTO X a
USING Y b
ON ( b.id = a.id 
and b.id2 = a.id )
WHEN MATCHED THEN UPDATE
SET a.1 = b.1,
a.2 = b.2;
0

@Marcin.Miga:

Nie do końca jest to zgodne z prawdą. Na pewno w przypadku PostgreSQL.

Zaintrygowało mnie to. Stworzyłem testową bazę (Firebird) z jedną prostą tabelą

CREATE TABLE BIGDATA1 (
  ID BIGINT NOT NULL,
  VALUE1 CHAR(40) CHARACTER SET UTF8 COLLATE UTF8,
  ID1 BIGINT);


ALTER TABLE BIGDATA1 ADD PRIMARY KEY (ID);


CREATE INDEX IDX_BIGDATA1 ON BIGDATA1(ID1);

Zapakowałem do niej ok 80 mln wierszy i nie zaobserwowałem aby w prostym teście baza nie korzystała z indeksów .
A Postgress jest uważny za produkt z wyższej półki niż Firebird

1 użytkowników online, w tym zalogowanych: 0, gości: 1