Overwegingen en beperkingen voor tijdelijke tabellen
Van toepassing op: SQL Server 2016 (13.x) en latere versies
Azure SQL Database
Azure SQL Managed Instance
SQL-database in Microsoft Fabric
Er zijn enkele overwegingen en beperkingen waarmee u rekening moet houden bij het werken met tijdelijke tabellen, vanwege de aard van systeemversiebeheer:
Een tijdelijke tabel moet een primaire sleutel hebben gedefinieerd om records te correleren tussen de huidige tabel en de geschiedenistabel. In de geschiedenistabel kan geen primaire sleutel zijn gedefinieerd.
De kolommen
SYSTEM_TIME
periode die worden gebruikt om deValidFrom
- enValidTo
-waarden vast te leggen, moeten worden gedefinieerd met een gegevenstype van datum/tijd2-.Temporale syntaxis werkt op tabellen of weergaven die lokaal zijn opgeslagen in de database. Met externe objecten, zoals tabellen op een gekoppelde server of externe tabellen, kunt u de
FOR
-clause of tijdperiode-predicaten niet rechtstreeks in de query gebruiken.Als de naam van een geschiedenistabel wordt opgegeven tijdens het maken van de geschiedenistabel, moet u de schema- en tabelnaam opgeven.
De geschiedenistabel wordt standaard
PAGE
gecomprimeerd.Als de huidige tabel is gepartitioneerd, wordt de geschiedenistabel gemaakt in de standaardbestandsgroep, omdat de partitioneringsconfiguratie niet automatisch wordt gerepliceerd van de huidige tabel naar de geschiedenistabel.
Tijdelijke tabellen en geschiedenistabellen kunnen geen filetable of FILESTREAM gebruiken. FileTable en FILESTREAM maken het bewerken van gegevens buiten SQL Server mogelijk, zodat systeemversiebeheer niet kan worden gegarandeerd.
Een knooppunt- of edge-tabel kan niet worden aangemaakt als, of omgezet in, een temporale tabel.
Tijdelijke tabellen ondersteunen blobgegevenstypen, zoals (n)varchar(max), varbinary(max), (n)teksten afbeelding, ze hebben aanzienlijke opslagkosten en hebben gevolgen voor de prestaties vanwege hun grootte. Als zodanig moet u bij het ontwerpen van uw systeem voorzichtig zijn bij het gebruik van deze gegevenstypen.
De geschiedenistabel moet worden gemaakt in dezelfde database als de huidige tabel. Tijdelijke query's op gekoppelde servers worden niet ondersteund.
De geschiedenistabel kan geen beperkingen hebben (primaire sleutel, refererende sleutel, tabel of kolombeperkingen).
Geïndexeerde weergaven worden niet ondersteund boven op tijdelijke query's (query's die gebruikmaken van
FOR SYSTEM_TIME
component).De online-optie (
WITH (ONLINE = ON
) heeft geen effect opALTER TABLE ALTER COLUMN
in een systeemgeversioneerde temporele tabel.ALTER
kolom wordt niet uitgevoerd als een onlinebewerking, ongeacht welke waarde is opgegeven voor de optieONLINE
.INSERT
- enUPDATE
-instructies kunnen niet verwijzen naar deSYSTEM_TIME
-periodieke kolommen. Pogingen om waarden rechtstreeks in deze kolommen in te voegen, worden geblokkeerd.TRUNCATE TABLE
wordt niet ondersteund terwijlSYSTEM_VERSIONING
ON
is.Directe wijziging van de gegevens in een geschiedenistabel is niet toegestaan.
-
ON DELETE CASCADE
enON UPDATE CASCADE
zijn niet toegestaan in de huidige tabel. Met andere woorden, wanneer een tijdelijke tabel verwijst naar een tabel in de vreemde-sleutelrelatie (overeenkomend metparent_object_id
insys.foreign_key
), zijnCASCADE
opties niet toegestaan. Als u deze beperking wilt omzeilen, gebruikt u toepassingslogica of een na-trigger om consistentie bij het verwijderen in de tabel met primaire sleutels te behouden (overeenkomend metreferenced_object_id
insys.foreign_key
). Als de primaire-sleuteltabel tijdelijk is en de verwijzende tabel niet tijdelijk is, is er geen dergelijke beperking.
INSTEAD OF
triggers zijn niet toegestaan op de huidige of de geschiedenistabel om te voorkomen dat de DML-logica ongeldig wordt.AFTER
triggers zijn alleen toegestaan in de huidige tabel. Deze triggers worden geblokkeerd in de geschiedenistabel om te voorkomen dat de DML-logica ongeldig wordt.Het gebruik van replicatietechnologieën is beperkt:
beschikbaarheidsgroepen: volledig ondersteund
Gegevens vastleggen en bijhouden van wijzigingen: alleen ondersteund in de huidige tabel
Momentopname en transactionele replicatie: alleen ondersteund voor één uitgever zonder temporele inschakeling en één abonnee met temporele functionaliteit. Het gebruik van meerdere abonnees wordt niet ondersteund vanwege een afhankelijkheid van de lokale systeemklok, wat kan leiden tot inconsistente tijdelijke gegevens. In dit geval wordt de uitgever gebruikt voor een OLTP-workload, terwijl abonnee fungeert voor offloadingrapportage (inclusief
AS OF
query's). Wanneer de distributieagent wordt gestart, wordt er een transactie geopend die open blijft totdat de distributieagent stopt.ValidFrom
enValidTo
worden ingevuld tot de begintijd van de eerste transactie die de distributieagent start. Het is misschien beter om de distributieagent volgens een schema uit te voeren in plaats van het standaardgedrag van het continu uitvoeren ervan, alsValidFrom
enValidTo
gevuld met een tijd die dicht bij de huidige systeemtijd ligt, belangrijk is voor uw toepassing of organisatie. Zie Tijdelijke tabelgebruiksscenario'svoor meer informatie.Samenvoegreplicatie: niet ondersteund voor tijdtabellen
Reguliere query's zijn alleen van invloed op gegevens in de huidige tabel. Als u query's wilt uitvoeren op gegevens in de geschiedenistabel, moet u tijdelijke query's gebruiken. Zie Querygegevens in een tijdelijke tabel met systeemversiesvoor meer informatie.
Een optimale indexeringsstrategie omvat een geclusterde columnstore-index en/of een B-tree rowstore-index op de huidige tabel, en een geclusterde columnstore-index op de geschiedenistabel, voor optimale opslaggrootte en prestaties. Als u uw eigen geschiedenistabel maakt of gebruikt, raden wij sterk aan om dit type index te creëren, dat bestaat uit periodekolommen beginnend met de kolom voor het einde van de periode. Deze index versnelt tijdelijke query's en versnelt de query's die deel uitmaken van de gegevensconsistentiecontrole. De standaardgeschiedenistabel heeft een geclusterd rowstore-index die voor u is aangemaakt op basis van de periodekolommen (einde, begin). Minimaal wordt een niet-geclusterde rowstore-index aanbevolen.
De volgende objecten/eigenschappen worden niet gerepliceerd van de huidige naar de geschiedenistabel wanneer de geschiedenistabel wordt gemaakt:
- Periodedefinitie
- Identiteitsdefinitie
- Indexen
- Statistiek
- Controleer voorwaarden
- Aanleidingen
- Partitioneringsconfiguratie
- Machtigingen
- Beveiligingspredicaten op rijniveau
Een geschiedenistabel kan niet worden geconfigureerd als huidige tabel in een keten van geschiedenistabellen.
Notitie
Documentatie maakt gebruik van de term B-tree in het algemeen in verwijzing naar indexen. In rijstore-indexen implementeert de database-engine een B+-boom. Dit geldt niet voor columnstore-indexen of indexen voor tabellen die zijn geoptimaliseerd voor geheugen. Zie de SQL Server- en Azure SQL-indexarchitectuur en ontwerphandleidingvoor meer informatie.
Verwante inhoud
- tijdelijke tabellen
- Aan de slag met systeem-geversioneerde temporele tabellen
- consistentiecontroles van het tijdelijke tabelsysteem
- partitioneren met tijdelijke tabellen
- tijdelijke tabelbeveiliging
- Beheer de retentie van historische gegevens in systeem-geversioneerde tijdtabellen
- Systeemversie-ondersteunde temporele tabellen met geheugen geoptimaliseerde tabellen
- weergaven en functies van metagegevens van tijdelijke tabellen