Kueri Lintas Database

Berlaku untuk:SQL Server

Dimulai dengan SQL Server 2014 (12.x), tabel yang dioptimalkan memori tidak mendukung transaksi lintas database. Anda tidak dapat mengakses database lain dari transaksi yang sama atau kueri yang sama yang juga mengakses tabel yang dioptimalkan memori. Anda tidak dapat dengan mudah menyalin data dari tabel dalam satu database, ke tabel yang dioptimalkan memori di database lain.

Variabel tabel tidak transaksi. Oleh karena itu, variabel tabel yang dioptimalkan memori dapat digunakan dalam kueri lintas database, dan dengan demikian dapat memfasilitasi pemindahan data dari satu database ke tabel yang dioptimalkan memori di tabel lain. Anda dapat menggunakan dua transaksi. Dalam transaksi pertama, masukkan data dari tabel jarak jauh ke dalam variabel. Dalam transaksi kedua, masukkan data ke dalam tabel yang dioptimalkan memori lokal dari variabel. Untuk informasi selengkapnya tentang variabel tabel yang dioptimalkan memori, lihat Tabel sementara dan variabel tabel yang lebih cepat dengan menggunakan pengoptimalan memori.

Contoh

Contoh ini mengilustrasikan metode untuk mentransfer data dari satu database ke dalam tabel yang dioptimalkan memori dalam database yang berbeda.

  1. Buat Objek Uji. Jalankan Transact-SQL berikut di 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 );
    GO
    
  2. Coba kueri lintas database. Jalankan Transact-SQL berikut di SQL Server Management Studio.

    INSERT [DestinationDatabase].[dbo].[DestTable_InMem]
    SELECT * FROM [SourceDatabase].[dbo].[SourceTable]
    

    Anda akan menerima pesan kesalahan berikut:

    Msg 41317, Level 16, State 5
    Transaksi pengguna yang mengakses tabel memori yang dioptimalkan atau modul yang dikompilasi secara asli tidak dapat mengakses lebih dari satu database pengguna atau model database dan msdb, dan tidak dapat menulis ke master.

  3. Buat jenis tabel yang dioptimalkan memori. Jalankan Transact-SQL berikut di 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);  
    GO
    
  4. Coba lagi kueri lintas database. Kali ini data sumber pertama-tama akan ditransfer ke variabel tabel yang dioptimalkan memori. Kemudian data dari variabel dongeng akan ditransfer ke tabel yang dioptimalkan memori.

    -- 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 
    

Lihat Juga

Migrasi ke OLTP Dalam Memori