HOBT – hierarchia porządku danych
Dane w SQL Serverze nie leżą luzem. Tworzą drzewa, a ich gałęzie prowadzą do stron danych.
HOBT (Heap Or B-Tree) to jednostka składowania stojąca za każdym indeksem B-tree i za każdą tabelą heap (bez klastrowanego).
To „szkielet” porządku i adresowania danych — od korzenia (root), przez poziomy pośrednie, aż po liście (leaf).
„Struktura jest formą istnienia porządku.” — SQLManiak
🧩 Co to jest HOBT w praktyce?
Każda partycja indeksu lub heap’a = jeden HOBT
(tabela 1-partycja i 3 indeksy ⇒ 4 HOBT; tabela 4-partycje i 2 indeksy ⇒ 8 HOBT).
HOBT ≠ indeks jako obiekt — to fizyczne drzewo/układ stron i przydziałów dla danej partycji indeksu/heap’a.
🆔 Identyfikator HOBT: hobt_id — stabilny w czasie istnienia, ale może się zmienić po niektórych operacjach odbudowy/przebudowy.
📦 HOBT a jednostki przydziału (Allocation Units)
Każdy HOBT może mieć do 3 allocation units:
- IN_ROW_DATA – wiersze mieszczące się w 8 KB strony,
- ROW_OVERFLOW_DATA – dane przepełnione (kolumny
VARCHAR/NVARCHAR/VARBINARYprzekraczające limit wiersza), - LOB_DATA – obiekty LOB (
XML,(N)TEXT*,VARBINARY(MAX)itp.).
📎 Powiązanie:sys.allocation_units.container_id = sys.partitions.hobt_id
🌲 Heapy vs B-tree — co się różni?
Heap:
- brak klucza klastra,
- liściem są strony danych nieposortowane logicznie,
- możliwe forwarded records (przekierowania) przy aktualizacjach zwiększających rozmiar wiersza.
B-tree (index):
- uporządkowana struktura,
- liść klastrowanego indeksu = strony danych tabeli,
- liść nieklastrowanego = strony z kluczami + wskaźniki (
RIDlub klucz klastra).
🗺️ Mapka stron i metadane
Metadane i mapy:PFS (Page Free Space), GAM/SGAM (alokacje extentów), IAM (Index Allocation Map) — spinają HOBT z przydzielonymi stronami.
Diagnostyka drzewa:
sys.dm_db_index_physical_stats– poziomy, fragmentacja, forwarded,sys.dm_db_database_page_allocations– szczegóły alokacji (nieudokumentowane),DBCC PAGE/IND– głębokie nurkowanie (nieudokumentowane).
🔍 Szybkie DMV: HOBT w Twojej bazie
📘 Przegląd HOBT-ów
| |
📊 Poziomy drzewa i statystyki fizyczne
| |
🔦 Które heapy mają przekierowane wiersze?
| |
🧪 Lab: zobacz HOBT w działaniu (kopiuj–wklej)
| |
🔎 Po przejściu z heap’a na indeks klastrowany układ stron i identyfikatory mogą się zmienić (
hobt_id). To normalne.
🧭 Lokalizacja fizyczna wiersza (RID / klucz klastra)
| |
A jeśli chcesz iść głębiej (na labie, ostrożnie w prod):
| |
🚨 Typowe „zapachy” i szybkie remedia
1️⃣ Heap z forwarded records
- Objaw:
forwarded_record_count > 0 - Skutek: dodatkowe skoki stron = gorsze I/O
- Remedium: przebudowa do klastrowanego,
ALTER TABLE ... REBUILDlub zaprojektowanie klucza klastra.
2️⃣ Zbyt głębokie drzewo
- Objaw:
index_levelwysoki,page_countduży - Skutek: więcej odczytów pośrednich
- Remedium: przegląd klucza,
fillfactor, partycjonowanie, kompresja stron.
3️⃣ Nadmiar ROW_OVERFLOW / LOB
- Objaw: duże
ROW_OVERFLOW_DATA/LOB_DATAwsys.allocation_units - Skutek: dodatkowe skoki przy odczycie
- Remedium: skrócenie kolumn, separacja rzadko używanych, kompresja.
🧰 Checklista DBA (HOBT-aware)
- Inwentaryzacja HOBT (
sys.partitions+sys.allocation_units) - Poziomy i fragmentacja (
sys.dm_db_index_physical_stats) - Heapy z przekierowaniami — szybka lista do przebudowy
- Rozmiary AU (
IN_ROW_DATA/ROW_OVERFLOW_DATA/LOB_DATA) - Plan przebudów (
REBUILD/REORGANIZE) - Monitoring w Grafanie: metryki
page_count,forwarded,avg_page_space
🧩 Przykładowy widok: dbo.vHobtHealth
| |
🧭 Podsumowanie
HOBT to punkt, w którym logika indeksu spotyka się z fizyką stron.
Rozumiejąc hobt_id i powiązane allocation units:
- wiesz, gdzie Twoje wiersze naprawdę żyją,
- potrafisz diagnozować forwarded records, głębokość drzewa i fragmentację,
- projektujesz klucze klastrowane i partycje świadomie.
🔧 TL;DR – narzędziówka
| Cel | DMV / Funkcja |
|---|---|
| Powiązanie stron | sys.partitions.hobt_id ⇄ sys.allocation_units.container_id |
| Statystyki fizyczne | sys.dm_db_index_physical_stats |
| Alokacje stron | sys.dm_db_database_page_allocations |
| Lokalizacja wiersza | %%physloc%%, fn_PhysLocFormatter |
| Diagnostyka stron (lab) | DBCC IND, DBCC PAGE |