Dotazy napříč databázemi

platí pro:SQL Server

Počínaje SQL Serverem 2014 (12.x) tabulky optimalizované pro paměť nepodporují transakce mezi databázemi. Nelze získat přístup k jiné databázi ze stejné transakce nebo stejného dotazu, který také přistupuje k tabulce optimalizované pro paměť. Data z tabulky v jedné databázi nelze snadno kopírovat do tabulky optimalizované pro paměť v jiné databázi.

Proměnné tabulky nejsou transakční. Proměnné tabulek optimalizované pro paměť je proto možné použít v dotazech napříč databázemi a usnadnit tak přesun dat z jedné databáze do tabulek optimalizovaných pro paměť v jiné. Můžete použít dvě transakce. V první transakci vložte data ze vzdálené tabulky do proměnné. V druhé transakci vložte data z proměnné do místní tabulky optimalizované pro paměť. Další informace o proměnných tabulek optimalizovaných pro paměť naleznete v tématu Rychlejší dočasná tabulka a proměnná tabulky pomocí optimalizace paměti.

Example

Tento příklad ukazuje metodu přenosu dat z jedné databáze do tabulky optimalizované pro paměť v jiné databázi.

  1. Vytvořte testovací objekty. V aplikaci SQL Server Management Studio spusťte následující Transact-SQL.

    
    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. Pokus o dotaz mezi databázemi V aplikaci SQL Server Management Studio spusťte následující Transact-SQL.

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

    Měla by se zobrazit následující chybová zpráva:

    Msg 41317, Level 16, State 5
    Transakce uživatele, která přistupuje k tabulkám optimalizovaným pro paměť nebo nativně zkompilovaným modulům, nemá přístup k více než jedné uživatelské databázi nebo modelu databáze a msdb a nemůže zapisovat do hlavní databáze.

  3. Vytvořte typ tabulky optimalizovaný pro paměť. V aplikaci SQL Server Management Studio spusťte následující Transact-SQL.

    USE DestinationDatabase;
    GO
    
    CREATE TYPE [dbo].[MemoryType]  
        AS TABLE  
        (  
    	[ID] [int] PRIMARY KEY NONCLUSTERED,
    	[FirstName] nvarchar(8)
        )  
        WITH  
            (MEMORY_OPTIMIZED = ON);  
    GO
    
  4. Zkuste znovu dotaz mezi databázemi. Tentokrát se zdrojová data nejprve přenesou do proměnné tabulky optimalizované pro paměť. Data z proměnné příběhu se pak přenesou do tabulky optimalizované pro paměť.

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

Viz také

Migrace na In-Memory OLTP