데이터베이스 간 쿼리Cross-Database Queries

이 항목은 다음에 적용됩니다.예SQL Server(2014부터 시작)아니요Azure SQL Database아니요Azure SQL Data Warehouse 아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO:yesSQL Server (starting with 2014)noAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

SQL Server 2014SQL Server 2014부터 메모리 액세스에 최적화된 테이블은 데이터베이스 간 트랜잭션을 지원하지 않습니다.Starting with SQL Server 2014SQL Server 2014, memory-optimized tables do not support cross-database transactions. 메모리 액세스에 최적화된 테이블에도 액세스하는 동일한 쿼리 또는 동일한 트랜잭션에서 다른 데이터베이스에 액세스할 수 없습니다.You cannot access another database from the same transaction or the same query that also accesses a memory-optimized table. 데이터베이스의 테이블에서 다른 데이터베이스에 있는 메모리 액세스에 최적화된 테이블로 데이터를 쉽게 복사할 수 없습니다.You cannot easily copy data from a table in one database, to a memory-optimized table in another database.

테이블 변수는 트랜잭션 변수가 아닙니다.Table variables are not transactional. 메모리 액세스에 최적화된 테이블 변수는 데이터베이스 간 쿼리에 사용할 수 있으므로, 데이터베이스의 데이터를 다른 데이터베이스에 있는 메모리 액세스에 최적화된 테이블로 쉽게 이동할 수 있습니다.Therefore, memory-optimized table variables can be used in cross-database queries, and can thus facilitate moving data from one database into memory-optimized tables in another. 두 트랜잭션을 사용할 수 있습니다.You can use two transactions. 첫 번째 트랜잭션에서 원격 테이블의 데이터를 변수에 삽입합니다.In the first transaction, insert the data from the remote table into the variable. 두 번째 트랜잭션에서 변수의 데이터를 메모리 액세스에 최적화된 로컬 테이블에 삽입합니다.In the second transaction, insert the data into the local memory-optimized table from the variable. 메모리 액세스에 최적화된 테이블 변수에 대한 자세한 내용은 메모리 최적화를 사용하여 임시 테이블 및 테이블 변수 성능 향상을 참조하세요.For more information on memory-optimized table variables, see Faster temp table and table variable by using memory optimization.

예제Example

이 예제에는 한 데이터베이스의 데이터를 다른 데이터베이스에서 메모리 액세스에 최적화된 테이블로 전송하는 방법을 보여 줍니다.This example illustrates a method to transfer data from one database into a memory-optimized table in a different database.

  1. 테스트 개체를 만듭니다.Create Test Objects. Transact-SQLTransact-SQL 에서 다음 SQL Server Management StudioSQL Server Management Studio명령을 실행합니다.Execute the following Transact-SQLTransact-SQL in SQL Server Management StudioSQL 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. 데이터베이스 간 쿼리를 시도합니다.Attempt cross-database query. Transact-SQLTransact-SQL 에서 다음 SQL Server Management StudioSQL Server Management Studio명령을 실행합니다.Execute the following Transact-SQLTransact-SQL in SQL Server Management StudioSQL Server Management Studio.

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

    다음과 같은 오류 메시지가 나타납니다.You should receive the following error message:

    메시지 41317, 수준 16, 상태 5Msg 41317, Level 16, State 5
    메모리 액세스에 최적화된 테이블 또는 고유하게 컴파일된 모듈에 액세스하는 사용자 트랜잭션은 둘 이상의 사용자 데이터베이스 또는 데이터베이스 모델 및 msdb에 액세스할 수 없으며 master에 쓸 수 없습니다.A user transaction that accesses memory optimized tables or natively compiled modules cannot access more than one user database or databases model and msdb, and it cannot write to master.

  3. 메모리 액세스에 최적화된 테이블 형식을 만듭니다.Create a memory-optimized table type. Transact-SQLTransact-SQL 에서 다음 SQL Server Management StudioSQL Server Management Studio명령을 실행합니다.Execute the following Transact-SQLTransact-SQL in SQL Server Management StudioSQL 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. 데이터베이스 간 쿼리를 다시 시도합니다.Re-attempt the cross-database query. 이때 원본 데이터가 먼저 메모리 액세스에 최적화된 테이블 변수로 전송됩니다.This time the source data will first be transferred to a memory-optimized table variable. 그런 다음 테이블 변수의 데이터가 메모리 액세스에 최적화된 테이블에 전송됩니다.Then the data from the tale variable will be transferred to the memory-optimized table.

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

관련 항목:See Also

메모리 내 OLTP로 마이그레이션Migrating to In-Memory OLTP