Postgres polega na różnych zamkach, aby zagwarantować, że wszystkie transakcje mogą działać zgodnie z oczekiwaniami. Transakcja, która najpierw uzyska zamek, musi zostać zakończona. O ile nie zostanie dokonane cofanie lub zatwierdzenie, inna transakcja nie może iść naprzód z powodu zamka. Obecnie skupiamy się na zrozumieniu, jak jednocześnie tworzyć indeksy, aby uniknąć blokowania.
Jak działa blokowanie
Przed nurtowaniem w jednoczesne tworzenie indeksów warto zrozumieć, w jaki sposób Postgres implementuje zamki i zobaczyć, jak wpływają one na transakcję, chyba że wiesz, jak sobie z nimi poradzić.
W tym przypadku tworzymy tabelę i inicjujemy transakcję, aby zmienić tabelę, aby dodać nową kolumnę. Z następującego obrazu widzimy, że gdy transakcja alter zatrzyma blokadę jako pierwsza transakcja, polecenie Select nie odpowiada w drugiej powładzie PSQL.
Ten przypadek występuje, ponieważ pierwsza transakcja wydaje blokadę. Napotkasz podobny przypadek, gdy nie będziesz indeksować jednocześnie, jak zobaczymy w późniejszej sekcji.
Jednak gdy wydasz polecenie wycofania się do pierwszej transakcji, możemy natychmiast zauważyć, że blokada zostaje zwolniona. Teraz druga transakcja może przejść nieprzerwanie.
Tak działają zamki na tabelach. Bloki odczytują i zapisz transakcje po wykonaniu polecenia DDL. Dzięki temu zrozumieniu możemy przejść do jednoczesnego tworzenia indeksów.
Jak używać PostgreSQL do jednoczesnego utworzenia indeksu
Podczas tworzenia indeksów na PostgreSQL operacja może szybko zablokować wszystkie inne transakcje i może prowadzić do strat. Podczas indeksowania tabeli Postgres blokuje ją na operacjach zapisu, takich jak operacje aktualizacji i zmiany, dopóki kompilacja indeksu nie zakończy się.
Transakcja indeksu może potrwać godziny lub długie minuty, w zależności od rozmiaru bazy danych. Blokowanie innych transakcji w środowisku produkcyjnym oznacza, że system może być bezużyteczny do momentu zakończenia kompilacji indeksu. Jeśli masz taki scenariusz, najlepszym rozwiązaniem jest jednoczesne utworzenie indeksów, co pozbawi się zamków.
Indeksowanie jednocześnie zapewnia, że transakcja nie blokuje innych transakcji. Zatem transakcje normalne mogą wystąpić w środku procesu kompilacji. Po dodaniu jednocześnie podczas indeksowania PostgreSQL skanuje indeksowaną tabelę i czeka na zakończenie wszystkich transakcji. Zatem indeksowanie trwa jednocześnie dłużej, ale zapewnia, że w środowisku produkcyjnym nie pojawiają się opóźnienia. Zobaczmy przykład normalnego indeksowania, aby zrozumieć, w jaki sposób blokowanie może powodować chaos w środowisku produkcyjnym.
Tutaj mamy tabelę o nazwie „Szczegóły”, w której uzyskaliśmy dostęp do naszej powłoki Postgres. Załóżmy, że chcemy utworzyć indeks „btree” na jednej kolumnie. Możemy wykonać następujące polecenie:
Nasz indeks został pomyślnie utworzony, ponieważ mamy do czynienia z małym stołem.
Jednak to samo polecenie może zająć kilka godzin, jeśli jesteś w środowisku produkcji na żywo. Jeśli otworzysz kolejną powłokę PSQL i spróbujesz napisać do tej samej tabeli, powłoka nie zareaguje, dopóki indeksowanie nie zakończy. Jeśli ktoś próbuje zaktualizować, wstawić lub wykonać inną operację zapisu, zostanie zamknięty.
Taki scenariusz można naprawić poprzez jednoczesne indeksowanie tej samej tabeli. Poniżej znajduje się składnia do utworzenia indeksu jednocześnie:
Utwórz indeks współwystępuje nazwę indeksu na nazwie tabeli (nazwa kolumny)
Jeśli mamy powtórzyć ten sam indeks, który zrobiliśmy wcześniej, ale w tym przypadku jednocześnie nasze nowe polecenie byłoby następujące:
W takim przypadku, jeśli indeksowanie trwa dłużej i otwieramy kolejną powłokę, aby wykonać operację zapisu do tabeli, którą indeksujemy, nie możemy uzyskać żadnego błędu blokady, ponieważ kompilacja indeksu jest wykonana jednocześnie.
Możesz także utworzyć „unikalny współbieżny indeks”, dodając „unikalne” słowo kluczowe. Unikalne indeksowanie eliminuje redundancję i podnosi błędy, gdy wykrywa nadmiarową wartość kolumny.
Oto przykład unikalnego współbieżnego indeksowania:
Po przeglądaniu tabeli indeksu zauważysz, że indeksowanie nastąpiło pomyślnie i możesz zobaczyć, która kolumna ma unikalne indeksowanie.
# \ d Table-Nazwa;Wniosek
Tworzenie indeksu bez jednoczesnego podejścia prowadzi do blokowania i blokowania transakcji. Jednak gdy indeksujesz jednocześnie, kompilacja indeksu zakończy się bez zapobiegania wystąpieniu innych transakcji. Ten post pomaga zrozumieć, jak działa blokowanie podczas pracy z tabelami w Postgres. Ponadto wyjaśniliśmy, jak jednocześnie utworzyć indeks, aby uniknąć blokowania podczas pracy z PostgreSQL.