Zestawy rozmówBlog

Twoja wymarzona praca? Lets Git IT.
Interaktywna platforma przygotowująca do rozmów technicznych dla nowoczesnych programistów.

XGitHub

Platforma

  • Kategorie

Zasoby

  • Blog
  • O aplikacji
  • FAQ
  • Sugestie

Prawne

  • Polityka prywatności
  • Regulamin

© 2026 LetsGit.IT. Wszelkie prawa zastrzeżone.

Bazy danych

Baza pytań rekrutacyjnych i wiedzy. Filtruj, szukaj i sprawdzaj swoją wiedzę.

Tematy

Co to jest problem N+1 w Hibernate?

mediumhibernateormperformance+1
Otwórz pytanie

Odpowiedź

Problem N+1 występuje, gdy Hibernate pobiera N encji nadrzędnych jednym zapytaniem, a następnie leniwie dociąga dzieci osobnym zapytaniem dla każdej encji, co daje N dodatkowych selectów. Rozwiązania to fetch joiny/entity graphy, batch fetching lub zmiana strategii pobierania.

Właściwości ACID?

mediumtransactionaciddatabase-theory
Otwórz pytanie

Odpowiedź

ACID opisuje gwarancje transakcji: Atomicity (wszystko albo nic), Consistency (zachowanie niezmienników), Isolation (transakcje współbieżne zachowują się jak wykonywane sekwencyjnie) oraz Durability (zatwierdzone dane przetrwają awarię).

B-Tree vs Indeks Hash?

hardindexingb-treehash+1
Otwórz pytanie

Odpowiedź

Indeksy B‑tree utrzymują klucze w porządku, więc dobrze wspierają wyszukiwanie równościowe, zakresy, prefiksy i ORDER BY. Indeksy hash mapują klucze do kubełków i są szybkie dla równości, ale nie obsługują zakresów ani sortowania.

Normalizacja bazy danych (1NF, 2NF, 3NF)?

hardnormalizationdatabase-designtheory
Otwórz pytanie

Odpowiedź

Normalizacja zmniejsza redundancję danych. 1NF wymaga atomowych kolumn i braku grup powtarzalnych. 2NF to 1NF oraz zależność atrybutów nie‑kluczowych od całego klucza. 3NF to 2NF bez zależności przechodnich między atrybutami nie‑kluczowymi.

SQL vs NoSQL?

mediumsqlnosqlcomparison+1
Otwórz pytanie

Odpowiedź

Bazy SQL są relacyjne, mają z góry zdefiniowany schemat, joiny i silne transakcje ACID. Bazy NoSQL są nierelacyjne (dokumentowe, key‑value, kolumnowe, grafowe), zwykle mają elastyczny schemat i łatwiej się skalują horyzontalnie, czasem kosztem ścisłej spójności.

Primary key vs unique constraint vs index — jaka jest różnica?

easyprimary-keyuniqueindex+1
Otwórz pytanie

Odpowiedź

Primary key jednoznacznie identyfikuje wiersz (i może być referencjonowany przez FK). Unique constraint też wymusza unikalność, ale nie musi być „tożsamością” wiersza. Indeks to struktura przyspieszająca odczyty; może być unikalny lub nie.

Co to jest transakcja i po co jej używamy?

easytransactionacidconsistency
Otwórz pytanie

Odpowiedź

Transakcja łączy wiele operacji w jedną jednostkę pracy: albo wszystkie się udają, albo następuje rollback. Chroni spójność danych, szczególnie przy współbieżności i awariach.

Co daje indeks i jaki jest główny trade-off?

easyindexperformancetradeoffs
Otwórz pytanie

Odpowiedź

Indeks przyspiesza odczyty (filtrowanie/sortowanie), bo unika pełnych skanów tabeli. Trade-off to wolniejsze zapisy (INSERT/UPDATE/DELETE) i dodatkowe miejsce, bo indeks trzeba utrzymywać.

INNER JOIN vs LEFT JOIN — jaka jest różnica?

mediumsqljoininner-join+1
Otwórz pytanie

Odpowiedź

INNER JOIN zwraca tylko wiersze pasujące w obu tabelach. LEFT JOIN zwraca wszystkie wiersze z lewej tabeli i uzupełnia brakujące dopasowania z prawej strony NULLami.

Normalizacja vs denormalizacja — jaki jest trade-off?

mediumnormalizationdenormalizationschema-design
Otwórz pytanie

Odpowiedź

Normalizacja zmniejsza redundancję i anomalie aktualizacji przez podział danych na powiązane tabele. Denormalizacja duplikuje część danych, żeby przyspieszyć odczyty i ograniczyć joiny, kosztem trudniejszych zapisów i pilnowania spójności.

Co to jest poziom izolacji transakcji (i po co)?

mediumtransactionsisolationconcurrency
Otwórz pytanie

Odpowiedź

Izolacja definiuje, jakie anomalie są dopuszczalne przy współbieżnych transakcjach (dirty/non-repeatable reads, phantoms). Wyższa izolacja daje większą poprawność, ale może zmniejszać współbieżność i wydajność.

Co to jest problem N+1 i jak go unikać?

hardn-plus-oneormperformance
Otwórz pytanie

Odpowiedź

To sytuacja, gdy pobierasz N rekordów nadrzędnych i potem odpalasz po jednym dodatkowym zapytaniu na każdy (czyli N zapytań więcej). Unikasz przez joiny, batching, prefetch/eager loading albo zapytania typu `IN (...)`.

Optimistic vs pessimistic locking — jaka jest różnica?

hardlockingoptimisticpessimistic+1
Otwórz pytanie

Odpowiedź

Optimistic locking zakłada rzadkie konflikty: aktualizujesz z kontrolą wersji/timestamp i robisz retry przy konflikcie. Pessimistic locking blokuje wiersze z góry (np. `SELECT ... FOR UPDATE`), żeby inni nie mogli ich zmienić.

Replikacja vs sharding — jaki problem rozwiązuje każde z nich?

hardreplicationshardingscaling
Otwórz pytanie

Odpowiedź

Replikacja kopiuje te same dane na wiele węzłów (lepsza skala odczytu i dostępność). Sharding dzieli dane między węzłami (lepsza skala zapisu/rozmiaru), ale komplikuje zapytania i transakcje.

Jak czytać plan EXPLAIN na wysokim poziomie?

hardexplainquery-planperformance
Otwórz pytanie

Odpowiedź

Najpierw patrz na węzły z największym kosztem/czasem oraz typ skanu (Seq Scan vs Index Scan) i estymacje wierszy. Potem sprawdź joiny/sortowanie i czy indeksy są używane; poprawiasz zapytanie, indeksy lub statystyki.

Co to jest klucz obcy (foreign key) i co wymusza?

easyforeign-keyconstraintsintegrity
Otwórz pytanie

Odpowiedź

Foreign key to constraint łączący kolumnę z kluczem primary/unique w innej tabeli. Wymusza integralność referencyjną: nie możesz wskazać wiersza, który nie istnieje (i może kontrolować zachowanie przy delete/update).

GROUP BY vs HAVING — jaka jest różnica?

mediumsqlgroup-byhaving+1
Otwórz pytanie

Odpowiedź

GROUP BY grupuje wiersze do agregacji. HAVING filtruje grupy po agregacji (a WHERE filtruje wiersze przed grupowaniem). Np. „tylko grupy z count > 10”.

Co to jest covering index?

mediumindexcovering-indexperformance
Otwórz pytanie

Odpowiedź

Covering index zawiera wszystkie kolumny potrzebne do zapytania, więc baza potrafi odpowiedzieć używając tylko indeksu (bez sięgania do tabeli). Może mocno przyspieszyć odczyty kosztem większych indeksów i wolniejszych zapisów.

Co to jest deadlock w bazie i jak go ograniczać?

harddeadlocklockingtransactions+1
Otwórz pytanie

Odpowiedź

Deadlock to sytuacja, gdy transakcje czekają na swoje blokady w cyklu i żadna nie może ruszyć dalej. Ograniczasz przez krótkie transakcje, spójny porządek blokowania i retry przy błędach deadlock.

Co to jest SQL injection i jak temu zapobiegać?

hardsql-injectionsecurityprepared-statements
Otwórz pytanie

Odpowiedź

SQL injection to sytuacja, gdy nieufny input zmienia znaczenie SQL (np. przez konkatenację stringów). Zapobiegasz przez zapytania parametryzowane/prepared statements, poprawne escapowanie przez driver/ORM i konta DB z minimalnymi uprawnieniami.

Co to jest indeks złożony (wielokolumnowy) i kiedy pomaga?

easyindexcomposite-indexperformance
Otwórz pytanie

Odpowiedź

Indeks złożony indeksuje kilka kolumn razem (np. (org_id, email)). Pomaga, gdy zapytania filtrują/sortują po lewym prefiksie tych kolumn, zmniejszając skany i przyspieszając wyszukiwanie.

Co to jest window function w SQL i typowy use case?

mediumsqlwindow-functionsrow_number
Otwórz pytanie

Odpowiedź

Window function liczy wartość na „oknie” wierszy powiązanych z bieżącym wierszem, bez zwijania wierszy jak GROUP BY. Use case: ranking (ROW_NUMBER), sumy narastające, „top N per grupa”.

Constrainty vs triggery — jaka jest różnica i co preferować dla integralności?

mediumconstraintstriggersintegrity
Otwórz pytanie

Odpowiedź

Constrainty (PK, FK, UNIQUE, CHECK) to deklaratywne reguły egzekwowane przez silnik bazy. Triggery to własny kod uruchamiany przy zdarzeniach. Jeśli się da, preferuj constrainty do integralności, bo są prostsze, przewidywalne i zoptymalizowane.

Jak zrobić zapis idempotentny na poziomie bazy danych?

hardidempotencyunique-constraintupsert+1
Otwórz pytanie

Odpowiedź

Użyj unique constraint na idempotency key (albo naturalnym kluczu) i zrób upsert/insert z obsługą konfliktu. Jeśli ten sam request przyjdzie drugi raz, zapis stanie się no-opem albo zaktualizuje ten sam wiersz zamiast tworzyć duplikat.

Soft delete vs hard delete — jaki jest trade-off?

hardsoft-deletedata-retentionauditing
Otwórz pytanie

Odpowiedź

Soft delete oznacza oznaczenie rekordu jako usunięty (np. `deleted_at`), co pozwala na przywracanie/audyt, ale komplikuje zapytania i indeksy (trzeba filtrować usunięte). Hard delete usuwa dane i upraszcza zapytania, ale tracisz historię, jeśli jej nie archiwizujesz.

Dlaczego `SELECT *` bywa ryzykowne w produkcyjnych zapytaniach?

easysqlbest-practicesperformance+1
Otwórz pytanie

Odpowiedź

`SELECT *` pobiera więcej danych niż potrzeba (więcej I/O i pamięci) i mocno wiąże kod ze zmianami schematu (dodanie kolumny może zmienić wynik, rozmiar payloadu albo ujawnić wrażliwe pola). Wybieranie tylko potrzebnych kolumn jest czytelniejsze i może umożliwić lepsze plany (np. index-only).

NULL w SQL: dlaczego `col = NULL` nie jest true i czego użyć zamiast?

mediumsqlnullthree-valued-logic+1
Otwórz pytanie

Odpowiedź

NULL oznacza “nieznane”, więc porównania typu `col = NULL` dają UNKNOWN, a nie true/false (logika trójwartościowa). Użyj `IS NULL` / `IS NOT NULL`, a w niektórych bazach `IS DISTINCT FROM`, żeby bezpiecznie porównywać z NULL.

Partycjonowanie vs sharding: jaka jest różnica?

mediumscalingpartitioningsharding+1
Otwórz pytanie

Odpowiedź

Partycjonowanie dzieli jedną logiczną tabelę na mniejsze części, zwykle w ramach jednego systemu bazy (ułatwia zarządzanie i może przyspieszać zapytania przez pruning). Sharding dzieli dane na wiele instancji/nodów bazy, żeby skalować poziomo. Partycjonowanie jest zwykle prostsze; sharding dokłada złożoność rozproszoną.

Czym jest materialized view i kiedy ma sens?

hardviewsmaterialized-viewperformance+1
Otwórz pytanie

Odpowiedź

Materialized view fizycznie przechowuje wynik zapytania, więc odczyt może być dużo szybszy niż liczenie tego za każdym razem. Ma sens przy drogich agregacjach lub raportowaniu, akceptując trade-off: koszt odświeżania i (często) lekko nieaktualne dane.

Co to jest write amplification i dlaczego wiele indeksów spowalnia zapisy?

hardperformanceindexeswrite-amplification+1
Otwórz pytanie

Odpowiedź

Write amplification oznacza, że jeden logiczny zapis powoduje wiele zapisów fizycznych: wiersz w tabeli plus każdy indeks, którego dotyczy zmiana (często także WAL/redo logi). Więcej indeksów zwykle przyspiesza odczyty, ale spowalnia insert/update/delete oraz zwiększa koszt miejsca i utrzymania.

Selektywność indeksu: co to jest i czemu ma znaczenie?

easyindexesselectivityperformance+1
Otwórz pytanie

Odpowiedź

Selektywność to informacja, jak dobrze kolumna filtruje wiersze (ile wierszy pasuje do warunku). Indeks o wysokiej selektywności (mało dopasowań) jest bardziej użyteczny, bo baza omija skanowanie dużej liczby wierszy. Kolumny o niskiej selektywności (np. boolean) często niewiele zyskują z samego indeksu.

Dlaczego optymalizator może wybrać zły plan zapytania i jak pomagają statystyki?

mediumoptimizerstatisticscardinality+1
Otwórz pytanie

Odpowiedź

Optymalizator wybiera plan na podstawie estymacji liczby wierszy (cardinality). Jeśli estymacje są złe (stare statystyki, nierówny rozkład danych, skorelowane kolumny), może wybrać złą kolejność joinów albo zły algorytm. Aktualne statystyki (np. ANALYZE) i odpowiednie indeksy pomagają mu lepiej estymować.

Dlaczego `LIKE '%term%'` bywa wolne i jakie są typowe alternatywy?

mediumsqllikeindexes+1
Otwórz pytanie

Odpowiedź

Wildcard na początku (`%term`) często uniemożliwia użycie zwykłego indeksu B-tree, więc baza może skanować dużo wierszy. Alternatywy to indeksy full-text, trigramy (jeśli baza wspiera) albo zmiana zapytania na wyszukiwanie po prefiksie (`term%`), jeśli to możliwe.

Zmiana schematu online: jak zmienić typ kolumny z minimalnym downtime?

hardmigrationsschema-changezero-downtime+1
Otwórz pytanie

Odpowiedź

Użyj podejścia expand/contract: dodaj nową kolumnę, zrób backfill partiami, zapisuj do obu (albo utrzymuj spójność), przełącz odczyt na nową kolumnę, a na końcu usuń starą. Dzięki temu unikasz długich blokujących locków i wdrażasz zmianę bezpiecznie.

Dlaczego długie transakcje są niebezpieczne w bazie na produkcji?

hardtransactionslocksmvcc+2
Otwórz pytanie

Odpowiedź

Długie transakcje mogą długo trzymać locki, blokować inne zapytania i zwiększać contention. W bazach MVCC mogą też blokować sprzątanie starych wersji wierszy, co prowadzi do bloatu. Mogą też zwiększać replication lag i utrudniać recovery po awarii.

Primary key vs unique constraint: jaka jest różnica?

easydatabaseconstraintsprimary-key+1
Otwórz pytanie

Odpowiedź

Primary key jednoznacznie identyfikuje wiersz i zwykle oznacza NOT NULL oraz jeden główny identyfikator na tabelę. Unique constraint także wymusza unikalność, ale możesz mieć ich wiele i w zależności od bazy mogą dopuszczać NULL.

Klucze obce: po co ich używać i jaki jest trade‑off?

mediumdatabaseforeign-keyintegrity+1
Otwórz pytanie

Odpowiedź

Klucze obce wymuszają spójność referencyjną (brak sierot) i ułatwiają reasoning. Trade‑off to dodatkowy koszt zapisu i czasem trudniejsze migracje. W bardzo obciążonych systemach część zespołów waliduje relacje w aplikacji zamiast w bazie.

Kolejność kolumn w indeksie złożonym: dlaczego ma znaczenie?

mediumdatabaseindexescomposite-index+1
Otwórz pytanie

Odpowiedź

Większość baz używa zasady left‑most prefix. Indeks na (A, B, C) przyspiesza zapytania po A lub A,B, ale nie po samym B. Kolejność dobieraj według typowych filtrów i selektywności.

Co to jest covering index (index‑only scan) i czemu bywa szybszy?

mediumdatabaseindexescovering-index+1
Otwórz pytanie

Odpowiedź

Covering index zawiera wszystkie kolumny potrzebne do zapytania, więc baza może odpowiedzieć, używając tylko indeksu bez odczytu wierszy z tabeli. To zmniejsza I/O i bywa dużo szybsze na dużych tabelach.

Deadlock: co to jest i jak bazy go rozwiązują?

mediumdatabasetransactionslocks+1
Otwórz pytanie

Odpowiedź

Deadlock występuje, gdy dwie transakcje czekają na swoje wzajemne locki. Baza wykrywa to i przerywa (rollback) jedną transakcję, aby druga mogła ruszyć. Aplikacja powinna ponowić przerwaną transakcję.

Poziomy izolacji: czym różnią się Read Committed, Repeatable Read i Serializable?

harddatabasetransactionsisolation+1
Otwórz pytanie

Odpowiedź

Read Committed blokuje brudne odczyty, ale dopuszcza non‑repeatable reads. Repeatable Read gwarantuje, że odczytane wiersze się nie zmienią w trakcie transakcji, ale może dopuścić phantom rows. Serializable jest najsurowszy — zachowuje się jakby transakcje działały po kolei, eliminując phantom, kosztem mniejszej współbieżności.

Partitioning vs sharding: jaka jest różnica?

harddatabasepartitioningsharding+1
Otwórz pytanie

Odpowiedź

Partitioning dzieli tabelę na części w obrębie jednej instancji bazy (często dla zarządzania/wydajności). Sharding dzieli dane między wiele serwerów baz danych dla skalowania poziomego. Sharding dodaje złożoność w routingu i zapytaniach między shardami.

Denormalizacja: kiedy warto ją zrobić i jaki jest trade‑off?

mediumdatabasedenormalizationperformance+1
Otwórz pytanie

Odpowiedź

Denormalizacja polega na duplikacji danych, aby przyspieszyć odczyt i ograniczyć joiny. Pomaga w read‑heavy workloadach, ale zwiększa storage, ryzyko niespójności oraz komplikuje zapisy i migracje.

OLTP vs OLAP: jaka jest różnica?

easydatabaseoltpolap+1
Otwórz pytanie

Odpowiedź

OLTP obsługuje wiele małych, krótkich transakcji (workload operacyjny). OLAP wykonuje mniej, ale cięższych zapytań analitycznych na dużych zbiorach (raporty/BI). Różni się projekt schematu, indeksowanie i storage.

Autocommit vs transakcje jawne: kiedy to ma znaczenie?

easydatabasetransactionsautocommit+1
Otwórz pytanie

Odpowiedź

W autocommit każdy statement jest osobną transakcją. Transakcje jawne grupują wiele statementów w jedną atomową całość, co ma znaczenie dla spójności i wydajności (mniej commitów/round‑tripów). Używaj jawnych transakcji przy wieloetapowych zmianach, które muszą się udać lub wycofać razem.