Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Warum (und wie) Spalten mit master..spt_values ​​teilen?

Zweck

Warum undokumentierte master..spt-values verwenden

Sybase und damit auch sein Bastardsohn MS SQL stellen diverse Features und Funktionen für das Produkt zur Verfügung, das in Systemprozeduren implementiert ist (im Gegensatz zu Binärdateien wie sqlserver, die als Dienst gestartet werden). Diese Systemprozeduren sind in SQL-Code geschrieben und heißen sp_%. Abgesehen von einigen geheimen Interna haben sie die gleichen Einschränkungen und Anforderungen wie jeder andere SQL-Code. Sie sind Teil des Produkts Sybase ASE oder SQL Server. Als solche sind sie nicht erforderlich um es zu dokumentieren; und die internen Bits können nicht vernünftigerweise als "undokumentiert" bezeichnet werden.

master..spt_values enthält alle verschiedenen Bits und Teile, die die besagten Systemprozeduren in einer SQL-Tabelle benötigen, um die verschiedenen Berichte zu erstellen. Der sp bedeutet Systemprozedur; spt bedeutet Tabellen für Systemprozeduren; und natürlich values ist der Inhalt.

Nachschlagetabellen

Was ist die (Bedeutung von) Type ='P'

Leute beschreiben oft spt_values als "denormalisiert", aber das ist der falsche Begriff. Der richtige Begriff ist gefaltet , oder gepackt . Es sind etwa 26 logische Nachschlagetabellen, jede schön normalisiert, in eine physische Tabelle gefaltet, mit einem Type Spalte zur Unterscheidung der logischen Tabellen.

In einer normalen Datenbank wäre das ein grober Fehler (sehen Sie sich einfach die Antworten für "eine Nachschlagetabelle oder viele" an). Aber in einem Serverkatalog ist es wünschenswert, dass er 26 physische Tabellen ersetzt.

  • „L“ steht für LockType Lookup; "V" steht für DeviceType Lookup (V ist die Abkürzung für Device im gesamten Server); usw. Typ "P2" enthält bitweise Ordnungszahlen, zur Erweiterung von Bits, die in ein INT gepackt werden.

  • Zur Durchführung einer Projektion, die viele Systemprozeduren leisten müssen, wird ein Satz fortlaufender Zahlen innerhalb bekannter Grenzen benötigt, der in Form einer SQL-Tabelle vorliegt. Typ "P" ist eine Liste fortlaufender Nummern zwischen 0 und 2047.

  • Der Begriff Projektion wird hier als die technisch präzise Bedeutung verwendet, der natürliche logische Sinn, nicht die Bedeutung der relationalen Algebra, die unnatürlich ist.

Es gibt daher nur einen Zweck für spt_values, 26 gefaltete, ansonsten separate Referenztische und einen Projektionstisch enthalten.

Erweiterung

Die normale Verwendung von spt_values dann ist es eine gewöhnliche Suche oder Referenz oder ENUM Tisch. Zuerst die Lookup-Werte:

    SELECT *                    -- list Genders
        FROM Gender 

Es wird auf die gleiche Weise verwendet, dass Person einen GenderCode hat, der erweitert werden muss (sehr erweitert, heutzutage):

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

Z.B. sp_lock erzeugt einen Bericht über aktive Sperren und zeigt Sperrtypen als Namen an . Aber master..syslocks enthält Sperrtypen als Zahlen , enthält es diese Namen nicht; und wenn ja, wäre es eine schlecht denormalisierte Tabelle! Wenn Sie die Abfrage ausführen (Sybase ASE-Code, müssen Sie konvertieren):

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

Sie werden 66 LockType Zahlen bemerken und Namen in der Nachschlagetabelle. Das erlaubt sp_lock um einfachen Code wie Person::Gender oben auszuführen:

    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

Was ist die (Bedeutung von) Type ='P' ?

Was ist Projektion und wie wird sie verwendet?

Angenommen, Sie wollten anstelle der aktiven Sperren, die von der obigen Abfrage erzeugt wurden, eine Liste von allen 66 LockTypes, zeigt die Anzahl der aktiven Sperren (oder Null). Sie brauchen keinen Cursor oder ein WHILE Schleife. Wir könnten Projektieren die LockType Lookup-Tabelle, bis die Anzahl aktiver Sperren:

    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"

Es gibt mehrere Methoden, das ist nur eine. Eine andere Methode besteht darin, anstelle der Unterabfrage eine abgeleitete Tabelle zu verwenden. Aber Sie brauchen immer noch die Projektion.

Das ist normalerweise spt_values wird entweder für Expansion oder Projektion verwendet. Jetzt, da Sie wissen, dass es da ist, können Sie es auch verwenden. Es ist sicher (im master Datenbank) und wird von praktisch allen Systemprozeduren verwendet, was bedeutet, dass die Systemprozeduren ohne sie nicht ausgeführt werden können.

zum Teilen einer Spalte?

Ah, Sie verstehen den Code "Eine CSV-Spalte in mehrere Zeilen aufteilen" nicht.

  • Vergessen Sie spt_values für einen Moment, und untersuchen Sie diesen Code erneut. Es benötigt nur eine Liste mit fortlaufenden Nummern, damit in die Liste der Werte in der CSV-Spalte Byte für Byte durchlaufen kann. Der Code wird nur für jedes Byte aktiviert, das ein Komma oder das Ende einer Zeichenfolge ist.

  • Woher bekomme ich eine Reihe fortlaufender Nummern in Form einer SQL-Tabelle, anstatt eine von Grund auf neu zu erstellen und einzufügen? Warum, master..spt_values selbstverständlich. Wenn Sie wissen, dass es da ist.

  • (Sie können etwas über die Interna von ASE oder SQL Server lernen, indem Sie einfach den Code der gespeicherten Systemprozeduren lesen.)

  • Beachten Sie, dass jedes CSV-Feld in einer Spalte ein grober Normalisierungsfehler ist, es unterbricht 2NF (enthält sich wiederholende Werte) und 1NF (nicht atomar). Beachten Sie, dass es nicht gepackt oder gefaltet ist, es ist eine sich wiederholende Gruppe, es ist nicht normalisiert. Eine der vielen negativen Folgen eines solchen groben Fehlers besteht darin, dass man anstelle von einfachem SQL zum Navigieren durch die sich wiederholende Gruppe als Zeilen komplexen Code verwenden muss, um den Inhalt des nicht normalisierten CSV-Felds zu bestimmen und zu extrahieren. Hier spt_values P bietet einen Vektor für diesen komplexen Code und macht es einfacher.

Was ist der Vorteil davon?

Ich glaube, das habe ich beantwortet. Wenn Sie es nicht hätten, müsste jede Systemprozedur, die eine Liste von Zahlen benötigt, eine temporäre Tabelle ERSTELLEN; und füge die Zeilen ein; bevor der Code ausgeführt wird. Da diese Schritte nicht ausgeführt werden müssen, werden die Systemvorgänge natürlich viel schneller.

Wenn Sie nun eine Projektion durchführen müssen, z. Kalenderdaten in der Zukunft oder was auch immer, Sie können spt_values verwenden , anstatt jedes Mal Ihre eigene temporäre Tabelle erstellen zu müssen (oder Ihre eigene private permanente Tabelle erstellen und pflegen).