Questo argomento descrive come scrivere un timestamp di commit per ogni inserimento e aggiornamento
dell'operazione che esegui con Spanner. Per utilizzare questa funzione, imposta il parametro
Opzione allow_commit_timestamp
su una colonna TIMESTAMP
, poi scrivi
il timestamp come parte di ogni transazione.
Panoramica
Il timestamp del commit, basato su TrueTime.
tecnologia, è il momento in cui
del commit della transazione nel database. Colonna allow_commit_timestamp
consente di archiviare atomicamente il timestamp di commit in una colonna.
Utilizzando i timestamp di commit archiviati nelle tabelle, puoi determinare
l'ordine delle mutazioni e le funzionalità di creazione come i log delle modifiche.
Per inserire i timestamp dei commit nel database:
Crea una colonna di tipo
TIMESTAMP
con l'opzione colonnaallow_commit_timestamp
impostata sutrue
nella definizione dello schema. Ad esempio:CREATE TABLE Performances ( ... LastUpdateTime TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp=true) ... ) PRIMARY KEY (...);
Se esegui inserimenti o aggiornamenti con DML, usa la funzione
PENDING_COMMIT_TIMESTAMP
per scrivere il commit timestamp.Se esegui inserimenti o aggiornamenti con mutazioni, utilizza la stringa segnaposto
spanner.commit_timestamp()
sugli inserimenti o sugli aggiornamenti del commit colonna timestamp. Puoi anche utilizzare la costante del timestamp del commit fornita dalla libreria client. Ad esempio, questo nel client Java èValue.COMMIT_TIMESTAMP
.
Quando Spanner esegue il commit della transazione utilizzando questi segnaposto come colonna
, il timestamp di commit effettivo viene scritto nella colonna specificata (Per
esempio: la colonna LastUpdateTime
). Potresti quindi utilizzare questo valore della colonna per creare una cronologia degli aggiornamenti della tabella.
Non è garantito che i valori dei timestamp di commit siano univoci. Transazioni che in insiemi di campi non sovrapposti potrebbero avere lo stesso timestamp. Le transazioni che scrivono in insiemi sovrapposti di campi hanno timestamp univoci.
I timestamp di commit di Spanner hanno una granularità in microsecondi,
e vengono convertiti in nanosecondi se archiviati in TIMESTAMP
colonne.
Crea ed elimina una colonna di timestamp di commit
Utilizza l'opzione della colonna allow_commit_timestamp
per aggiungere e rimuovere il supporto per
timestamp di commit:
- Quando crei una nuova tabella, per specificare che una colonna supporta i timestamp dei commit.
- Quando modifichi una tabella esistente:
- per aggiungere una nuova colonna che supporti i timestamp dei commit.
- per modificare una colonna
TIMESTAMP
esistente in modo da supportare i timestamp dei commit, - per modificare una colonna
TIMESTAMP
esistente per rimuovere il timestamp di commit assistenza
Chiavi e indici
Puoi utilizzare una colonna del timestamp di commit come colonna di chiave primaria o come non chiave
colonna. Le chiavi primarie possono essere definite come ASC
o DESC
.
ASC
(predefinito): le chiavi crescenti sono ideali per rispondere a query da una a un determinato periodo di tempo.DESC
: le chiavi discendenti consentono di mantenere le righe più recenti nella parte superiore della tabella. Forniscono un accesso rapido ai record più recenti.
L'opzione allow_commit_timestamp
deve essere coerente nelle chiavi principali delle tabelle principali e secondarie. Se l'opzione non è coerente tra
primarie, Spanner restituisce un errore. L'unica volta in cui l'opzione
può non essere coerente sia quando crei o aggiorni lo schema.
L'uso di timestamp di commit nei seguenti scenari crea hotspot, che ridurre le prestazioni dei dati:
Esegui il commit della colonna timestamp come prima parte della chiave primaria di una tabella:
CREATE TABLE Users ( LastAccess TIMESTAMP NOT NULL, UserId INT64 NOT NULL, ... ) PRIMARY KEY (LastAccess, UserId);
La prima parte della chiave primaria di un indice secondario:
CREATE INDEX UsersByLastAccess ON Users(LastAccess)
o
CREATE INDEX UsersByLastAccessAndName ON Users(LastAccess, FirstName)
Gli hotspot riducono le prestazioni dei dati, anche con velocità di scrittura ridotte. Non c'è alcun overhead del rendimento se i timestamp di commit sono abilitati su colonne non chiave che non sono indicizzate.
Crea una colonna del timestamp di commit
Il seguente DDL crea una tabella con una colonna che supporta i timestamp dei commit.
CREATE TABLE Performances (
SingerId INT64 NOT NULL,
VenueId INT64 NOT NULL,
EventDate Date,
Revenue INT64,
LastUpdateTime TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp=true)
) PRIMARY KEY (SingerId, VenueId, EventDate),
INTERLEAVE IN PARENT Singers ON DELETE CASCADE
Se aggiungi l'opzione, la colonna del timestamp viene modificata come segue:
- Puoi utilizzare la stringa segnaposto
spanner.commit_timestamp()
(o una costante fornite dalla libreria client) per inserimenti e aggiornamenti. - La colonna può contenere solo valori passati. Per ulteriori informazioni, consulta Fornire un valore personalizzato per il timestamp.
L'opzione allow_commit_timestamp
è sensibile alle maiuscole.
Aggiungi una colonna del timestamp di commit a una tabella esistente
Per aggiungere una colonna di timestamp del commit a una tabella esistente, utilizza l'istruzione ALTER TABLE
. Ad esempio, per aggiungere una colonna LastUpdateTime
a Performances
utilizza la seguente istruzione:
ALTER TABLE Performances ADD COLUMN LastUpdateTime TIMESTAMP
NOT NULL OPTIONS (allow_commit_timestamp=true)
Converti una colonna timestamp in una colonna di timestamp di commit
Puoi convertire una colonna del timestamp esistente in una colonna del timestamp di commit, ma per farlo è necessario che Spanner verifichi che l'istanza esistente i valori timestamp sono nel passato. Ad esempio:
ALTER TABLE Performances ALTER COLUMN LastUpdateTime
SET OPTIONS (allow_commit_timestamp=true)
Non puoi modificare il tipo di dati o l'annotazione NULL
di una colonna in un
Istruzione ALTER TABLE
che include SET OPTIONS
. Per maggiori dettagli, vedi
Data Definition Language.
Rimuovi l'opzione del timestamp di commit
Se vuoi rimuovere il supporto del timestamp di commit da una colonna, utilizza l'opzione
allow_commit_timestamp=null
in: ALTER TABLE
l'Informativa. Il comportamento del timestamp di commit viene rimosso, ma la colonna rimane
un timestamp. La modifica dell'opzione non influisce su altre caratteristiche del
colonna, ad esempio tipo o supporto di valori null (NOT NULL
). Ad esempio:
ALTER TABLE Performances ALTER COLUMN LastUpdateTime
SET OPTIONS (allow_commit_timestamp=null)
Scrivi un timestamp di commit utilizzando un'istruzione DML
Utilizzerai la funzione PENDING_COMMIT_TIMESTAMP
per scrivere il commit
in un'istruzione DML. Spanner seleziona il timestamp di commit quando la transazione
commit.
La seguente istruzione DML aggiorna la colonna LastUpdateTime
nella tabella Performances
con il timestamp di commit:
UPDATE Performances SET LastUpdateTime = PENDING_COMMIT_TIMESTAMP()
WHERE SingerId=1 AND VenueId=2 AND EventDate="2015-10-21"
Il seguente esempio di codice utilizza la classe
PENDING_COMMIT_TIMESTAMP
per scrivere il timestamp di commit nella colonna LastUpdateTime
.
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
Ruby
I timestamp di commit possono essere scritti solo nelle colonne annotate con il
Opzione allow_commit_timestamp=true
.
Se sono presenti mutazioni sulle righe di più tabelle, devi specificare
spanner.commit_timestamp()
(o la libreria client
costante) per la colonna del timestamp di commit in ogni tabella.
Esegui una query su una colonna del timestamp di commit
L'esempio seguente esegue query sulla colonna del timestamp di commit della tabella.
C++
C#
Vai
Java
Node.js
PHP
Python
Ruby
Specifica un valore per la colonna del timestamp del commit
Puoi fornire un valore personale per la colonna del timestamp di commit, anziché
passando spanner.commit_timestamp()
(o costante della libreria client) come
. Il valore deve essere un timestamp nel passato. Questa restrizione
assicura che la scrittura dei timestamp sia un'operazione rapida e poco costosa. Il server
restituisce un errore FailedPrecondition
se viene specificato un timestamp futuro.
Crea un log delle modifiche
Supponiamo che tu voglia creare un log delle modifiche di ogni mutazione che si verifica in una tabella e poi utilizzarlo per il controllo. Un esempio potrebbe essere una tabella che archivia la cronologia delle modifiche apportate ai documenti di videoscrittura. Il timestamp di commit semplifica la creazione del log delle modifiche, poiché i timestamp possono imporre l'ordine delle voci del log delle modifiche. Potresti creare un che archivia la cronologia delle modifiche apportate a un determinato documento utilizzando uno schema come nell'esempio seguente:
CREATE TABLE Documents (
UserId INT64 NOT NULL,
DocumentId INT64 NOT NULL,
Contents STRING(MAX) NOT NULL,
) PRIMARY KEY (UserId, DocumentId);
CREATE TABLE DocumentHistory (
UserId INT64 NOT NULL,
DocumentId INT64 NOT NULL,
Ts TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp=true),
Delta STRING(MAX),
) PRIMARY KEY (UserId, DocumentId, Ts),
INTERLEAVE IN PARENT Documents ON DELETE NO ACTION;
Per creare un log delle modifiche, inserisci una nuova riga in DocumentHistory
nella stessa
transazione in cui inserisci o aggiorni una riga in Document
. Durante l'inserimento
della nuova riga in DocumentHistory
, usa il segnaposto
spanner.commit_timestamp()
(o costante della libreria client) per indicare
Spanner per scrivere il timestamp di commit nella colonna Ts
. Interfoliazione
la tabella DocumentsHistory
con la tabella Documents
consentirà di inserire
località e di inserimenti e aggiornamenti più efficienti. Tuttavia, aggiunge anche
il vincolo che le righe padre e figlio
devono essere eliminati insieme. Per mantenere le righe in DocumentHistory
dopo le righe
in Documents
vengono eliminate, non alternare le tabelle.
Ottimizzare le query sui dati recenti con i timestamp di commit
I timestamp di commit consentono un'ottimizzazione Spanner che può ridurre l'I/O delle query durante il recupero dei dati scritti dopo una nel tempo.
Per attivare questa ottimizzazione, la clausola WHERE
di una query deve includere un
confronto tra la colonna del timestamp di commit di una tabella e un intervallo di tempo specifico
che fornisci, con i seguenti attributi:
Specifica il tempo specifico come espressione costante: un valore letterale, una o una funzione i cui argomenti restituiscono costanti.
Confronta se il timestamp del commit è più recente rispetto al momento specificato tramite gli operatori
>
o>=
.Se vuoi, aggiungi ulteriori limitazioni alla clausola
WHERE
conAND
. L'estensione della clausola conOR
rende la query non idonea e ottimizzazione.
Ad esempio, considera la seguente tabella Performances
, che include
una colonna con timestamp di commit:
CREATE TABLE Performances (
SingerId INT64 NOT NULL,
VenueId INT64 NOT NULL,
EventDate DATE,
Revenue INT64,
LastUpdateTime TIMESTAMP NOT NULL OPTIONS (allow_commit_timestamp=true)
) PRIMARY KEY (SingerId, VenueId, EventDate);
Questa query trae vantaggio dall'ottimizzazione del timestamp del commit descritta in precedenza, perché ha un confronto maggiore o uguale a la colonna del timestamp di commit della tabella e un'espressione costante, in questo case, un valore letterale:
SELECT * FROM Performances WHERE LastUpdateTime >= "2022-05-01";
Anche la seguente query è idonea per l'ottimizzazione, poiché presenta un confronto maggiore tra il timestamp del commit e una funzione i cui argomenti vengono tutti valutati come costanti durante l'esecuzione della query:
SELECT * FROM Performances
WHERE LastUpdateTime > TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 30 DAY);
Passaggi successivi
- Utilizza i timestamp di commit per creare un log delle modifiche con Go.