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

Hvorfor (og hvordan) opdele kolonne ved hjælp af master..spt_values?

Formål

Hvorfor bruge udokumenterede master..spt-values

Sybase, og derfor dens bastard-søn MS SQL, leverer forskellige funktioner og funktioner til produktet, som er implementeret i systemprocedurer (i modsætning til binære filer som sqlserver, der startes som en service). Disse systemprocedurer er skrevet i SQL-kode og hedder sp_%. Bortset fra nogle hemmelige interne funktioner, har de de samme begrænsninger og behov som enhver anden SQL-kode. De er en del af Sybase ASE- eller SQL Server-produktet. Som sådan er de ikke påkrævede at dokumentere det; og de interne bits kan ikke med rimelighed mærkes som "udokumenterede".

master..spt_values indeholder alle de forskellige bits og stykker, som de nævnte systemprocedurer har brug for, i en SQL-tabel, for at producere de forskellige rapporter. sp betyder systemprocedure; spt betyder tabeller til systemprocedurer; og selvfølgelig values er indholdet.

Opslagstabeller

Hvad er (betydningen af) Type ='P'

Folk beskriver ofte spt_values som "de-normaliseret", men det er det forkerte udtryk. Det korrekte udtryk er foldet , eller pakket . Det er 26 eller deromkring logiske opslagstabeller, hver smukt normaliseret, foldet til én fysisk tabel med en Type kolonne for at differentiere de logiske tabeller.

Nu i en normal database ville det være en grov fejl (se bare svarene for "én opslagstabel eller mange"). Men i et serverkatalog er det ønskeligt, det erstatter 26 fysiske tabeller.

  • "L" står for LockType Lookup; "V" står for DeviceType Lookup (V er en forkortelse for Device overalt på serveren); osv. Type "P2" indeholder bitvise ordinaler til udvidelse af bits, der er pakket ind i en INT.

  • Et sæt af fortløbende tal inden for kendte grænser, der er tilgængelige i form af en SQL-tabel, er påkrævet for at udføre en projektion, hvilket mange af systemprocedurerne skal udføre. Type "P" er en liste over fortløbende tal mellem 0 og 2047.

  • Udtrykket Projektion bruges her som den teknisk præcise betydning, den naturlige logiske betydning, ikke den relationelle algebra-betydning, som er unaturlig.

Der er derfor kun ét formål med spt_values, skal indeholde 26 foldede, ellers separate, referencetabeller og et projektionsbord.

Udvidelse

Den almindelige brug af spt_values så er det som et almindeligt opslag eller reference eller ENUM bord. Først opslagsværdierne:

    SELECT *                    -- list Genders
        FROM Gender 
 

Det bruges på samme måde, som Person har en kønskode, der skal udvides (meget udvidet, disse freaky dage):

    SELECT  P.*,                -- list Person
            G.Name              -- expand GenderCode to Name
        FROM Person P
        JOIN Gender G
            ON P.GenderCode = G.GenderCode
 

For eksempel. sp_lock producerer en rapport over aktive låse, der viser låsetyper som streng navne . Men master..syslocks indeholder låsetyper som numre , den indeholder ikke disse navne; og hvis det gjorde det, ville det være et dårligt denormaliseret bord! Hvis du udfører forespørgslen (Sybase ASE-kode, skal du konvertere):

    SELECT *                    -- list LockTypes
        FROM master..spt_values 
        WHERE type = "L"
 

du vil bemærke 66 LockType numre og navne i opslagstabellen. Det tillader sp_lock at udføre simpel kode som Person::Køn ovenfor:

    SELECT  spid,               -- list Active Locks
            DB_NAME(dbid),
            OBJECT_NAME(id, dbid),
            v.name,             -- expand lock name
            page,
            row
    FROM master..syslocks   L,
         master..spt_values LT
    WHERE L.type = LT.number    -- 
    AND   type = "L"            -- LockType Lookup table
    ORDER by 1, 2, 3, 4, 5, 6   -- such that perusal is easy
 

Projektion

Hvad er (betydningen af) Type ='P'?

Hvad er projektion, og hvordan bruges det?

Lad os f.eks. sige, at du i stedet for de aktive låse produceret af forespørgslen ovenfor ville have en liste over alle 66 LockTypes, der viser antallet af aktive låse (eller Null). Du behøver ikke en markør eller en WHILE sløjfe. Vi kunne projektere LockType Lookup-tabellen, gennem antallet af aktive låse:

SELECT LT.name, -- list LockTypes [Count] = ( -- with count SELECT COUNT(*) FROM master..syslocks WHERE type = LT.number ) FROM master..spt_values LT WHERE type = "L"

Der er flere metoder, det er kun én. En anden metode er at bruge en afledt tabel i stedet for underforespørgslen. Men du har stadig brug for projektionen.

Det er typisk hvad spt_values bruges til enten udvidelse eller projektion. Nu hvor du ved, at den er der, kan du også bruge den. Det er sikkert (i master). database) og bruges af stort set alle systemprocedurer, hvilket betyder, at systemprocedurerne ikke kan køre uden.

for at opdele en kolonne?

Ah, du forstår ikke koden "Opdel en CSV-kolonne i flere rækker".

  • Glem alt om spt_values et øjeblik, og undersøg koden igen. Den har bare brug for en liste over fortløbende tal, så den kan gå gennem listen over værdier i CSV-kolonnen, byte for byte. Koden aktiveres kun for hver byte, der er et komma eller enden af ​​strengen.

  • Hvor får man et sæt fortløbende tal i form af en SQL-tabel, i stedet for at OPRETTE en fra bunden og INDSÆTTE i den? Hvorfor, master..spt_values selvfølgelig. Hvis du ved, at den er der.

  • (Du kan lære lidt om det interne i ASE eller SQL Server, blot ved at læse koden for de systemlagrede procedurer.)

  • Bemærk, at ethvert CSV-felt i én kolonne er en grov normaliseringsfejl, det bryder 2NF (indeholder gentagne værdier) og 1NF (ikke atomare). Bemærk, det er ikke pakket eller foldet, det er en gentagende gruppe, det er unormaliseret. En af de mange negative konsekvenser af en sådan grov fejl er, i stedet for at bruge simpel SQL til at navigere i den gentagende gruppe som rækker, skal man bruge kompleks kode til at bestemme og udtrække indholdet af det ikke-normaliserede CSV-felt. Her spt_values P giver en vektor for den komplekse kode, hvilket gør det nemmere.

Hvad er fordelen ved det?

Det tror jeg, jeg har svaret på. Hvis du ikke havde det, ville hver systemprocedure, der kræver en liste med tal, skulle OPRET en midlertidig tabel; og INDSÆT rækkerne i den; før du kører dens kode. Det gør naturligvis systemprocedurerne meget hurtigere, hvis du ikke behøver at udføre disse trin.

Når du nu skal udføre en projektion, f.eks. kalenderdatoer i fremtiden, eller hvad som helst, du kan bruge spt_values , i stedet for at skulle oprette din egen midlertidige tabel hver gang (eller oprette din egen private permanente tabel og vedligeholde den).



  1. Microsoft Access Table Tips – Tricks og retningslinjer del III

  2. SQL-server AlwaysOn-tilgængelighedsgrupper:Installation og konfiguration. Del 2

  3. I Postgresql, fremtving unik på kombination af to kolonner

  4. Matchende algoritme i SQL