Questa pagina descrive come utilizzare JSON con Spanner.
Il tipo di dati JSON è un tipo di dati semistrutturati utilizzato per memorizzare i dati JSON (JavaScript Object Notation). Le specifiche per il formato JSON sono descritte nel documento RFC 7159.
JSON è utile per integrare uno schema relazionale per i dati sparsi o con una struttura poco definita o in evoluzione. Tuttavia, l'ottimizzatore delle query si basa sul modello relazionale per filtrare, unire, aggregare e ordinare in modo efficiente su larga scala. Le query su JSON avranno meno ottimizzazioni integrate e meno funzionalità per ispezionare e ottimizzare il rendimento.
Specifiche
Il tipo JSON di Spanner memorizza una rappresentazione normalizzata del documento JSON di input.
- JSON può essere nidificato fino a un massimo di 80 livelli.
- Gli spazi vuoti non vengono conservati.
- I commenti non sono supportati. Le transazioni o le query con commenti non andranno a buon fine.
- I membri di un oggetto JSON sono ordinati in ordine alfabetico.
- L'ordine degli elementi dell'array JSON viene mantenuto.
- Se un oggetto JSON ha chiavi duplicate, viene conservata solo la prima.
- I tipi primitivi (stringa, booleano, numero e null) mantengono il tipo
e il valore.
- I valori di tipo stringa vengono conservati esattamente.
- I valori di tipo numerico vengono conservati, ma la loro rappresentazione in testo potrebbe essere modificata in seguito al processo di normalizzazione. Ad esempio, un numero di input pari a 10000 potrebbe avere una rappresentazione normalizzata di 1e+4. La semantica di conservazione del valore numerico è la seguente:
- Gli interi con segno nell'intervallo [INT64_MIN, INT64_MAX] vengono conservati.
- I numeri interi senza segno nell'intervallo [0, UINT64_MAX] vengono conservati.
- I valori doppi che possono essere arrotondati da stringa a doppio a
stringa senza perdita di precisione vengono conservati. Se un valore doppio non può essere sottoposto a questo tipo di conversione, la transazione o la query non va a buon fine.
- Ad esempio,
SELECT JSON '2.2412421353246235436'
non va a buon fine. - Una soluzione alternativa funzionale è
PARSE_JSON('2.2412421353246235436', wide_number_mode=>'round')
, che restituisceJSON '2.2412421353246237'
.
- Ad esempio,
- Utilizza le funzioni
TO_JSON()
,JSON_OBJECT()
, eJSON_ARRAY()
per creare documenti JSON in SQL. Queste funzioni implementano i caratteri di apostrofo ed escape necessari.
La dimensione massima consentita del documento normalizzato è 10 MB.
Supporto di valori Null
I valori JSON null
vengono trattati come non null in SQL.
Ad esempio:
SELECT (JSON '{"a":null}').a IS NULL; -- Returns FALSE
SELECT (JSON '{"a":null}').b IS NULL; -- Returns TRUE
SELECT JSON_QUERY(JSON '{"a":null}', "$.a"); -- Returns a JSON 'null'
SELECT JSON_QUERY(JSON '{"a":null}', "$.b"); -- Returns a SQL NULL
Codifica
I documenti JSON devono essere codificati in UTF-8. Le transazioni o le query con documenti JSON codificati in altri formati restituiscono un errore.
Crea una tabella con colonne JSON
Una colonna JSON può essere aggiunta a una tabella al momento della sua creazione. I valori di tipo JSON possono essere null.
CREATE TABLE Venues (
VenueId INT64 NOT NULL,
VenueName STRING(1024),
VenueAddress STRING(1024),
VenueFeatures JSON,
DateOpened DATE,
) PRIMARY KEY(VenueId);
Aggiungere e rimuovere colonne JSON dalle tabelle esistenti
Una colonna JSON può anche essere aggiunta e rimossa dalle tabelle esistenti.
ALTER TABLE Venues ADD COLUMN VenueDetails JSON;
ALTER TABLE Venues DROP COLUMN VenueDetails;
L'esempio seguente mostra come aggiungere una colonna JSON
denominata VenueDetails
alla tabella Venues
utilizzando le librerie client Spanner.
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
Modificare i dati JSON
L'esempio seguente mostra come aggiornare i dati JSON
utilizzando le librerie client Spanner.
C++
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
C#
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Go
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Java
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Node.js
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
PHP
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Python
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Ruby
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Dati JSON dell'indice
Puoi velocizzare le query sui dati JSON utilizzando gli indici secondari e gli indici di ricerca con i dati JSON. Spanner non supporta l'utilizzo di colonne di tipo JSON come chiavi negli indici secondari.
Utilizzare l'indice secondario
Gli indici secondari sono utili per filtrare in base a valori scalari all'interno di un documento JSON. Per utilizzare gli indici secondari con JSON, crea una colonna generata che estrae i dati scalari pertinenti e converti i dati in un tipo SQL appropriato. Puoi quindi creare un indice secondario su questa colonna generata. L'indice accelera le query idonee eseguite sulla colonna generata.
Nell'esempio seguente viene creato un indice VenuesByCapacity
utilizzato dal database per trovare i luoghi con una capacità superiore a 1000. Anziché controllare ogni riga, Spanner utilizza l'indice per individuare le righe pertinenti, il che migliora le prestazioni delle query, in particolare per le tabelle di grandi dimensioni.
ALTER TABLE Venues
ADD COLUMN VenueCapacity INT64 AS (INT64(VenueDetails.capacity));
CREATE INDEX VenuesByCapacity ON Venue (VenueCapacity);
SELECT VenueName
FROM Venues
WHERE VenueCapacity > 1000;
Utilizzare gli indici di ricerca
Gli indici di ricerca sono utili quando esegui query su documenti JSON dinamici o diversi. A differenza degli indici secondari, puoi creare indici di ricerca su qualsiasi documento JSON archiviato in una colonna JSON. L'indice di ricerca si adatta automaticamente alle variazioni tra i documenti JSON, tra righe diverse e nel tempo.
Nell'esempio seguente viene creato un indice di ricerca VenuesByVenueDetails
utilizzato dal database per trovare i luoghi con dettagli specifici, come dimensioni e orario di apertura. Anziché controllare ogni riga, Spanner utilizza l'indice per individuare le righe pertinenti, il che migliora le prestazioni delle query, in particolare per le tabelle di grandi dimensioni.
ALTER TABLE Venues
ADD COLUMN VenueDetails_Tokens TOKENLIST AS (TOKENIZE_JSON(VenueDetails)) HIDDEN;
CREATE SEARCH INDEX VenuesByVenueDetails
ON Venue (VenueDetails_Tokens);
SELECT VenueName
FROM Venues
WHERE JSON_CONTAINS(VenueDetails, JSON '{"labels": ["large"], "open": {"Friday": true}}');
Per ulteriori informazioni, consulta Indici di ricerca JSON.
Esegui query sui dati JSON
L'esempio seguente mostra come eseguire query sui dati JSON
utilizzando le librerie client Spanner.
C++
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
C#
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Go
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Java
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Node.js
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
PHP
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Python
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Ruby
Per scoprire come installare e utilizzare la libreria client per Spanner, consulta Librerie client Spanner.
Per autenticarti a Spanner, configura le credenziali predefinite dell'applicazione. Per ulteriori informazioni, consulta Configurare l'autenticazione per un ambiente di sviluppo locale.
Limitazioni
- Non puoi utilizzare le colonne JSON in una clausola
ORDER BY
. - Non puoi utilizzare colonne di tipo JSON come chiavi principali o come chiavi negli indici secondari. Per ulteriori informazioni, consulta Indicizzare i dati JSON.
Passaggi successivi
- Tipo di dati JSON
- Funzioni JSON
- Operatori JSON: