Eventos
31 mar, 23 - 2 abr, 23
Evento de aprendizaje de SQL, Fabric y Power BI más grande. 31 de marzo – 2 de abril. Use el código FABINSIDER para ahorrar $400.
Regístrate hoyEste explorador ya no se admite.
Actualice a Microsoft Edge para aprovechar las características y actualizaciones de seguridad más recientes, y disponer de soporte técnico.
Se aplica a: SQL Server
Desde SQL Server 2014 (12.x), las tablas optimizadas para memoria no admiten las transacciones entre bases de datos. No puede tener acceso a otra base de datos desde la misma transacción o desde la misma consulta que tiene acceso también a una tabla optimizada para memoria. No puede copiar fácilmente los datos de una tabla de una base de datos en una tabla optimizada para memoria de otra base de datos.
Las variables de tabla no son transaccionales. Por tanto, se pueden utilizar las variables de tabla optimizada para memoria en consultas entre bases de datos y pueden así facilitar la migración de datos de una base de datos a tablas optimizadas para memoria de otra. Puede utilizar dos transacciones. En la primera transacción, inserte los datos de la tabla remota en la variable. En la segunda transacción, inserte los datos en la tabla optimizada para memoria local desde la variable. Para más información sobre las variables de tabla optimizada para memoria, consulte Tabla temporal y variante de tabla más rápidas utilizando la optimización para memoria.
En este ejemplo se muestra un método para transferir datos desde una base de datos a una tabla optimizada para memoria en una tabla de datos distinta.
Cree objetos de prueba. Ejecute el siguiente Transact-SQL en 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
Intente ejecutar una consulta a través de las bases de datos. Ejecute el siguiente Transact-SQL en SQL Server Management Studio.
INSERT [DestinationDatabase].[dbo].[DestTable_InMem]
SELECT * FROM [SourceDatabase].[dbo].[SourceTable]
Debería recibir el siguiente mensaje de error:
Mensaje 41317, nivel 16, estado 5
Una transacción de usuario que accede a tablas con optimización para memoria o módulos compilados de forma nativa no puede acceder a más de una base de datos de usuario o a las bases de datos modelo y msdb, y no puede escribir en la base de datos maestra.
Cree un tipo de tabla optimizada para memoria. Ejecute el siguiente Transact-SQL en 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
Vuelva a intentar ejecutar la consulta a través de las bases de datos. Esta vez, los datos de origen se transmitirán primero a una variable de tabla optimizada para memoria. Luego los datos de la variable de tabla se transferirán a la tabla optimizada para memoria.
-- 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
Eventos
31 mar, 23 - 2 abr, 23
Evento de aprendizaje de SQL, Fabric y Power BI más grande. 31 de marzo – 2 de abril. Use el código FABINSIDER para ahorrar $400.
Regístrate hoyCursos
Módulo
Creación de tablas, vistas y objetos temporales - Training
Este contenido forma parte de Creación de tablas, vistas y objetos temporales.