Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Vanaf SQL Server 2014 (12.x) bieden tabellen die zijn geoptimaliseerd voor geheugen geen ondersteuning voor transacties tussen databases. U hebt geen toegang tot een andere database vanuit dezelfde transactie of dezelfde query die ook toegang heeft tot een tabel die is geoptimaliseerd voor geheugen. U kunt gegevens uit een tabel in de ene database niet eenvoudig kopiëren naar een tabel die is geoptimaliseerd voor geheugen in een andere database.
Tabelvariabelen zijn niet transactioneel. Daarom kunnen tabelvariabelen die zijn geoptimaliseerd voor geheugen, worden gebruikt in query's voor meerdere databases en kunnen gegevens dus worden verplaatst van de ene database naar tabellen die zijn geoptimaliseerd voor geheugen in een andere. U kunt twee transacties gebruiken. In de eerste transactie voegt u de gegevens uit de externe tabel in de variabele in. Voeg in de tweede transactie de gegevens in de tabel die is geoptimaliseerd voor lokaal geheugen in vanuit de variabele. Zie Snellere tijdelijke tabel- en tabelvariabelen met behulp van geheugenoptimalisatie voor meer informatie over tabelvariabelen die zijn geoptimaliseerd voor geheugen.
Example
In dit voorbeeld ziet u een methode voor het overdragen van gegevens uit de ene database naar een tabel die is geoptimaliseerd voor geheugen in een andere database.
Testobjecten maken. Voer de volgende Transact-SQL uit in SQL Server Management Studio.
USE master; GO SET NOCOUNT ON; -- Create simple database CREATE DATABASE SourceDatabase; ALTER DATABASE SourceDatabase SET RECOVERY SIMPLE; GO -- Create a table and insert a few records USE SourceDatabase; CREATE TABLE SourceDatabase.[dbo].[SourceTable] ( [ID] [int] PRIMARY KEY CLUSTERED, [FirstName] nvarchar(8) ); INSERT [SourceDatabase].[dbo].[SourceTable] VALUES (1, N'Bob'), (2, N'Susan'); GO -- Create a database with a MEMORY_OPTIMIZED_DATA filegroup CREATE DATABASE DestinationDatabase ON PRIMARY ( NAME = N'DestinationDatabase_Data', FILENAME = N'D:\DATA\DestinationDatabase_Data.mdf', SIZE = 8MB), FILEGROUP [DestinationDatabase_mod] CONTAINS MEMORY_OPTIMIZED_DATA DEFAULT ( NAME = N'DestinationDatabase_mod', FILENAME = N'D:\DATA\DestinationDatabase_mod', MAXSIZE = UNLIMITED) LOG ON ( NAME = N'DestinationDatabase_Log', FILENAME = N'D:\LOG\DestinationDatabase_Log.ldf', SIZE = 8MB); ALTER DATABASE DestinationDatabase SET RECOVERY SIMPLE; GO USE DestinationDatabase; GO -- Create a memory-optimized table CREATE TABLE [dbo].[DestTable_InMem] ( [ID] [int] PRIMARY KEY NONCLUSTERED, [FirstName] nvarchar(8) ) WITH ( MEMORY_OPTIMIZED = ON, DURABILITY = SCHEMA_AND_DATA ); GOProbeer query's voor meerdere databases uit te voeren. Voer de volgende Transact-SQL uit in SQL Server Management Studio.
INSERT [DestinationDatabase].[dbo].[DestTable_InMem] SELECT * FROM [SourceDatabase].[dbo].[SourceTable]U ontvangt het volgende foutbericht:
Msg 41317, Niveau 16, Staat 5
Een gebruikerstransactie die toegang heeft tot voor geheugen geoptimaliseerde tabellen of systeemeigen gecompileerde modules, heeft geen toegang tot meer dan één gebruikersdatabase of databasesmodel en msdb, en kan niet naar de hoofdserver schrijven.Maak een tabeltype dat is geoptimaliseerd voor geheugen. Voer de volgende Transact-SQL uit in SQL Server Management Studio.
USE DestinationDatabase; GO CREATE TYPE [dbo].[MemoryType] AS TABLE ( [ID] [int] PRIMARY KEY NONCLUSTERED, [FirstName] nvarchar(8) ) WITH (MEMORY_OPTIMIZED = ON); GOProbeer de query voor meerdere databases opnieuw uit te voeren. Deze keer worden de brongegevens eerst overgebracht naar een tabelvariabele die is geoptimaliseerd voor geheugen. Vervolgens worden de gegevens uit de talevariabele overgebracht naar de tabel die is geoptimaliseerd voor geheugen.
-- Declare table variable utilizing the newly created type - MemoryType DECLARE @InMem dbo.MemoryType; -- Populate table variable INSERT @InMem SELECT * FROM SourceDatabase.[dbo].[SourceTable]; -- Populate the destination memory-optimized table INSERT [DestinationDatabase].[dbo].[DestTable_InMem] SELECT * FROM @InMem; GO