2010-02-12 14 views
8

Mam proces synchronizacji aplikacji mobilnej. Transakcja dokonuje wielu modyfikacji w bazie danych. Ponieważ odbywa się to na urządzeniach mobilnych, muszę wydać VACUUM, aby skompaktować bazę danych.Czy powinienem uruchomić VACUUM w transakcji lub po?

Zastanawiam się kiedy należy wydać próżni

  • w transakcji, jako ostatecznego zestawienia
  • lub po transakcji?

Jestem obecnie poszukuje SQLite, ale jeśli jest różny dla innych silników, daj mi znać w odpowiedzi (PostgreSQL, MySQL, Oracle, SQLServer)

Odpowiedz

4

Powiedziałbym, że poza transakcją. Z pewnością w PostgreSQL, VACUUM ma na celu usunięcie "martwych" krotek (tj. Starego wiersza, gdy rekord został zmieniony lub usunięty).

Jeśli używasz VACUUM w transakcji, która zmodyfikowała rekordy, te martwe rzędy nie zostanie oznaczony do usunięcia.

W zależności od typu WYCENY, które wykonujesz, może również wymagać blokady tabeli, która zablokuje, jeśli są uruchomione inne transakcje, więc możesz potencjalnie znaleźć się w sytuacji zakleszczenia (transakcja 1 jest blokowana w oczekiwaniu na blokada stołu, aby wykonać VACUUM, transakcja 2 zostanie zablokowana, czekając na zwolnienie wiersza, że ​​transakcja 1 została zablokowana.)

Polecam również, aby nie było to zrobione w aplikacji (być może jako zaplanowane zadanie) ponieważ może to zająć trochę czasu i może negatywnie wpłynąć na szybkość innych zapytań.

Jeśli chodzi o SQL Server, nie ma VACUUM - to, czego szukasz, jest mniejsze. Możesz włączyć automatyczne zmniejszanie w 2005 roku, które automatycznie odzyska miejsce po wybraniu serwera lub wyda polecenie DBCC, aby zmniejszyć bazę danych i plik dziennika, ale zależy to od procedury tworzenia kopii zapasowych i strategii na poziomie bazy danych.

1

próżniowa jest jak oszukiwać, to dobrze zrobić, jeśli Youve niedawno usunął wiele rzeczy, a może po włożeniu dużo rzeczy, ale w żadnym wypadku nie powinno to zrobić w każdej transakcji. Jest wolniejszy niż prawie każde inne polecenie bazy danych i jest bardziej zadaniem związanym z konserwacją.

Czasami dodajemy/usuwamy większość naszego pliku db, więc próżnia byłaby dobrym pomysłem, ale nadal nie uważałbym tego za część tej samej transakcji, która wykonała pracę.

0

Jak często transakcja jest uruchamiana?

To naprawdę codzienny rodzaj procesu, a nie zapytanie przez proces zapytania, ale jeśli używasz go bez pełnej wartości, można go użyć w transakcji, ponieważ nie uzyskuje blokady.

Jeśli zamierzasz to zrobić, to powinno być poza transakcją, ponieważ jest niezależne od integralności danych transakcji.

+0

Odbywa się to po procesie synchronizacji mobilnej.Poprzednia transakcja dokonuje wielu modyfikacji w bazie danych. Ponieważ odbywa się to na urządzeniach mobilnych, muszę wydać VACUUM, aby skompaktować bazę danych. – Pentium10

13

Chcesz czy nie przy użyciu PostgreSQL ty nie można uruchomić próżni w transakcji, jak podano w manual:

próżnia nie może być wykonywane wewnątrz bloku transakcji.

+0

Dziękuję, dobrze wiedzieć dla PostgreSQL. – Pentium10

+1

To samo dla SQLite: http://www.sqlite.org/lang_vacuum.html – Constantin

Powiązane problemy