Partilhar via


Consultas entre bancos de dados

Aplica-se a:SQL Server

A partir do SQL Server 2014 (12.x), as tabelas otimizadas para memória não suportam transações entre bases de dados. Não é possível acessar outro banco de dados da mesma transação ou da mesma consulta que também acessa uma tabela com otimização de memória. Não é possível copiar facilmente dados de uma tabela numa base de dados para uma tabela otimizada para memória noutra base de dados.

As variáveis de tabela não são transacionais. Assim, variáveis de tabela otimizadas para memória podem ser usadas em consultas entre bases de dados e, assim, facilitam a transferência de dados de uma base de dados para tabelas otimizadas para memória noutra. Pode usar duas transações. Na primeira transação, insere os dados da tabela remota na variável. Na segunda transação, insere os dados na tabela local otimizada para memória a partir da variável. Para mais informações sobre variáveis de tabela otimizadas para memória, veja Tabela temporária mais rápida e variável de tabela com otimização de memória.

Example

Este exemplo ilustra um método para transferir dados de uma base de dados para uma tabela otimizada para memória numa base de dados diferente.

  1. Criar objetos de teste. Execute o seguinte Transact-SQL no 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. Tente consulta entre bases de dados. Execute o seguinte Transact-SQL no SQL Server Management Studio.

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

    Deverá receber a seguinte mensagem de erro:

    Msg 41317, Nível 16, Estado 5
    Uma transação de utilizador que acede a tabelas otimizadas para memória ou módulos compilados nativamente não pode aceder a mais de uma base de dados de utilizador ou às bases de dados model e msdb, e não pode gravar em "master".

  3. Crie um tipo de tabela otimizado para memória. Execute o seguinte Transact-SQL no 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. Tente novamente a consulta entre bases de dados. Desta vez, os dados de origem serão primeiro transferidos para uma variável de tabela otimizada para memória. Depois, os dados da variável tale serão transferidos para a tabela otimizada para memória.

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

Ver também

Migrando para In-Memory OLTP