2011-06-17 12 views
7

Mam bardzo ogólne pytanie:Czy duże transakcje mają liniowo lub wykładniczo rosnący koszt wydajności/zasobów?

1.) Biorąc pod uwagę, że mam transakcję (w mysql), która obejmuje modyfikację dziesięciu- lub stu tysięcy, a nawet milionów rekordów. Czy taka transakcja jest liniowo kosztowna w porównaniu z bardzo "małą" transakcją? Czy duże transakcje pochłoną wykładniczo więcej zasobów niż mała transakcja? (Mówiąc innymi słowami, należy ich unikać).

2.) Czy to prawda, że ​​po dokonaniu tak dużej transakcji obciążenie mysql przeskoczy do bardzo wysokiej wartości, dopóki transakcja nie zostanie całkowicie przetworzona?

Pytanie dotyczy głównie MySQL, ale jeśli istnieje serwer "o wiele lepszy", byłoby ciekawie o nich usłyszeć. I tak, serwer/system ma sporo obciążenia z innych procesów (więc nie jest to jedyna transakcja przetwarzana w systemie = średnia/wysoka rywalizacja). Poziomy izolacji to "wyższe/najwyższe" poziomy izolacji (które przynoszą wszystkie korzyści z rzeczywistych transakcji).

Dziękuję bardzo

+0

Wyobrażam sobie, że wykorzystywany SILNIK jest również czynnikiem dobrej odpowiedzi. (Może być dobrze dodać do posta.) –

+3

Myślę, że nie zależy to tylko od wielkości transakcji, ale także od jej [poziomu izolacji] (http://dev.mysql.com/doc/refman/5.0/ pl/set-transaction.html) i współbieżność z innymi wątkami, jeśli transakcja jest * przekształcalna do postaci szeregowej * lub * do odczytu powtarzalnego *. To jest dobre pytanie i jestem zainteresowany widząc również odpowiedzi. – Benjamin

Odpowiedz

2

To nie jest pełna odpowiedź, mam nadzieję, że ktoś daje kilka wskazówek użytecznych na ten temat.

Ale mogę dać ci co najmniej jedną wskazówkę.

Na pewno z serializable poziomie izolacji Największy problem będziesz mieć jest, gdy transakcja jest długo masz dużo szansę na automatycznie walcowane-back przez silnik. W standaryzowanym poziomie izolacji, jeśli jakakolwiek inna transakcja powoduje, że coś zmienia jeden z twoich danych mających wpływ, twoja transakcja jest wyłączona. Na poziomie izolacji w serializacji musisz pomyśleć o swojej transakcji jako o czymś, co być może będziesz musiał powtórzyć kilka razy, aż wszystko będzie dobrze. Więc ... jeśli jest duży i nie jesteś sam, to może stać się bardzo długi lub być może niemożliwy do uruchomienia.

Jeśli mówimy o zmianie wszystkich wierszy tabeli o milionach wierszy w transakcji szeregowalnej, na pewno trzeba będzie umieścić blokadę poziomu aplikacji lub semafor, coś wyższego niż transakcja bazy danych, aby powiedzieć inny proces, że " wykonują ciężkie zadanie i powinni trochę poczekać, i pozwolić ci wykonać to ważne zadanie :-)

Ale jeśli uważasz, że ten proces to zadanie konserwacyjne w każdym rzędzie i że nie stanowi to problemu dla twojego środowiska, niektóre wiersze są w nowym stanie, a inne jeszcze nie ... a następnie wykonaj transakcję dla każdego wiersza, a nie dużego. Powinieneś wykonać duże transakcje serializowalne tylko wtedy, gdy naprawdę ważne jest, aby wszystkie dotknięte wiersze zmieniły swój status w tym samym czasie (to jest Atomowość). Jest szansa, że ​​tak nie jest, prawda?