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ą).