Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dlaczego (i jak) podzielić kolumnę za pomocą master..spt_values?

Cel

Dlaczego używać nieudokumentowanych master..spt-values

Sybase, a co za tym idzie jego bękart, MS SQL, dostarcza różne cechy i funkcje dla produktu, który jest implementowany w procedurach systemowych (w przeciwieństwie do plików binarnych, takich jak sqlserver, które są uruchamiane jako usługa). Te procedury systemowe są napisane w kodzie SQL i nazwane sp_%. Z wyjątkiem niektórych tajnych elementów wewnętrznych, mają one takie same ograniczenia i potrzeby, jak każdy inny kod SQL. Są one częścią produktu Sybase ASE lub SQL Server. W związku z tym nie są wymagane udokumentować to; a wewnętrzne bity nie mogą być rozsądnie oznaczone jako „nieudokumentowane”.

master..spt_values zawiera wszystkie różne bity i fragmenty, których wspomniane procedury systemowe potrzebują, w tabeli SQL, do tworzenia różnych raportów. sp oznacza procedurę systemową; spt oznacza tabele procedur systemowych; i oczywiście values jest treść.

Tabele przeglądowe

Co to jest (znaczenie) Type =„P”

Ludzie często opisują spt_values jako „zdenormalizowane”, ale jest to błędny termin. Prawidłowy termin to złożony lub pakowane . Jest to około 26 logicznych tabel Lookup, każda pięknie znormalizowana, złożona w jedną fizyczną tabelę, z Type kolumna, aby rozróżnić tabele logiczne.

Teraz w normalnej bazie danych byłby to poważny błąd (po prostu spójrz na odpowiedzi dla "jedna tabela przeglądowa lub wiele"). Ale w katalogu serwerów pożądane jest zastąpienie 26 tabel fizycznych.

  • "L" oznacza LockType Lookup; „V” oznacza DeviceType Lookup (V jest skrótem od Device w całym serwerze); itd. Typ „P2” zawiera liczby porządkowe bitowe, do rozszerzenia bitów, które są pakowane do INT.

  • Zestaw kolejnych liczb w znanych granicach, który jest dostępny w postaci tabeli SQL, jest wymagany do wykonania Projekcji, co musi wykonać wiele procedur systemowych. Typ „P” to lista kolejnych liczb od 0 do 2047.

  • Termin Projekcja jest tu używane jako technicznie precyzyjne znaczenie, naturalny sens logiczny, a nie znaczenie algebry relacyjnej, co jest nienaturalne.

Dlatego istnieje tylko jeden cel dla spt_values, zawierać 26 złożonych, w przeciwnym razie oddzielnych, tabel referencyjnych i jedną tabelę projekcyjną.

Rozbudowa

Zwykłe użycie spt_values wtedy jest zwykłym odnośnikiem lub odnośnikiem lub ENUM stół. Po pierwsze, wartości wyszukiwania:

    SELECT *                    -- list Genders
        FROM Gender 

Jest używany w taki sam sposób, w jaki Person ma kod płci, który musi zostać rozszerzony (bardzo rozbudowany, te dziwaczne dni):

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

Np. sp_lock generuje raport o aktywnych blokadach, wyświetlając typy blokad jako ciąg names . Ale master..syslocks zawiera typy blokad jako liczby , nie zawiera tych nazw; a gdyby tak było, byłby to bardzo zdenormalizowany stół! Jeśli wykonasz zapytanie (kod Sybase ASE, będziesz musiał dokonać konwersji):

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

zauważysz 66 LockType liczby i imiona w tabeli przeglądowej. To pozwala sp_lock do wykonania prostego kodu, takiego jak Person::Płeć powyżej:

    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

Projekcja

Co to jest (znaczenie) Type =„P”?

Co to jest projekcja i jak jest używana?

Załóżmy na przykład, że zamiast aktywnych blokad utworzonych przez powyższe zapytanie chcesz otrzymać listę wszystkich 66 LockTypes, pokazujące liczbę aktywnych blokad (lub Null). Nie potrzebujesz kursora ani WHILE pętla. Moglibyśmy projektować tabela LockType Lookup, do liczba aktywnych blokad:

    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"

Metod jest kilka, to jest tylko jedna. Inną metodą jest użycie tabeli pochodnej zamiast podzapytania. Ale nadal potrzebujesz projekcji.

To zazwyczaj spt_values służy do rozszerzenia lub projekcji. Teraz, gdy już wiesz, że tam jest, możesz go również użyć. Jest bezpieczny (w master bazy danych) i używane przez praktycznie wszystkie procedury systemowe, co oznacza, że ​​procedury systemowe nie mogą działać bez niego.

za podzielenie kolumny?

Ach, nie rozumiesz kodu „Podziel jedną kolumnę CSV na wiele wierszy”.

  • Zapomnij o spt_values przez chwilę i ponownie sprawdź ten kod. Potrzebuje tylko listy kolejnych liczb, aby można było przeglądać listę wartości w kolumnie CSV bajt po bajcie. Kod jest aktywowany tylko dla każdego bajtu, który jest przecinkiem lub końcem łańcucha.

  • Skąd wziąć zestaw kolejnych liczb w postaci tabeli SQL, zamiast TWORZEĆ ją od podstaw i WSTAWIĆ do niej? Dlaczego, master..spt_values oczywiście. Jeśli wiesz, że tam jest.

  • (Możesz dowiedzieć się trochę o wewnętrznych elementach ASE lub SQL Server, po prostu czytając kod procedur składowanych w systemie.)

  • Zwróć uwagę, że każde pole CSV w jednej kolumnie jest dużym błędem normalizacji, łamie 2NF (zawiera powtarzające się wartości) i 1NF (nie atomowe). Uwaga, że ​​nie jest zapakowany ani złożony, jest to powtarzająca się grupa, jest nieznormalizowana. Jedną z wielu negatywnych konsekwencji takiego rażącego błędu jest to, że zamiast używać prostego SQL do nawigowania po powtarzającej się grupie jako wierszy, trzeba użyć złożonego kodu, aby określić i wyodrębnić zawartość nieznormalizowanego pola CSV. Tutaj spt_values P dostarcza wektor dla tego złożonego kodu, co ułatwia.

Jaka jest z tego korzyść?

Myślę, że na to odpowiedziałem. Gdybyś go nie miał, każda procedura systemowa, która wymaga listy liczb, musiałaby TWORZYĆ tabelę tymczasową; i WSTAW w nią wiersze; przed uruchomieniem swojego kodu. Oczywiście brak konieczności wykonywania tych czynności znacznie przyspiesza procedury systemowe.

Teraz, gdy trzeba wykonać projekcję, np. dat kalendarzowych w przyszłości lub gdziekolwiek, możesz użyć spt_values , zamiast za każdym razem tworzyć własną tabelę tymczasową (lub tworzyć własną prywatną tabelę stałą i utrzymywać ją).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. podstawowa wstawka zbiorcza pyodbc

  2. Dlaczego wykonywanie procedur składowanych jest szybsze niż zapytanie SQL ze skryptu?

  3. Zakres tabel tymczasowych w SQL Server

  4. Skanowanie wstecz indeksu SQL Server:zrozumienie i dostrajanie wydajności

  5. Jak zaktualizować z SELECT w SQL Server