sql >> Database teknologi >  >> RDS >> Sqlserver

Indekseringsydelse BigInt vs VarChar

Du bør BESINDT introducere en surrogat INT IDENTITY() primær nøgle!!INT giver dig allerede potentielt op til 2 milliarder rækker - er det ikke nok??

Denne primære nøgle / klyngede nøgle på SQL Server vil være op til 64 bytes i størrelse (i stedet for 4, for en INT) - hvilket vil få dit klyngede indeks OG alt dit ikke-klyngede indeks til at blive oppustet til ukendelighed. Hele klyngingsnøglen (alle dine 8 kolonner) vil blive inkluderet på hver enkelt side i hvert enkelt ikke-klyngede indeks på den tabel - spilder helt sikkert masser af plads.

Så på en given indekstabel ville du have op til 16 gange flere poster med en surrogat INT-klyngenøgle - det betyder meget mindre I/O, meget mindre spildtid på at læse indekssider.

Og forestil dig bare, at du prøver at etablere et fremmednøgleforhold til den tabel.... enhver underordnet tabel skal have alle 8 kolonner af din primære nøgle som fremmednøglekolonner, og angiv alle 8 kolonner i hver join - hvilket mareridt!

Ved 78 millioner rækker vil selv blot at ændre klyngingsnøglen til INT IDENTITY spare dig for op til 60 bytes pr. række - det alene ville vise sig at være op til 4 GByte diskplads (og RAM-forbrug på din server). Og det begynder ikke engang at beregne besparelserne på de ikke-klyngede indeks.......

Og selvfølgelig, ja, jeg ville også ændre VARCHAR(10) til INT eller BIGINT - hvis det er et tal, så gør feltet til numerisk - det giver ingen mening at lade det være på VARCHAR(10), egentlig. Men det alene kommer ikke til at gøre den store forskel med hensyn til hastighed eller ydeevne - det gør bare arbejdet med dataene så meget nemmere (du behøver ikke altid at bruge numeriske typer, når du f.eks. sammenligner værdier og så videre).

Marc



  1. Hvad forårsager PDO-fejl Kan ikke udføre forespørgsler, mens andre ubuffrede forespørgsler er aktive?

  2. PHP og indkapsling af MySQL-rækker i et JSON-array

  3. Oprettelse af databasevedligeholdelsesplaner

  4. Kan jeg give adgang til databaser med præfiks og derefter wild card?