Wpis z mikrobloga

Hejka Mirasy!
Mam tabelę, która ma około 8 milionów wierszy, 10 kolumn.
Chcę wypełnić (update) wiersze w kolumnie w w/w tabeli danymi z innej tabeli - czyli robię inner join do innej tabeli.

Jeżeli robilibyście taką operację w SQL to w pętli? Czy bez pętli?
Przygotowałam sobie skrypt gdzie robię update w pętli i bez pętli i wychodzi mi, że w pętli jest szybciej. Jednakże czytając w internecie opinie - zdanie jest podzielone. Niektórzy piszą, że pętla wydłuża, inni znowu, że dla miliona danych lepiej zrobić pętle. Sama nie wiem. Jest na to jakiś pattern?
Oczywiście to, że u mnie tak działa jest wynikiem tylko mojego środowiska - zdaje sobie z tego sprawę, że po uruchomieniu tego na innym środowisku...klienta ( ͡º ͜ʖ͡º)..może okazać się coś zupełnie innego.

#sql
  • 7
@jablkawmasle: a to sql server? Jednorazowa akcja? Jak masz dużo ramu i miejsca na log to możesz zrobić naraz. Powinno wtedy być szybciej. W batchach będzie bezpieczniej, nie wywalisz loga i nie wrzucisz bazy w tryb recovery w razie czego. Na prodzie lepiej robić wolniej a bezpieczniej, chyba że 99,9% availability was nie dotyczy :D
via Wykop Mobilny (Android)
  • 1
@jablkawmasle: 8 mln wierszy to nie jest mega dużo, chociaż zależy jakiego typu kolumny masz w tabeli. Jeżeli to jest SQL Server i tabela jest często używana to polecam jednak batche z uwagi na "lock escalation", to jest chyba powyżej 5k row-lockow gdy wskakujemy na object-lock. Jeżeli to jest jakaś tabela co sobie tylko leży i możesz sobie pozwolić na chwilowe zablokowanie dostępu to możesz nawet na raz, jak ma się
via Wykop Mobilny (Android)
  • 1
@jablkawmasle: to tak, teraz jeszcze kilka wskazówek jak już wiem że to MSSQL ( ͡ ͜ʖ ͡)
- jak będziesz robić batche to pamiętaj żeby je zrobić mądrze (np. nie rób WHERE [wartosc] = stara czy coś, tylko np. leć po kluczu głównym tabeli jeżeli istnieje i rób np. najpierw UPDATE wierszy od 1 do 5000, potem od 5001 do 10000 itd.)
- polecam po każdym