Compilación nativa de tablas y procedimientos almacenadosNative Compilation of Tables and Stored Procedures

Se aplica a:Applies to: síSQL ServerSQL Server (todas las versiones admitidas) yesSQL ServerSQL Server (all supported versions) SíAzure SQL DatabaseAzure SQL DatabaseYesAzure SQL DatabaseAzure SQL DatabaseSe aplica a:Applies to: síSQL ServerSQL Server (todas las versiones admitidas) yesSQL ServerSQL Server (all supported versions) SíAzure SQL DatabaseAzure SQL DatabaseYesAzure SQL DatabaseAzure SQL Database

OLTP en memoria introduce el concepto de compilación nativa.In-Memory OLTP introduces the concept of native compilation. SQL ServerSQL Server puede compilar de forma nativa procedimientos almacenados que acceden a tablas optimizadas para memoria.can natively compile stored procedures that access memory-optimized tables. SQL ServerSQL Server también puede compilar de forma nativa las tablas optimizadas para memoria.is also able to natively compile memory-optimized tables. La compilación nativa permite un acceso más rápido a los datos y una ejecución de consultas más eficiente que el lenguaje Transact-SQLTransact-SQLinterpretado (tradicional).Native compilation allows faster data access and more efficient query execution than interpreted (traditional) Transact-SQLTransact-SQL. La compilación nativa de tablas y procedimientos almacenados produce los archivos DLL.Native compilation of tables and stored procedures produce DLLs.

Se admite también la compilación nativa de los tipos de tabla con optimización para memoria.Native compilation of memory optimized table types is also supported. Para obtener más información, vea Faster temp table and table variable by using memory optimization (Tabla temporal y variable de tabla más rápidas con optimización de memoria).For more information, see Faster temp table and table variable by using memory optimization.

La compilación nativa se refiere al proceso de convertir construcciones de programación a código nativo, que consta de instrucciones de procesador sin necesidad de compilación o interpretación adicional.Native compilation refers to the process of converting programming constructs to native code, consisting of processor instructions without the need for further compilation or interpretation.

OLTP en memoria compila las tablas optimizadas para memoria cuando se crean, y los procedimientos almacenados compilados de forma nativa cuando se cargan en archivos DLL nativos.In-Memory OLTP compiles memory-optimized tables when they are created, and natively compiled stored procedures when they are loaded to native DLLs. Además, los archivos DLL se recompilan tras reiniciar una base de datos o un servidor.In addition, the DLLs are recompiled after a database or server restart. La información necesaria para volver a crear los archivos DLL se almacena en los metadatos de la base de datos.The information necessary to recreate the DLLs is stored in the database metadata. Los archivos DLL no forman parte de la base de datos, aunque están asociados a la base de datos.The DLLs are not part of the database, though they are associated with the database. Por ejemplo, los archivos DLL no se incluyen en las copias de seguridad de bases de datos.For example, the DLLs are not included in database backups.

Nota

Las tablas con optimización para memoria se vuelven a compilar durante un reinicio del servidor.Memory-optimized tables are recompiled during a server restart. Para acelerar la recuperación de bases de datos, los procedimientos almacenados compilados de forma nativa no se vuelven a compilar durante un reinicio del servidor, sino que se compilan en el momento de la primera ejecución.To speed up database recovery, natively compiled stored procedures are not recompiled during a server restart, they are compiled at the time of first execution. Como consecuencia de esta compilación diferida, los procedimientos almacenados compilados de forma nativa solo aparecen al llamar a sys.dm_os_loaded_modules (Transact-SQL) tras la primera ejecución.As a result of this deferred compilation, natively compiled stored procedures only appear when calling sys.dm_os_loaded_modules (Transact-SQL) after first execution.

Mantenimiento de los archivos DLL de OLTP en memoriaMaintenance of In-Memory OLTP DLLs

La consulta siguiente muestra todos los archivos DLL de tablas y procedimientos almacenados cargados actualmente en la memoria del servidor:The following query shows all table and stored procedure DLLs currently loaded in memory on the server:

SELECT
        mod1.name,
        mod1.description
    from
        sys.dm_os_loaded_modules  as mod1
    where
        mod1.description = 'XTP Native DLL';

Los administradores de bases de datos no necesitan mantener los archivos generados por una compilación nativa.Database administrators do not need to maintain files that are generated by a native compilation. SQL ServerSQL Server quita automáticamente los archivos generados que ya no son necesarios.automatically removes generated files that are no longer needed. Por ejemplo, los archivos generados se eliminarán cuando se elimine una tabla o un procedimiento almacenado, o si se quita una base de datos.For example, generated files will be deleted when a table and stored procedure is deleted, or if a database is dropped.

Nota

Si la compilación produce un error o se interrumpe, algunos archivos generados no se eliminan.If compilation fails or is interrupted, some generated files are not removed. Estos archivos se dejan intencionadamente por motivos de compatibilidad y se quitan cuando se quita la base de datos.These files are intentionally left behind for supportability and are removed when the database is dropped.

Nota

SQL Server compila los archivos DLL para todas las tablas necesarias para la recuperación de la base de datos.SQL Server compiles DLLs for all tables needed for database recovery. Si se quita una tabla justo antes de un reinicio de la base de datos, puede haber residuos de la tabla en los archivos de punto de control o en el registro de transacciones, de modo que puede volver a compilar el archivo DLL de la tabla durante el inicio de la base de datos.If a table was dropped just prior to a database restart there can still be remnants of the table in the checkpoint files or the transaction log so the DLL for the table might be recompiled during database startup. Después de reiniciar, el archivo DLL se descargará y se quitarán los archivos con el proceso de limpieza normal.After restart the DLL will be unloaded and the files will be removed by the normal cleanup process.

Compilación nativa de tablasNative Compilation of Tables

Al crear una tabla optimizada para memoria mediante la instrucción CREATE TABLE , la información de la tabla se escribe en los metadatos de la base de datos y se crean las estructuras de tabla y de índice en la memoria.Creating a memory-optimized table using the CREATE TABLE statement results in the table information being written to the database metadata and the table and index structures created in memory. Además, la tabla se compila en un archivo DLL.The table will also be compiled to a DLL.

Considere el script de ejemplo siguiente, que crea una base de datos y una tabla optimizada para memoria:Consider the following sample script, which creates a database and a memory-optimized table:

USE master;
GO

CREATE DATABASE DbMemopt3;
GO

ALTER DATABASE DbMemopt3
    add filegroup DbMemopt3_mod_memopt_1_fg
        contains memory_optimized_data
;
GO

-- You must edit the front portion of filename= path, to where your DATA\ subdirectory is,
-- keeping only the trailing portion '\DATA\DbMemopt3_mod_memopt_1_fn'!

ALTER DATABASE DbMemopt3
    add file
    (
        name     = 'DbMemopt3_mod_memopt_1_name',
        filename = 'C:\DATA\DbMemopt3_mod_memopt_1_fn'

        --filename = 'C:\Program Files\Microsoft SQL Server\MSSQL13.SQLSVR2016ID\MSSQL\DATA\DbMemopt3_mod_memopt_1_fn'
    )
        to filegroup DbMemopt3_mod_memopt_1_fg
;
GO

USE DbMemopt3;
GO

CREATE TABLE dbo.t1
(
    c1 int not null primary key nonclustered,
    c2 int
)
    with (memory_optimized = on)
;
GO



-- You can safely rerun from here to the end.

-- Retrieve the path of the DLL for table t1.


DECLARE @moduleName  nvarchar(256);

SET @moduleName =
    (
        '%xtp_t_' +
        cast(db_id() as nvarchar(16)) +
        '_' +
        cast(object_id('dbo.t1') as nvarchar(16)) +
        '%.dll'
    )
;


-- SEARCHED FOR NAME EXAMPLE:  mod1.name LIKE '%xtp_t_8_565577053%.dll'
PRINT @moduleName;


SELECT
        mod1.name,
        mod1.description
    from
        sys.dm_os_loaded_modules  as mod1
    where
        mod1.name LIKE @moduleName
    order by
        mod1.name
;
-- ACTUAL NAME EXAMPLE:  mod1.name = 'C:\Program Files\Microsoft SQL Server\MSSQL13.SQLSVR2016ID\MSSQL\DATA\xtp\8\xtp_t_8_565577053_184009305855461.dll'
GO

--   DROP DATABASE DbMemopt3;  -- Clean up.
GO

Al crear la tabla, también se crea el archivo DLL de la tabla y se carga en memoria.Creating the table also creates the table DLL and loads the DLL in memory. La consulta DMV que aparece inmediatamente después de la instrucción CREATE TABLE recupera la ruta de acceso del archivo DLL de la tabla.The DMV query immediately after the CREATE TABLE statement retrieves the path of the table DLL.

El archivo DLL de la tabla entiende las estructuras de índice y el formato de fila de la tabla.The table DLL understands the index structures and row format of the table. SQL ServerSQL Server utiliza el archivo DLL para recorrer índices, recuperar filas y almacenar el contenido de estas.uses the DLL for traversing indexes, retrieving rows, as well as storing the contents of the rows.

Compilación nativa de procedimientos almacenadosNative Compilation of Stored Procedures

Los procedimientos almacenados marcados con NATIVE_COMPILATION se compilan de forma nativa.Stored procedures that are marked with NATIVE_COMPILATION are natively compiled. Esto significa que todas las instrucciones Transact-SQLTransact-SQL del procedimiento se compilan en código nativo para lograr una ejecución eficaz de la lógica de negocios de rendimiento crítico.This means the Transact-SQLTransact-SQL statements in the procedure are all compiled to native code for efficient execution of performance-critical business logic.

Para obtener más información acerca de los procedimientos almacenados compilados de forma nativa, vea Natively Compiled Stored Procedures.For more information about natively compiled stored procedures, see Natively Compiled Stored Procedures.

Considere el procedimiento almacenado de ejemplo siguiente, que inserta filas en la tabla t1 del ejemplo anterior:Consider the following sample stored procedure, which inserts rows in the table t1 from the previous example:

CREATE PROCEDURE dbo.native_sp
    with native_compilation,
         schemabinding,
         execute as owner
as
begin atomic
    with (transaction isolation level = snapshot,
          language = N'us_english')

    DECLARE @i int = 1000000;

    WHILE @i > 0
    begin
        INSERT dbo.t1 values (@i, @i+1);
        SET @i -= 1;
    end
end;
GO

EXECUTE dbo.native_sp;
GO

-- Reset.

DELETE from dbo.t1;
GO

El archivo DLL de native_sp puede interactuar directamente con el archivo DLL de t1, así como con el motor de almacenamiento de OLTP en memoria, para insertar las filas a la mayor velocidad posible.The DLL for native_sp can interact directly with the DLL for t1, as well as the In-Memory OLTP storage engine, to insert the rows as fast as possible.

El compilador de OLTP en memoria utiliza el optimizador de consultas para crear un plan de ejecución eficaz para cada una de las consultas del procedimiento almacenado.The In-Memory OLTP compiler leverages the query optimizer to create an efficient execution plan for each of the queries in the stored procedure. Tenga en cuenta que los procedimientos almacenados compilados de forma nativa no se recompilan automáticamente si cambian los datos de la tabla.Note that natively compiled stored procedures are not automatically recompiled if the data in the table changes. Para obtener más información sobre el mantenimiento de estadísticas y procedimientos almacenados con OLTP en memoria, vea Estadísticas para las tablas con optimización para memoria.For more information on maintaining statistics and stored procedures with In-Memory OLTP see Statistics for Memory-Optimized Tables.

Consideraciones de seguridad para la compilación nativaSecurity Considerations for Native Compilation

La compilación nativa de tablas y procedimientos almacenados utiliza el compilador de OLTP en memoria.Native compilation of tables and stored procedures uses the In-Memory OLTP compiler. Este compilador genera archivos que se escriben en el disco y se cargan en la memoria.This compiler produces files that are written to disk and loaded into memory. SQL ServerSQL Server utiliza los siguientes mecanismos para restringir el acceso a estos archivos.uses the following mechanisms to limit access to these files.

Compilador nativoNative Compiler

El archivo ejecutable del compilador, así como los archivos binarios y de encabezado necesarios para la compilación nativa, se instalan como parte de la instancia de SQL ServerSQL Server en la carpeta MSSQL\Binn\Xtp.The compiler executable, as well as binaries and header files required for native compilation are installed as part of the SQL ServerSQL Server instance under the folder MSSQL\Binn\Xtp. Así, si la instancia predeterminada se instala en C:\Archivos de programa, los archivos del compilador se instalan en C:\Archivos de programa\MicrosoftMicrosoftSQL ServerSQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn\Xtp.So, if the default instance is installed under C:\Program Files, the compiler files are installed in C:\Program Files\MicrosoftMicrosoftSQL ServerSQL Server\MSSQL13.MSSQLSERVER\MSSQL\Binn\Xtp.

Para limitar el acceso al compilador, SQL ServerSQL Server utiliza listas de control de acceso (ACL) para restringir el acceso a los archivos binarios.To limit access to the compiler, SQL ServerSQL Server uses access control lists (ACLs) to restrict access to binary files. Todos los archivos binarios de SQL ServerSQL Server están protegidos frente a su modificación o alteración mediante ACL.All SQL ServerSQL Server binaries are protected against modification or tampering through ACLs. Las ACL del compilador nativo también limitan el uso del compilador; solo la cuenta de servicio y los administradores del sistema de SQL ServerSQL Server tienen permisos de ejecución y de lectura para los archivos del compilador nativo.The native compiler's ACLs also limit use of the compiler; only the SQL ServerSQL Server service account and system administrators have read and execute permissions for native compiler files.

Archivos generados por una compilación nativaFiles Generated by a Native Compilation

Entre los archivos que se generan cuando se compila una tabla o un procedimiento almacenado se incluyen los archivos intermedios y DLL, incluidos aquellos que tienen las extensiones siguientes: .c, .obj, .xml y .pdb.The files produced when a table or stored procedure is compiled include the DLL and intermediate files including files with the following extensions: .c, .obj, .xml, and .pdb. Los archivos generados se guardan en una subcarpeta de la carpeta de datos predeterminada.The generated files are saved in a subfolder of the default data folder. La subcarpeta se denomina Xtp.The subfolder is called Xtp. Al instalar la instancia predeterminada con la carpeta de datos predeterminada, los archivos generados se colocan en C:\Archivos de programa\MicrosoftMicrosoftSQL ServerSQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\Xtp.When installing the default instance with the default data folder, the generated files are placed in C:\Program Files\MicrosoftMicrosoftSQL ServerSQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\Xtp.

SQL ServerSQL Server evita la alteración con las DLL generadas de tres maneras:prevents tampering with the generated DLLs in three ways:

  • Cuando una tabla o un procedimiento almacenado se compila en un archivo DLL, este archivo se carga en memoria y se vincula al proceso sqlserver.exe inmediatamente.When a table or stored procedure is compiled to a DLL, this DLL is immediately loaded into memory and linked to the sqlserver.exe process. Un archivo DLL no se puede modificar mientras esté vinculado a un proceso.A DLL cannot be modified while it is linked to a process.

  • Cuando se reinicia una base de datos, se recompilan todas las tablas y los procedimientos almacenados (se quitan y se vuelven a crear) según los metadatos de la base de datos.When a database is restarted, all tables and stored procedures are recompiled (removed and recreated) based on the database metadata. De este modo, se quitará cualquier cambio realizado en un archivo generado por un agente malintencionado.This will remove any changes made to a generated file by a malicious agent.

  • Los archivos generados se consideran parte de los datos de usuario y tienen las mismas restricciones de seguridad, mediante ACL, que los archivos de base de datos: solo los administradores del sistema y la cuenta de servicio de SQL ServerSQL Server pueden tener acceso a estos archivos.The generated files are considered part of user data, and have the same security restrictions, via ACLs, as database files: only the SQL ServerSQL Server service account and system administrators can access these files.

No se necesita ninguna interacción del usuario para administrar estos archivos.No user interaction is needed to manage these files. SQL ServerSQL Server creará y quitará los archivos según sea necesario.will create and remove the files as necessary.

Consulte tambiénSee Also

Tablas optimizadas para la memoriaMemory-Optimized Tables

Procedimientos almacenados compilados de forma nativaNatively Compiled Stored Procedures