Domanda

Di recente, ho iniziato a modificare alcune delle nostre applicazioni per supportare MS SQL Server come back-end alternativo.

Uno dei problemi di compatibilità che ho riscontrato è l'uso di CREATE TEMPORARY TABLE di MySQL per creare tabelle in memoria che contengono dati per un accesso molto rapido durante una sessione senza necessità di archiviazione permanente.

Qual è l'equivalente in MS SQL?

Un requisito è che devo essere in grado di utilizzare la tabella temporanea come qualsiasi altra, in particolare JOIN con quelli permanenti.

È stato utile?

Soluzione

@Keith

Questo è un malinteso comune:Le variabili della tabella NON sono necessariamente archiviate in memoria.Infatti SQL Server decide se mantenere la variabile in memoria o riversarla su TempDB.Non esiste un modo affidabile (almeno in SQL Server 2005) per garantire che i dati della tabella vengano mantenuti in memoria.Per informazioni più dettagliate guarda Qui

Altri suggerimenti

Puoi creare variabili di tabella (in memoria) e due diversi tipi di tabelle temporanee:

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

Modificare:

A seguito del feedback penso che questo abbia bisogno di un piccolo chiarimento.

#table E ##table sarà sempre in TempDB.

@Table le variabili saranno normalmente in memoria, ma non è garantito che lo siano.SQL decide in base al piano di query e utilizza TempDB se necessario.

Puoi dichiarare una "variabile di tabella" in SQL Server 2005, in questo modo:

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

Quindi ti riferisci ad esso proprio come una variabile:

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

Non è necessario eliminarlo: scompare quando la variabile esce dall'ambito.

È possibile con MS SQL Server 2014.

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

Ecco un esempio di codice di generazione SQL (da 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

Una buona post del blog qui ma fondamentalmente prefisso le tabelle temporanee locali con # e la temperatura globale con ## - ad es

CREATE TABLE #localtemp

Capisco cosa stai cercando di ottenere.Benvenuti nel mondo dei database più diversi!

SQL Server 2000 supporta tabelle temporanee create anteponendo un # al nome della tabella, rendendola una tabella temporanea accessibile localmente (locale alla sessione) e precedendo ## al nome della tabella, per tabelle temporanee accessibili a livello globale, ad esempio #MyLocalTable e ##MyGlobalTable rispettivamente.

SQL Server 2005 e versioni successive supportano sia le tabelle temporanee (locali, globali) che le variabili di tabella: fai attenzione alle nuove funzionalità sulle variabili di tabella in SQL 2008 e rilasciane due!La differenza tra tabelle temporanee e variabili di tabella non è così grande ma risiede nel modo in cui il server del database le gestisce.

Non vorrei parlare di versioni precedenti di SQL Server come 7, 6, anche se ho lavorato con loro ed è comunque da lì che vengo :-)

È comune pensare che le variabili di tabella risiedano sempre in memoria, ma questo è sbagliato.A seconda dell'utilizzo della memoria e del volume delle transazioni del server database, le pagine di una variabile di tabella possono essere esportate dalla memoria e scritte in tempdb e il resto dell'elaborazione avviene lì (in tempdb).

Tieni presente che tempdb è un database su un'istanza senza oggetti permanenti in natura, ma è responsabile della gestione dei carichi di lavoro che coinvolgono transazioni secondarie come l'ordinamento e altri lavori di elaborazione di natura temporanea.D'altro canto, le variabili di tabella (solitamente con dati più piccoli) vengono mantenute in memoria (RAM) rendendone l'accesso più veloce e quindi meno I/O su disco in termini di utilizzo dell'unità tempdb quando si utilizzano variabili di tabella con dati più piccoli rispetto alle tabelle temporanee che sempre accedi a tempdb.

Le variabili di tabella non possono essere indicizzate mentre le tabelle temporanee (sia locali che globali) possono essere indicizzate per un'elaborazione più rapida nel caso in cui la quantità di dati sia grande.Quindi conosci la tua scelta in caso di elaborazione più rapida con volumi di dati maggiori tramite transazioni temporanee.Vale anche la pena notare che le transazioni sulle sole variabili di tabella non vengono registrate e non possono essere ripristinate mentre quelle eseguite su tabelle temporanee possono essere ripristinate!

In sintesi, le variabili di tabella sono migliori per i dati più piccoli mentre le tabelle temporanee sono migliori per i dati più grandi elaborati temporaneamente.Se desideri anche un controllo adeguato delle transazioni utilizzando i blocchi di transazioni, le variabili di tabella non sono un'opzione per ripristinare le transazioni, quindi in questo caso è meglio utilizzare tabelle temporanee.

Infine, le tabelle temporanee aumenteranno sempre l'I/O del disco poiché utilizzano sempre tempdb mentre le variabili della tabella potrebbero non aumentarlo, a seconda dei livelli di stress della memoria.

Fammi sapere se vuoi consigli su come ottimizzare il tuo tempdb per ottenere prestazioni molto più veloci per superare il 100%!

La sintassi che desideri è:

crea la tabella #nometabella

Il prefisso # identifica la tabella come tabella temporanea.

CREA TABELLA #tmpnometabella

Utilizza il prefisso cancelletto/cancelletto

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top