CodeGym /Kursy /SQL SELF /Analiza aktualnych zapytań i transakcji

Analiza aktualnych zapytań i transakcji

SQL SELF
Poziom 55 , Lekcja 4
Dostępny

Zacznijmy od podstaw. PostgreSQL daje mega zestaw narzędzi do analizy zapytań SQL i transakcji. Na przykład, wbudowane funkcje current_query() i txid_current() pozwalają Ci:

  • Pobrać aktualnie wykonywane zapytanie SQL.
  • Dowiedzieć się, w ramach której transakcji działa zapytanie.
  • Logować operacje SQL do późniejszej analizy.
  • Śledzić problemy z transakcjami, jeśli Twój kod oczekuje czegoś, a dzieje się coś zupełnie innego.

To wszystko może Cię uratować, gdy standardowy debug nie pomaga albo chcesz przeanalizować zachowanie zapytań "po śladach".

Przegląd wbudowanych funkcji

Funkcja current_query()

current_query() zwraca tekst aktualnego zapytania SQL wykonywanego w danym połączeniu. "Skąd to wie?" — zapytasz. PostgreSQL świetnie śledzi stan każdego połączenia i ta funkcja pozwala zajrzeć za kulisy.

Składnia:

SELECT current_query();

Przykład użycia:

-- Wykonujemy zapytanie w funkcji
DO $$
BEGIN
    RAISE NOTICE 'Aktualne zapytanie: %', current_query();
END;
$$;

-- Wynik:
-- NOTICE: Aktualne zapytanie: DO $$ BEGIN RAISE NOTICE 'Aktualne zapytanie: %', current_query(); END; $$;

Jak widać w przykładzie, current_query() podpowiada nam tekst wykonywanego zapytania. Ta informacja jest mega przydatna przy analizie złożonych procedur: wiesz dokładnie, co się wykonuje w danym momencie!

Funkcja txid_current()

Kiedy chodzi o transakcje, funkcja txid_current() to świetne narzędzie. Zwraca unikalny identyfikator aktualnej transakcji. To szczególnie przydatne, jeśli chcesz śledzić kolejność operacji w ramach jednej transakcji.

Składnia:

SELECT txid_current();

Przykład użycia:

BEGIN;

-- Pobieranie ID aktualnej transakcji
SELECT txid_current();

-- Wynik:
-- 564 (na przykład, identyfikator)

-- Kończymy transakcję
COMMIT;

Te ID transakcji możesz wykorzystać do powiązania logów, analizy kolejności działań, a nawet debugowania systemów wieloużytkownikowych.

Przykłady użycia w realnych zadaniach

  1. Logowanie aktualnego zapytania w trakcie działania.

Czasem procedura albo funkcja zawiera mnóstwo zapytań SQL. Żeby ogarnąć, gdzie coś poszło nie tak, możesz włączyć logowanie aktualnego zapytania SQL. Na przykład:

DO $$
DECLARE
    current_txn_id BIGINT;
BEGIN
    current_txn_id := txid_current();
    RAISE NOTICE 'ID aktualnej transakcji: %', current_txn_id;

    RAISE NOTICE 'Aktualne zapytanie: %', current_query();

    -- Tutaj mogą być Twoje dodatkowe operacje
END;
$$;

Ten kod wypisze na konsolę identyfikator transakcji i tekst aktualnego zapytania. Teraz dokładnie wiesz, co się wykonuje w danym momencie.

  1. Analiza transakcji w celu wykrycia problemów.

Wyobraź sobie scenariusz, gdzie użytkownicy narzekają na utratę danych przy masowej aktualizacji. Tworzysz kilka procedur, każda startuje w jednej transakcji. Jak sprawdzić, kto zawinił? Oto przykład:

BEGIN;

-- Dodajemy logowanie transakcji
DO $$
BEGIN
    RAISE NOTICE 'ID aktualnej transakcji: %', txid_current();
END;
$$;

-- Wykonujemy "problemowe" zapytanie SQL
UPDATE orders
SET status = 'processed'
WHERE id IN (SELECT order_id FROM pending_orders);

COMMIT;

Jeśli aktualizacje nie przechodzą, od razu widzisz ID transakcji, do której należą Twoje zmiany. To nie tylko ułatwia szukanie błędu, ale też pomaga ogarnąć, czy były konflikty transakcji.

  1. Logowanie zapytań do analizy historycznej.

Czasem musisz nie tylko naprawić bieżący problem, ale też zapamiętać, jakie zapytania SQL były wykonywane. Na przykład możesz stworzyć tabelę do logowania:

CREATE TABLE query_log (
    log_time TIMESTAMP DEFAULT NOW(),
    query_text TEXT,
    txn_id BIGINT
);

Tak możesz zapisywać zapytania z użyciem current_query() i txid_current():

DO $$
BEGIN
    INSERT INTO query_log (query_text, txn_id)
    VALUES (current_query(), txid_current());
END;
$$;

Teraz w tabeli query_log masz info o każdym wykonanym zapytaniu i transakcji, w której zostało wykonane. To bezcenne narzędzie do analizy pracy bazy danych.

Praktyczne case'y użycia

Przykład 1: audyt transakcji

Wyobraź sobie, że analizujesz operacje w systemie wieloużytkownikowym. Logowanie ID transakcji (txid_current) pozwala Ci grupować działania w ramach jednej transakcji.

DO $$
DECLARE
    txn_id BIGINT;
BEGIN
    txn_id := txid_current();
    RAISE NOTICE 'Transakcja rozpoczęta z ID: %', txn_id;

    -- Jakaś operacja
    UPDATE users SET last_login = NOW() WHERE id = 123;

    RAISE NOTICE 'Aktualne zapytanie: %', current_query();
END;
$$;

Przykład 2: uproszczenie debugowania procedur

Wywołałeś złożoną procedurę i coś poszło nie tak. Możesz wstawić logowanie current_query() na różnych etapach funkcji, żeby zobaczyć, jakie zapytanie się wykonało:

CREATE OR REPLACE FUNCTION debugged_function() RETURNS VOID AS $$
BEGIN
    RAISE NOTICE 'Aktualne zapytanie przed aktualizacją: %', current_query();
    UPDATE data_table SET field = 'debugging';
    RAISE NOTICE 'Aktualne zapytanie po aktualizacji: %', current_query();
END;
$$ LANGUAGE plpgsql;

Kiedy wywołanie funkcji się skończy, dostaniesz dwa powiadomienia z odpowiednimi zapytaniami SQL.

Tipy do użycia

  1. Używaj current_query() do logowania zapytań w systemach wieloużytkownikowych, żeby wiedzieć, jakie akcje są wykonywane.
  2. txid_current() idealnie nadaje się do analizy pochodzenia zmian: na jakim etapie Twojej transakcji dane zostały dodane lub zmienione.
  3. Nie zapomnij usuwać niepotrzebnego logowania, gdy już go nie potrzebujesz. Ciągłe powiadomienia przez RAISE NOTICE mogą spowolnić działanie Twojej funkcji.

Te wbudowane funkcje to Twój "mikroskop", który pozwala badać najmniejsze szczegóły działania bazy danych. Pomogą Ci łapać błędy, poprawiać wydajność i rozumieć, co się dzieje w złożonych systemach. Gdzieś tam, w środku PostgreSQL, Twoja baza już jest gotowa dzielić się sekretami — wystarczy nauczyć się je czytać.

1
Ankieta/quiz
Wprowadzenie do debugowania PL/pgSQL, poziom 55, lekcja 4
Niedostępny
Wprowadzenie do debugowania PL/pgSQL
Wprowadzenie do debugowania PL/pgSQL
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION