Considerazioni e limitazioni delle tabelle temporaliTemporal Table Considerations and Limitations

QUESTO ARGOMENTO SI APPLICA A: sìSQL Server (a partire dalla versione 2016)sìDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Esistono alcune considerazioni e limitazioni da tenere presenti quando si lavora con le tabelle temporali, a causa della natura del controllo delle versioni di sistema.There are some considerations and limitations to be aware of when working with temporal tables, due to the nature of system-versioning.

Quando si usano le tabelle temporali, tenere presenti le considerazioni sotto riportate.Consider the following when working with temporal tables.

  • Una tabella temporale deve avere una chiave primaria definita per correlare i record compresi tra la tabella corrente e la tabella di cronologia e la tabella di cronologia non può avere una chiave primaria definita.A temporal table must have a primary key defined in order to correlate records between the current table and the history table, and the history table cannot have a primary key defined.

  • Le colonne periodo SYSTEM_TIME usate per registrare i valori SysStartTime e SysEndTime devono essere definite con un tipo di dati datetime2.The SYSTEM_TIME period columns used to record the SysStartTime and SysEndTime values must be defined with a datatype of datetime2.

  • Se durante la creazione della tabella di cronologia viene specificato il nome di una tabella di cronologia, è necessario specificare il nome tabella e il nome schema.If the name of a history table is specified during history table creation, you must specify the schema and table name.

  • Per impostazione predefinita, la tabella di cronologia è PAGE compresso.By default, the history table is PAGE compressed.

  • Se la tabella corrente è partizionata, la tabella di cronologia viene creata nel filegroup predefinito perché la configurazione del partizionamento non viene replicata automaticamente dalla tabella corrente nella tabella di cronologia.If current table is partitioned, the history table is created on default file group because partitioning configuration is not replicated automatically from the current table to the history table.

  • Le tabelle temporali e di cronologia non possono essere FILETABLE e possono contenere colonne di qualsiasi tipo di dati supportato diverso da FILESTREAM poiché FILETABLE e FILESTREAM consentono la manipolazione dei dati all'esterno di SQL ServerSQL Server e quindi non può essere garantito il controllo delle versioni di sistema.Temporal and history tables cannot be FILETABLE and can contain columns of any supported datatype other than FILESTREAM since FILETABLE and FILESTREAM allow data manipulation outside of SQL ServerSQL Server and thus system versioning cannot be guaranteed.

  • Mentre le tabelle temporali supportano i tipi di dati BLOB, ad esempio (n)varchar(max), varbinary(max), (n)texte image, a causa delle loro dimensioni non si potranno evitare costi di archiviazione significativi e implicazioni sulle prestazioni.While temporal tables support blob data types, such as (n)varchar(max), varbinary(max), (n)text, and image, they will incur significant storage costs and have performance implications due to their size. Di conseguenza, quando si progetta il sistema è importante prestare attenzione mentre si usano questi tipi di dati.As such, when designing your system, care should be taken when using these data types.

  • La tabella di cronologia deve essere creata nello stesso database della tabella corrente.History table must be created in the same database as the current table. L'esecuzione di query temporali su Linked Server non è supportata.Temporal querying over Linked Server is not supported.

  • La tabella di cronologia non può includere vincoli (chiave primaria, chiave esterna, vincoli di colonna o tabella).History table cannot have constraints (primary key, foreign key, table or column constraints).

  • Le viste indicizzate non sono supportate sulle query temporali (query che usano una clausola FOR SYSTEM_TIME )Indexed views are not supported on top of temporal queries (queries that use FOR SYSTEM_TIME clause)

  • L'opzione online (WITH (ONLINE = ON) non ha alcun effetto su ALTER TABLE ALTER COLUMN nel caso di una tabella temporale con controllo delle versioni di sistema.Online option (WITH (ONLINE = ON) has no effect on ALTER TABLE ALTER COLUMN in case of system-versioned temporal table. La colonna ALTER non viene eseguita come online indipendentemente dal valore che è stato specificato per l'opzione ONLINE.ALTER column is not performed as online regardless of which value was specified for ONLINE option.

  • Le istruzioniINSERT e UPDATE non possono fare riferimento a colonne periodo SYSTEM_TIME.INSERT and UPDATE statements cannot reference the SYSTEM_TIME period columns. Eventuali tentativi di inserire valori direttamente in tali colonne verranno bloccati.Attempts to insert values directly into these columns will be blocked.

  • TRUNCATE TABLE non è supportata quando l'opzione SYSTEM_VERSIONING è impostata su ONTRUNCATE TABLE is not supported while SYSTEM_VERSIONING is ON

  • La modifica diretta dei dati in una tabella di cronologia non è consentita.Direct modification of the data in a history table is not permitted.

  • ON DELETE CASCADE e ON UPDATE CASCADE non sono consentiti nella tabella corrente.ON DELETE CASCADE and ON UPDATE CASCADE are not permitted on the current table. In altre parole, quando la tabella temporale fa riferimento alla tabella nella relazione di chiave esterna (corrispondente a parent_object_id in sys.foreign_keys) non sono consentite le opzioni CASCADE.In other words, when temporal table is referencing table in the foreign key relationship (corresponding to parent_object_id in sys.foreign_keys) CASCADE options are not allowed. Per risolvere questa limitazione, usare la logica dell'applicazione oppure i trigger AFTER per mantenere la coerenza su eliminazione nella tabella di chiave primaria (corrispondente a referenced_object_id in sys.foreign_keys).To work around this limitation, use application logic or after triggers to maintain consistency on delete in primary key table (corresponding to referenced_object_id in sys.foreign_keys). Se la tabella di chiave primaria è temporale e la tabella di riferimento non lo è, questa limitazione non sussiste.If primary key table is temporal and referencing table is non-temporal, there’s no such limitation.

    NOTA: questa limitazione si applica solo a SQL Server 2016.NOTE: This limitation applies to SQL Server 2016 only. Le opzioni CASCADE sono supportate in Database SQLSQL Database e SQL Server 2017 a partire dalla versione CTP 2.0.CASCADE options are supported in Database SQLSQL Database and SQL Server 2017 starting from CTP 2.0.

  • Per non invalidare la logica DML, i triggerINSTEAD OF non sono consentiti né per la tabella corrente né per quella di cronologia.INSTEAD OF triggers are not permitted on either the current or the history table to avoid invalidating the DML logic. I triggerAFTER sono consentiti solo per la tabella corrente.AFTER triggers are permitted only on the current table. Sono bloccati nella tabella di cronologia per evitare di invalidare la logica DML.They are blocked on the history table to avoid invalidating the DML logic.

  • L'uso di tecnologie di replica è limitato.Usage of replication technologies is limited.

    • Always On: completamente supportatoAlways On: Fully supported

    • Change Data Capture e Change Data Tracking: supportati solo per la tabella correnteChange Data Capture and Change Data Tracking: Supported only on the current table

    • Replica snapshot e transazionale: supportata solo per un singolo server di pubblicazione senza attivazione di tabella temporale e per un sottoscrittore con attivazione di tabella temporale.Snapshot and transactional replication: Only supported for a single publisher without temporal being enabled and one subscriber with temporal enabled. In questo caso, il server di pubblicazione viene usato per un carico di lavoro OLTP, mentre il sottoscrittore viene usato per la ripartizione di report, inclusa l'esecuzione di query AS OF.In this case, the publisher is used for an OLTP workload while subscriber serves for offloading reporting (including ‘AS OF’ querying).
      L'uso di più sottoscrittori non è supportato poiché questo scenario potrebbe comportare dati temporali incoerenti in quanto ognuno di essi dipenderebbe dall'orologio di sistema locale.Use of multiple subscribers is not supported since this scenario may lead to inconsistent temporal data as each of them would depend on the local system clock.

    • Replica di tipo merge: non supportata per le tabelle temporaliMerge replication: Not supported for temporal tables

  • Le query normali influiscono solo sui dati della tabella corrente.Regular queries only affect data in the current table. Per eseguire query sui dati della tabella di cronologia, è necessario usare le query temporali.To query data in the history table, you must use temporal queries. Questo argomento verrà approfondito più avanti in questo documento nella sezione Esecuzione di query sui dati temporali.These are discussed later in this document in the section entitled Querying Temporal Data.

  • Una strategia di indicizzazione ottimale includerà un indice columnstore cluster e/o un indice rowstore con albero B nella tabella corrente, oltre a un indice columnstore cluster nella tabella di cronologia per dimensioni di archiviazione e prestazioni ottimali.An optimal indexing strategy will include a clustered columns store index and / or a B-tree rowstore index on the current table and a clustered columnstore index on the history table for optimal storage size and performance. Se si crea o si usa una tabella di cronologia propria, è consigliabile creare questo tipo di indice costituito da colonne periodo a partire dalla fine della colonna periodo; questo allo scopo di velocizzare non solo l'esecuzione di query temporali, ma anche le query incluse nella verifica di coerenza dei dati.If you create / use your own history table, we strongly recommend that you create this type of index consisting of period columns starting with the end of period column to speed up temporal querying as well as speeding up the queries that are part of the data consistency check. La tabella di cronologia predefinita presenta un indice rowstore cluster creato in base alle colonne periodo (inizio, fine).The default history table has a clustered rowstore index created for you based on the period columns (end, start). Come minimo, è consigliabile un indice rowstore non cluster.At a minimum, a non-clustered rowstore index is recommended.

  • Le proprietà o gli oggetti seguenti non vengono replicati dalla tabella corrente alla tabella di cronologia quando si crea quest'ultimaThe following objects/properties are not replicated from the current to the history table when the history table is created

    • Definizione di periodoPeriod definition

    • Definizione di identitàIdentity definition

    • IndiciIndexes

    • StatisticheStatistics

    • Vincoli CHECKCheck constraints

    • TriggerTriggers

    • Configurazione del partizionamentoPartitioning configuration

    • AutorizzazioniPermissions

    • Predicati di sicurezza a livello di rigaRow-level security predicates

  • Una tabella di cronologia non può essere configurata come tabella corrente in una catena di tabelle di cronologia.A history table cannot be configured as current table in a chain of history tables.

Questo articolo è stato utile?Did this Article Help You? Commenti e suggerimentiWe’re Listening

Quali informazioni si stanno cercando? La ricerca ha restituito i risultati desiderati?What information are you looking for, and did you find it? Microsoft incoraggia gli utenti a inviare i propri commenti per migliorare i contenutiWe’re listening to your feedback to improve the content. Inviare eventuali commenti all'indirizzo sqlfeedback@microsoft.comPlease submit your comments to sqlfeedback@microsoft.com

Vedere ancheSee Also

Tabelle temporali Temporal Tables
Introduzione alle tabelle temporali con controllo delle versioni di sistema Getting Started with System-Versioned Temporal Tables
Verifiche di coerenza del sistema della tabella temporale Temporal Table System Consistency Checks
Partizionamento con le tabelle temporali Partitioning with Temporal Tables
Sicurezza di una tabella temporale Temporal Table Security
Gestire la conservazione dei dati cronologici nelle tabelle temporali con controllo delle versioni di sistema Manage Retention of Historical Data in System-Versioned Temporal Tables
Tabelle temporali con controllo delle versioni di sistema con tabelle con ottimizzazione per la memoria System-Versioned Temporal Tables with Memory-Optimized Tables
Funzioni e viste per i metadati delle tabelle temporaliTemporal Table Metadata Views and Functions