Heap tabeller i Heap Server

i det sidste indlæg i denne blog serie, jeg diskuterede, hvad en B-Tree indeks var og kort forklaret sin historie.

før vi dykker ned i de indekser, som vi bruger, er det vigtigt at sætte grundlaget for datastrukturer. Den mest grundlæggende tabel, du kan oprette, er en bunke. En bunke er en usorteret struktur af sider, der ikke er knyttet til hinanden.

Hvornår skal du bruge dynger?

anbefalingen om bedste praksis er i de fleste tilfælde at undgå serverhauger. Kimberly Tripp forklarer nogle af grundene og debatten her, men jeg vil dække det høje niveau. Dynger, der er den mest basale lagringsstruktur, mangler funktioner, der forbedrer ydeevnen for normale (OLTP) arbejdsbelastninger. Nogle hævder, at dynger er bedre til uddrag, transformation og indlæsning (ETL) operationer, fordi der er færre sider at vedligeholde under skriveoperationer (opdatering/Indsæt/Slet). Specifikt kan dynger være hurtigere end et B-træ-indeks, hvis sideopdelinger forekommer, og mange niveauer af indekset skal opdateres. Derudover er rækkeidentifikatoren (RID), der diskuteres mere nedenfor, kun 8 byte. Dette kan fungere bedre end et grupperet indeks med mange nøglekolonner, fordi ikke-grupperede indekser skal gemme den grupperede nøgle eller RID for hver indekseret række. Typisk anbefaler jeg at bruge et grupperet indeks (mere på grupperede indekser, når vi fortsætter denne serie) snarere end en bunke, men hvis du bruger dem, skal du kun bruge dem, når du har bevist, at de vil være mere effektive end et grupperet indeks. Efter at have diskuteret en bunke struktur, vil jeg skitsere præstationsproblemerne ved at bruge dynger.

bunke struktur

en bunke er en gruppering af usorterede sider, som ikke er forbundet. Sideanatomi er uden for denne serie, da alle typer indekserede og ikke-indekserede tabeller bruger den samme sidestruktur, men jeg opfordrer dig til at tjekke her og her for at lære mere.

en bunke består af en eller flere indekstildelingskort (iam) sider, der peger på de datasider, der udgør bunken. Den eneste undtagelse fra dette er, når du har en række, der er blevet opdateret og ikke kunne passe ind i sin side længere. I så fald får du en videresendelsesmarkør til rækken, der er flyttet til en eksisterende side med mellemrum eller en ny side. Det er muligt for dig at producere en kæde af videresendelsesposter, hvis rækken fortsat har brug for flytning ved yderligere operationer.

heap-structure-1

billedreference: MSDN

en bunke har en række i sys.partitioner pr. partition og dens indeks_id vil være lig med nul. I denne post peger first_iam_page på den første af indeksallokeringskortet (iam) sider. En IAM-side kortlægger sider for hver tildelingsenhed og administrerer 4 GB bidder af tabellen. Tildelingsenheder inkluderer:

  1. in__dataallokeringsenhed
  2. LOB_DATAALLOKERINGSENHED
  3. række_overløbs_dataallokeringsenhed

IAM-siden indeholder standard 96-byte-overskriften efterfulgt af IAM-overskriften. IAM-overskriften begynder med otte slots til tildeling af blandet omfang og derefter et 8000-byte bitkort for at finde ensartede omfang tildelt tabellen.

en blandet udstrækning er en, der indeholder sider fra mere end en tabel. Dette kaldes også et fælles omfang. Formålet med en blandet udstrækning er at spare plads med tabeller, der er mindre end 64 KB. En ensartet udstrækning er en, hvor alle sider i omfanget hører til den enkelte tabel.

mixed-extent

billedreference: omfanget

for at undersøge vores iam-side skal vi først finde den.

DBCC IND (‘demo’,’dbo.demo’,1)

dbcc-ind

med DBCC IND har vi 17 data sider og 1 IAM side. Iam-sider henviser ikke til sig selv, derfor er IAMFID (iam file Id) og IAMPID (iam page Id) NULL. Dette betyder, at vores IAM-side er i fil-Id (PageFID) 1 og er side-Id (PagePID) 297. DBCC-side giver os mulighed for at se vores iam-side.

DBCC TRACEON(3604);

DBCC side (‘demo’,1,297,3);

dbcc-page-iam

i gult er der otte enkeltsidetildelinger i vores blandede omfang. I ORANGE vises de ensartede udstrækninger i intervaller.

Performance implikationer

udførelse af forskellige data manipulation language (DML) operationer på en bunke har disse påvirker.

  • indsæt – nye rækker kan placeres på den første tilgængelige side med tilstrækkelig plads. Så når en ny række indsættes, vil den sandsynligvis blive tilføjet til den sidste side.
  • opdatering – rækker kan forblive på den samme side, hvis den passer på siden efter opdateringen, hvis ikke fjernes den fra den aktuelle side og placeres på den første tilgængelige side med tilstrækkelig plads, og der skrives en videresendelsesmarkør på dens oprindelige side.
  • Slet – Data overskrives ikke, plads er bare markeret som tilgængelig til genbrug. Dette kan få dit bord til at forbruge betydeligt mere diskplads end nødvendigt.
  • vælg – en tabelscanning på hele tabellen skal læses for de fleste forespørgsler. Undtagelsen herfra er, når der er et passende ikke-grupperet indeks tilgængeligt. Vi vil diskutere ikke-grupperede indekser senere i denne serie.

læser

uden noget understøttende indeks kræver en bunke en fuld tabelscanning for enhver forespørgsel. Dette skyldes, at den fysiske struktur ikke er sorteret, og at der ikke er nogen sidelink til understøttelse af områdescanninger.

sæt statistik IO på

DBCC IND (‘demo’,’dbo.demo’,1)

vælg COUNT ( * )
fra dbo.demo

gentagelse af vores DBCC IND-kommando ovenfra minder os om, at vi har 18 sider til denne tabel. 17 data sider og 1 IAM side.

–fjernet DBCC IND resultater, fordi det allerede er vist ovenfor.
-18 række resultat, angiver 18 sider.

(18 række(r) berørt)
DBCC-udførelse afsluttet. Hvis DBCC udskrev fejlmeddelelser, skal du kontakte systemadministratoren.

Rækketælling
—-
5031
(1 berørte række(r)

tabel ‘Demo’. Scan tæller 1, logiske læser 17, fysiske læser 0, read-ahead læser 0, lob logisk læser 0, lob fysisk læser 0, lob read-ahead læser 0.
(1 række(r) berørt)

Bemærk De 17 logiske læser fra vores forespørgsel. Dette skyldes, at IAM-siden ikke tælles i den logiske aflæsning, og vi udførte en fuld scanning af tabellen med 18 sider.

skriver og videresender pointers

som nævnt ovenfor er indsatser og sletninger ret ligetil. En indsats forekommer på den første side med ledig plads, selvom det betyder oprettelse af en ny side. Sletninger udføres ved at de-allokere det rum, rækken besatte.

opdateringer er, hvor tingene går ned ad bakke for dynger. Når en datatype med fast længde opdateres, vil opdateringen ske på stedet. Hvis en datatype med variabel længde opdateres, og længden er steget, er der en chance for, at rækken ikke længere passer på den samme side. Når rækken ikke længere passer, sættes en videresendelsesmarkør i det rum, hvor den oprindelige række var, og rækken flyttes til en ny side. Denne proces har en negativ indvirkning på læseydelsen. Lad os demonstrere.

oprindeligt alle vores poster i dbo.demo tabel indeholdt VARCHARs med 9 tegn strenge.

Vælg TOP 5 *
fra dbo.demo

demo tabeldata

for at oprette nogle fremadrettede pointers opdaterer vi alle vores rækker og øger længden af varlen-kolonnen.

opdatering dbo.demo
sæt varLen = replikere (‘en’,100)

vi har nu 95 sider i vores bunke, fordi alle vores rækker er blevet flyttet til nye sider med fremadrettede peger efterladt.

DBCC IND (‘demo’,’dbo.demo’,1)

dbcc-output-1

som du kan forestille dig, med dynger, der kræver fuld tabelscanninger, bliver vi nødt til at læse mange flere sider for den samme mængde poster nu.

Indstil statistik IO på

vælg COUNT(*)
fra dbo.demo
(1 række (r) berørt)

tabel ‘Demo’. Scan count 1, logisk læser 4405, fysisk læser 0, read-ahead læser 0, lob logisk læser 0, lob fysisk læser 0, lob read-ahead læser 0.

vores læsninger steg drastisk, fordi de originale sider skulle læses, og derefter skulle de fremadrettede henvisninger følges. Præstationspåvirkningen og spild af plads i hukommelsen og på disken er derfor, vi har brug for grupperede indekser.

næste gang

heap-datastrukturen er ikke et indeks og er ofte den dårligst fungerende datastruktur for dine tabeller i Heap-serveren. Vi dækkede det i dag som et fundament for forståelse, som vil være nyttigt, når vi diskuterer indekser. I den næste del af denne serie vil grupperede indekser, en B+-træstruktur for tabeldata, blive dækket.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.