Temat: Wstrzymanie triggera na potrzeby transakcji
Na początek witam wszystkich forumowiczów, jestem tu pierwszy raz i widzę ze chyba przyda mi się to forum
A teraz do rzeczy. Chciałem zobie trochę zoptymalizować funkcję rekurencyjną w PL/PGSQL. Wykonuje ona kilka(naście/dziesiąt/set) powiązanych ze sobą logicznie wierszach. Na tabeli w której są te wiersze wisi sobie trigger, który tworzy mi na podstawie danych z wiersza kolumnę pod tsearch2 (buduje z kilku pól jeden tsvector), ale mniejsza z tym.
Chciałem zawiesić wyzwalanie tego triggera na czas działania funkcji zeby niepotrzebnie nie mielił po bazie jak jeszcze się wszystko zmienia. Sprawę załatwiłem tak, że wewnątrz transakcji wykonuję:
ALTER TABLE jakas_tabela DISABLE TRIGGER jakis_trigger;
EXECUTE recurs(i, j);
ALTER TABLE jakas_tabela ENABLE TRIGGER jakis_trigger;
Wynik działania jest świetny wzrost wydajności dla testowej próbki danych 3-krotny
Tylko teraz mam problem, bo o ile dla jednego wątku wszystko działa jak należy to nie wiem jak taka funkcja zachowa się jeśli w czasie jej działania inny wątek będzie chciał zapisać jakieś dane do tej samej tabeli.
Czy wtedy jako ze triggery są przez ten moment wyłączone nie zadziałają w ogóle, czy też zadziałają bo blokada jest wykonywana w transakcji?
Nie wiem jak wybrnąć z tej sytuacji, bo nie znalazłem lepszego sposobu na zablokowanie wyzwalaczy wyłącznie dla aktualnej transakcji. Z tego co się orientuję to transakcja nic chyba nie da dla zapytania "ALTER TABLE" tak czy siak.
Jedyny pomysł jaki mi przychodzi do głowy to dorzucić tam LOCK TABLE, tylko nie wiem czy to dobry pomysł, a jeśli tak to jakiego typu (tylko blokada zapisu zeby poczekać na właczenie triggerów, odczyt zostaje dostępny) musiałby być ten LOCK.
Bardzo proszę o radę.