Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Vonatkozik a következőkre: SQL Server 2016 (13.x) és későbbi verziók
Azure SQL Database
Azure SQL Managed Instance
SQL database in Microsoft Fabric
Az SQL Database Engine natív JSON-függvényeket biztosít, amelyek lehetővé teszik JSON-dokumentumok szabványos SQL-nyelv használatával történő elemzését. A JSON-dokumentumokat az SQL Database Engine-ben tárolhatja, és JSON-adatokat kérdezhet le, mint egy NoSQL-adatbázisban. Ez a cikk a JSON-dokumentumok tárolásának lehetőségeit ismerteti.
Formátum JSON tárhely
Az első tárolási tervezési döntés a JSON-dokumentumok táblákban való tárolása. Két lehetőség áll rendelkezésre:
- LOB storage – A JSON-dokumentumok as-is tárolhatók oszlopokban, json vagy nvarchar. Ez a legjobb módja az adatok gyors feltöltésének és feldolgozásának, mivel a betöltési sebesség megegyezik a szöveges oszlopok betöltési sebességével. Ez a módszer további teljesítménybeli büntetést vonhat maga után a lekérdezési/elemzési időszakban, ha a JSON-értékek indexelése nem történik meg, mert a nyers JSON-dokumentumokat elemezni kell a lekérdezések futtatása közben.
-
Relációs tárterület – A JSON-dokumentumok elemezhetők, miközben
OPENJSON,JSON_VALUEvagyJSON_QUERYfüggvényekkel szúrják be őket a táblába. A bemeneti JSON-dokumentumok töredékeit a JSON-alelemeket tartalmazó oszlopokban lehet tárolni, amelyek adattípusa json vagy nvarchar. Ez a megközelítés növeli a betöltési időt, mert a JSON-elemzés a terhelés során történik; a lekérdezések azonban megfelelnek a klasszikus lekérdezések relációs adatokon végzett teljesítményének. - Az SQL Serveren jelenleg a JSON nem beépített adattípus.
Megjegyzés:
- általánosan elérhető az Azure SQL Database és az Azure SQL Managed Instance az SQL Server 2025 vagy az Always-up-to-date frissítési szabályzattal.
- előzetes verzióban érhető el az SQL Server 2025 (17.x) és az SQL Database a Fabricben.
Klasszikus táblák
A JSON-dokumentumok SQL Serverben vagy Azure SQL Database-ben való tárolásának legegyszerűbb módja egy kétoszlopos tábla létrehozása, amely tartalmazza a dokumentum azonosítóját és a dokumentum tartalmát. Például:
create table WebSite.Logs (
[_id] bigint primary key identity,
[log] nvarchar(max)
);
Vagy, ahol támogatott:
create table WebSite.Logs (
[_id] bigint primary key identity,
[log] json
);
Ez a struktúra megegyezik a klasszikus dokumentum-adatbázisokban található gyűjteményekkel. Az elsődleges kulcs _id egy automatikusan növekvő érték, amely minden dokumentum egyedi azonosítóját biztosítja, és lehetővé teszi a gyors kereséseket. Ez a struktúra jó választás a klasszikus NoSQL-forgatókönyvekhez, ahol azonosító alapján szeretne lekérni egy dokumentumot, vagy azonosító alapján frissíteni szeretné a tárolt dokumentumot.
- Használja a natív json adattípust, ahol elérhető a JSON-dokumentumok tárolásához.
- A nvarchar(max) adattípussal legfeljebb 2 GB méretű JSON-dokumentumokat tárolhat. Ha biztos abban, hogy a JSON-dokumentumok nem nagyobbak 8 KB-nál, javasoljuk, hogy teljesítménybeli okokból nvarchar(4000) használjon nvarchar(max) helyett.
Az előző példában létrehozott mintatábla feltételezi, hogy az érvényes JSON-dokumentumok a log oszlopban vannak tárolva. Ha biztos szeretne lenni abban, hogy az érvényes JSON a log oszlopba van mentve, hozzáadhat egy CHECK korlátozást az oszlophoz. Például:
ALTER TABLE WebSite.Logs
ADD CONSTRAINT [Log record should be formatted as JSON]
CHECK (ISJSON([log])=1)
Minden alkalommal, amikor valaki beszúr vagy frissít egy dokumentumot a táblában, ez a korlátozás ellenőrzi, hogy a JSON-dokumentum megfelelően van-e formázva. A korlátozás nélkül a táblázat beszúrásokra van optimalizálva, mert minden JSON-dokumentum közvetlenül az oszlophoz lesz hozzáadva feldolgozás nélkül.
Amikor A JSON-dokumentumokat a táblában tárolja, szabványos Transact-SQL nyelv használatával kérdezheti le a dokumentumokat. Például:
SELECT TOP 100 JSON_VALUE([log], '$.severity'), AVG( CAST( JSON_VALUE([log],'$.duration') as float))
FROM WebSite.Logs
WHERE CAST( JSON_VALUE([log],'$.date') as datetime) > @datetime
GROUP BY JSON_VALUE([log], '$.severity')
HAVING AVG( CAST( JSON_VALUE([log],'$.duration') as float) ) > 100
ORDER BY AVG( CAST( JSON_VALUE([log],'$.duration') as float) ) DESC
Nagy előnye, hogy bármilyen T-SQL-függvényt és lekérdezési záradékot használhat JSON-dokumentumok lekérdezéséhez. Az SQL Server és az SQL Database nem vezet be korlátozásokat a JSON-dokumentumok elemzéséhez használható lekérdezésekben. A JSON-dokumentumokból kinyerheti az értékeket a JSON_VALUE függvénnyel, és bármely más értékhez hasonlóan használhatja azt a lekérdezésben.
A gazdag T-SQL-lekérdezési szintaxis használatának képessége az SQL Server, az SQL-adatbázisok és a klasszikus NoSQL-adatbázisok közötti fő különbség – Transact-SQL valószínűleg rendelkezik az összes szükséges függvénnyel JSON-adatok feldolgozásához.
Indexes
Ha kiderül, hogy a lekérdezések gyakran keresnek dokumentumokat valamilyen tulajdonság (például egy JSON-dokumentum severity tulajdonsága) alapján, a lekérdezések felgyorsításához hozzáadhat egy nem klaszteres soros tároló indexet a tulajdonsághoz.
Létrehozhat egy számított oszlopot, amely a megadott elérési úton (azaz az elérési úton $.severity) lévő JSON-oszlopok JSON-értékeit teszi elérhetővé, és szabványos indexet hozhat létre ezen a számított oszlopon. Például:
create table WebSite.Logs (
[_id] bigint primary key identity,
[log] nvarchar(max),
[severity] AS JSON_VALUE([log], '$.severity'),
index ix_severity (severity)
);
A példában használt számított oszlop egy nem tartós vagy virtuális oszlop, amely nem ad hozzá további helyet a táblához. Az index ix_severity használja a lekérdezések teljesítményének javítására, például az alábbi példában:
SELECT [log]
FROM Website.Logs
WHERE JSON_VALUE([log], '$.severity') = 'P4'
Ennek az indexnek az egyik fontos jellemzője, hogy rendezésérzékeny. Ha az eredeti nvarchar oszlop COLLATION tulajdonsággal rendelkezik (például a kis- és nagybetűk érzékenysége vagy a japán nyelv), az index a nyelvi szabályok vagy a nvarchar oszlophoz társított kis- és nagybetűk érzékenységi szabályai szerint van rendszerezve. Ez a rendezési tudatosság fontos funkció lehet, ha olyan alkalmazásokat fejleszt globális piacokra, amelyeknek egyéni nyelvi szabályokat kell használniuk JSON-dokumentumok feldolgozásakor.
Nagyméretű táblák & oszlop-tároló formátumban
Ha nagy számú JSON-dokumentumra számít a gyűjteményben, javasoljuk, hogy adjon hozzá egy fürtözött oszlopcentrikus indexet a gyűjteményhez, ahogyan az a következő példában látható:
create sequence WebSite.LogID as bigint;
go
create table WebSite.Logs (
[_id] bigint default(next value for WebSite.LogID),
[log] nvarchar(max),
INDEX cci CLUSTERED COLUMNSTORE
);
A fürtözött oszlopcentrikus index magas adattömörítést (akár 25x) biztosít, amely jelentősen csökkentheti a tárterületre vonatkozó követelményeket, csökkentheti a tárolási költségeket, és növelheti a számítási feladat I/O-teljesítményét. Emellett a fürtözött oszlopcentrikus indexek a JSON-dokumentumok táblavizsgálatára és elemzésére vannak optimalizálva, így ez az indextípus lehet a legjobb választás a naplóelemzéshez.
Az előző példa egy sorszámozási objektummal rendel értékeket a _id oszlophoz. Az azonosító oszlopban a sorozatok és az identitások is érvényesek.
Dokumentumok gyakori módosítása & memóriaoptimalizált táblákban
Ha nagy számú frissítési, beszúrási és törlési műveletet vár a gyűjteményekben, a JSON-dokumentumokat memóriaoptimalizált táblákban tárolhatja. A memóriaoptimalizált JSON-gyűjtemények mindig memóriában tartják az adatokat, így nincs szükség a tárolási I/O-költségekre. Emellett a memóriaoptimalizált JSON-gyűjtemények teljesen zárolásmentesek , vagyis a dokumentumokon végzett műveletek semmilyen más műveletet nem tiltanak le.
A klasszikus gyűjteményeket csak memóriaoptimalizált gyűjteménysé kell konvertálnia, ha a tábladefiníció után megadja a WITH (MEMORY_OPTIMIZED=ON) beállítást, ahogy az az alábbi példában is látható. Ezután a JSON-gyűjtemény memóriaoptimalizált verziójával rendelkezik.
CREATE TABLE WebSite.Logs (
[_id] bigint IDENTITY PRIMARY KEY NONCLUSTERED,
[log] nvarchar(max)
) WITH (MEMORY_OPTIMIZED=ON)
A dokumentumok gyakori módosításához a legjobb megoldás a memóriaoptimalizált táblázat. Ha memóriaoptimalizált táblákat fontolgat, vegye figyelembe a teljesítményt is. Ha lehetséges, használja az nvarchar(4000) adattípust a memóriaoptimalizált gyűjteményekben lévő JSON-dokumentumokhoz nvarchar(max) helyett, mert ez jelentősen javíthatja a teljesítményt. A json adattípus memóriaoptimalizált táblákkal nem támogatott.
A klasszikus táblákhoz hasonlóan a memóriaoptimalizált táblákban feltárt mezők indexeit is hozzáadhatja számított oszlopok használatával. Például:
CREATE TABLE WebSite.Logs (
[_id] bigint IDENTITY PRIMARY KEY NONCLUSTERED,
[log] nvarchar(max),
[severity] AS cast(JSON_VALUE([log], '$.severity') as tinyint) persisted,
INDEX ix_severity (severity)
) WITH (MEMORY_OPTIMIZED=ON)
A teljesítmény maximalizálása érdekében állítsa a JSON-értéket a lehető legkisebb típusra, amely a tulajdonság értékének tárolására használható. Az előző példában tinyint használunk.
A Natív fordítás előnyeit kihasználva olyan SQL-lekérdezéseket is elhelyezhet, amelyek a tárolt eljárásokban frissítik a JSON-dokumentumokat. Például:
CREATE PROCEDURE WebSite.UpdateData(@Id int, @Property nvarchar(100), @Value nvarchar(100))
WITH SCHEMABINDING, NATIVE_COMPILATION
AS BEGIN
ATOMIC WITH (transaction isolation level = snapshot, language = N'English')
UPDATE WebSite.Logs
SET [log] = JSON_MODIFY([log], @Property, @Value)
WHERE _id = @Id;
END
Ez a natívan lefordított eljárás leküldi a lekérdezést, és .DLL lekérdezést futtató kódot hoz létre. A natívan lefordított eljárás az adatok lekérdezésének és frissítésének gyorsabb módszere.
Conclusion
Az SQL Server és az SQL Database natív JSON-függvényei lehetővé teszik JSON-dokumentumok feldolgozását, ugyanúgy, mint a NoSQL-adatbázisokban. Minden adatbázisnak – relációs vagy NoSQL - van néhány előnye és hátránya a JSON-adatfeldolgozáshoz. A JSON-dokumentumok SQL Serveren vagy SQL Database-ben való tárolásának fő előnye a teljes SQL-nyelv támogatása. A gazdag Transact-SQL nyelv használatával feldolgozhatja az adatokat, és különféle tárolási lehetőségeket konfigurálhat, a magas tömörítési és gyors elemzési oszlopcentrikus indexektől kezdve a zárolásmentes feldolgozáshoz használható memóriaoptimalizált táblákig. Ugyanakkor a kiforrott biztonsági és nemzetköziesítési funkciók előnyeit is élvezheti, amelyeket egyszerűen felhasználhat a NoSQL-forgatókönyvben. A cikkben ismertetett okok kiváló érvek arra, hogy érdemes megfontolni A JSON-dokumentumok SQL Serverben vagy SQL Database-ben való tárolását.
További információ a JSON-ról az SQL Database Engine-ben
A beépített JSON-támogatás vizuális bemutatásához tekintse meg az alábbi videókat:
Kapcsolódó tartalom
- JSON-adatok AZ SQL Server
- JSON-adattípus