Microsoft SQL Server
Przechowywanie JSON w tabelach SQL
Szukaj…
JSON zapisany jako kolumna tekstowa
JSON jest formatem tekstowym, więc jest przechowywany w standardowych kolumnach NVARCHAR. Kolekcja NoSQL jest równoważna z dwiema tabelami wartości kluczy:
CREATE TABLE ProductCollection (
Id int identity primary key,
Data nvarchar(max)
)
Użyj nvarchar(max)
ponieważ nie masz pewności, jaki byłby rozmiar twoich dokumentów JSON. nvarchar(4000)
i varchar(8000)
mają lepszą wydajność, ale z limitem wielkości do 8 KB.
Upewnij się, że JSON jest poprawnie sformatowany przy użyciu ISJSON
Ponieważ JSON jest przechowywany w kolumnie tekstowej, możesz chcieć upewnić się, że jest on poprawnie sformatowany. Możesz dodać ograniczenie CHECK do kolumny JSON, która sprawdza, czy tekst JSON jest poprawnie sformatowany:
CREATE TABLE ProductCollection (
Id int identity primary key,
Data nvarchar(max)
CONSTRAINT [Data should be formatted as JSON]
CHECK (ISJSON(Data) > 0)
)
Jeśli masz już tabelę, możesz dodać ograniczenie sprawdzania za pomocą instrukcji ALTER TABLE:
ALTER TABLE ProductCollection
ADD CONSTRAINT [Data should be formatted as JSON]
CHECK (ISJSON(Data) > 0)
Ujawnij wartości z tekstu JSON jako kolumny obliczane
Można wyświetlić wartości z kolumny JSON jako kolumny obliczane:
CREATE TABLE ProductCollection (
Id int identity primary key,
Data nvarchar(max),
Price AS JSON_VALUE(Data, '$.Price'),
Color JSON_VALUE(Data, '$.Color') PERSISTED
)
Jeśli dodasz kolumnę obliczeniową PERSISTED, wartość z tekstu JSON zostanie zmaterializowana w tej kolumnie. W ten sposób twoje zapytania mogą szybciej odczytać wartość z tekstu JSON, ponieważ nie jest potrzebne parsowanie. Za każdym razem, gdy JSON w tym wierszu zmienia się, wartość zostanie ponownie obliczona.
Dodanie indeksu do ścieżki JSON
Zapytania, które filtrują lub sortują dane według pewnej wartości w kolumnie JSON, zwykle używają pełnego skanowania tabeli.
SELECT * FROM ProductCollection
WHERE JSON_VALUE(Data, '$.Color') = 'Black'
Aby zoptymalizować tego rodzaju zapytania, możesz dodać nietrwałą kolumnę obliczeniową, która eksponuje wyrażenie JSON używane w filtrze lub sortowaniu (w tym przykładzie JSON_VALUE (Dane, '$ .Color')) i utworzyć indeks w tej kolumnie:
ALTER TABLE ProductCollection
ADD vColor as JSON_VALUE(Data, '$.Color')
CREATE INDEX idx_JsonColor
ON ProductCollection(vColor)
Zapytania będą używać indeksu zamiast zwykłego skanowania tabeli.
JSON przechowywany w tabelach w pamięci
Jeśli możesz użyć tabel zoptymalizowanych pod kątem pamięci, możesz przechowywać JSON jako tekst:
CREATE TABLE ProductCollection (
Id int identity primary key nonclustered,
Data nvarchar(max)
) WITH (MEMORY_OPTIMIZED=ON)
Zalety JSON w pamięci:
- Dane JSON są zawsze w pamięci, więc nie ma dostępu do dysku
- Podczas pracy z JSON nie ma blokad ani zatrzasków