Pregunta

Recientemente, comencé a cambiar algunas de nuestras aplicaciones para admitir MS SQL Server como back-end alternativo.

Uno de los problemas de compatibilidad con los que me encontré es el uso de CREATE TEMPORARY TABLE de MySQL para crear tablas en memoria que contienen datos para un acceso muy rápido durante una sesión sin necesidad de almacenamiento permanente.

¿Cuál es el equivalente en MS SQL?

Un requisito es que necesito poder usar la tabla temporal como cualquier otra, especialmente JOIN con los permanentes.

¿Fue útil?

Solución

@Keith

Este es un error común:Las variables de la tabla NO necesariamente se almacenan en la memoria.De hecho, SQL Server decide si mantiene la variable en la memoria o la transfiere a TempDB.No existe una forma confiable (al menos en SQL Server 2005) de garantizar que los datos de la tabla se mantengan en la memoria.Para información más detallada mira aquí

Otros consejos

Puede crear variables de tabla (en memoria) y dos tipos diferentes de tablas temporales:

--visible only to me, in memory (SQL 2000 and above only)
declare @test table (
    Field1 int,
    Field2 nvarchar(50)
);

--visible only to me, stored in tempDB
create table #test (
    Field1 int,
    Field2 nvarchar(50)
)

--visible to everyone, stored in tempDB
create table ##test (
    Field1 int,
    Field2 nvarchar(50)
)

Editar:

Tras los comentarios, creo que esto necesita una pequeña aclaración.

#table y ##table siempre estará en TempDB.

@Table Las variables normalmente estarán en la memoria, pero no se garantiza que lo estén.SQL decide según el plan de consulta y utiliza TempDB si es necesario.

Puede declarar una "variable de tabla" en SQL Server 2005, así:

declare @foo table (
    Id int,
    Name varchar(100)
);

Luego te refieres a él como a una variable:

select * from @foo f
    join bar b on b.Id = f.Id

No es necesario eliminarlo: desaparece cuando la variable sale del alcance.

Es posible con MS SQL Server 2014.

Ver: http://msdn.microsoft.com/en-us/library/dn133079.aspx

Aquí hay un ejemplo de código de generación SQL (de MSDN):

-- create a database with a memory-optimized filegroup and a container.
CREATE DATABASE imoltp 
GO

ALTER DATABASE imoltp ADD FILEGROUP imoltp_mod CONTAINS MEMORY_OPTIMIZED_DATA 
ALTER DATABASE imoltp ADD FILE (name='imoltp_mod1', filename='c:\data\imoltp_mod1') TO FILEGROUP imoltp_mod 
ALTER DATABASE imoltp SET MEMORY_OPTIMIZED_ELEVATE_TO_SNAPSHOT=ON
GO

USE imoltp
GO


-- create a durable (data will be persisted) memory-optimized table
-- two of the columns are indexed
CREATE TABLE dbo.ShoppingCart ( 
  ShoppingCartId INT IDENTITY(1,1) PRIMARY KEY NONCLUSTERED,
  UserId INT NOT NULL INDEX ix_UserId NONCLUSTERED HASH WITH (BUCKET_COUNT=1000000), 
  CreatedDate DATETIME2 NOT NULL, 
  TotalPrice MONEY
  ) WITH (MEMORY_OPTIMIZED=ON) 
GO

 -- create a non-durable table. Data will not be persisted, data loss if the server turns off unexpectedly
CREATE TABLE dbo.UserSession ( 
  SessionId INT IDENTITY(1,1) PRIMARY KEY NONCLUSTERED HASH WITH (BUCKET_COUNT=400000), 
  UserId int NOT NULL, 
  CreatedDate DATETIME2 NOT NULL,
  ShoppingCartId INT,
  INDEX ix_UserId NONCLUSTERED HASH (UserId) WITH (BUCKET_COUNT=400000) 
  ) WITH (MEMORY_OPTIMIZED=ON, DURABILITY=SCHEMA_ONLY) 
GO

Un bien publicación de blog aquí pero básicamente anteponga las tablas temporales locales con # y la temperatura global con ##, por ejemplo

CREATE TABLE #localtemp

Entiendo lo que estás tratando de lograr.¡Bienvenido al mundo de una variedad de bases de datos!

SQL Server 2000 admite tablas temporales creadas anteponiendo un # al nombre de la tabla, convirtiéndola en una tabla temporal accesible localmente (local para la sesión) y precediendo ## al nombre de la tabla, para tablas temporales accesibles globalmente, por ejemplo, #MyLocalTable y ##MyGlobalTable. respectivamente.

SQL Server 2005 y versiones posteriores admiten tablas temporales (locales, globales) y variables de tabla. ¡Cuidado con las nuevas funciones en variables de tabla en SQL 2008 y versión dos!La diferencia entre tablas temporales y variables de tabla no es tan grande, pero radica en la forma en que las maneja el servidor de la base de datos.

No me gustaría hablar de versiones anteriores de SQL Server como 7, 6, aunque he trabajado con ellas y de todos modos es de donde vengo :-)

Es común pensar que las variables de la tabla siempre residen en la memoria, pero esto es incorrecto.Dependiendo del uso de la memoria y del volumen de transacciones del servidor de la base de datos, las páginas de una variable de tabla pueden exportarse desde la memoria y escribirse en tempdb y el resto del procesamiento se lleva a cabo allí (en tempdb).

Tenga en cuenta que tempdb es una base de datos en una instancia sin objetos permanentes por naturaleza, pero es responsable de manejar cargas de trabajo que involucran transacciones secundarias como clasificación y otros trabajos de procesamiento que son de naturaleza temporal.Por otro lado, las variables de tabla (generalmente con datos más pequeños) se mantienen en la memoria (RAM), lo que hace que su acceso sea más rápido y, por lo tanto, menos E/S del disco en términos de uso de la unidad tempdb cuando se usan variables de tabla con datos más pequeños en comparación con las tablas temporales que siempre inicie sesión en tempdb.

Las variables de la tabla no se pueden indexar, mientras que las tablas temporales (tanto locales como globales) se pueden indexar para un procesamiento más rápido en caso de que la cantidad de datos sea grande.Así sabrá cuál es su elección en caso de un procesamiento más rápido con mayores volúmenes de datos mediante transacciones temporales.También vale la pena señalar que las transacciones en variables de tabla por sí solas no se registran y no se pueden revertir, mientras que las realizadas en tablas temporales se pueden revertir.

En resumen, las variables de tabla son mejores para datos más pequeños, mientras que las tablas temporales son mejores para datos más grandes que se procesan temporalmente.Si también desea un control de transacciones adecuado mediante bloques de transacciones, las variables de tabla no son una opción para revertir transacciones, por lo que en este caso será mejor que utilice tablas temporales.

Por último, las tablas temporales siempre aumentarán la E/S del disco, ya que siempre usan tempdb, mientras que es posible que las variables de la tabla no lo aumenten, según los niveles de estrés de la memoria.

¡Avíseme si desea consejos sobre cómo ajustar su tempdb para obtener un rendimiento mucho más rápido y superar el 100%!

La sintaxis que quieres es:

crear tabla #nombretabla

El prefijo # identifica la tabla como una tabla temporal.

CREAR TABLA #tmptablename

Utilice el prefijo del signo almohadilla/almohadilla

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top