MS-SQL supporta le tabelle di memoria?

Di recente, ho iniziato a cambiare alcune delle nostre applicazioni per il supporto MS SQL Server come alternativa back-end.

Uno dei problemi di compatibilità che ho trovato è l’uso di MySQL CREARE una TABELLA TEMPORANEA per creare le tabelle di memoria che contengono i dati per l’accesso molto veloce durante una sessione senza la necessità per la conservazione permanente.

Che cosa è l’equivalente di MS SQL?

Un requisito è che ho bisogno di essere in grado di utilizzare la tabella temporanea, proprio come qualsiasi altro, soprattutto JOIN con quelli stabili.

  • Spero che tu sia consapevole del fatto che in MySQL, utente-tabelle temporanee create non sono in memoria di default! Solo se si specifica del MOTORE=MEMORIA nell’istruzione CREATE TABLE, il tavolo sarà in memoria. Altrimenti la tabella temporanea verrà creato con il motore di archiviazione predefinita, che è più probabile che MyISAM o INNODB, e salvati su disco. Non confondere l’utente creato con interno di tabelle temporanee create da MySQL join complessi. Questi sono creati in memoria, se possibile.

 

8 Replies
  1. 13

    @Keith

    Questo è un malinteso comune: variabili di Tabella NON sono necessariamente memorizzati nella memoria. Infatti SQL Server decide se mantenere la variabile in memoria o rovesciarlo per TempDB. Non vi è alcun modo affidabile (almeno in SQL Server 2005) per garantire che i dati della tabella viene mantenuta in memoria. Per maggiori info dai un’occhiata qui

  2. 18

    È possibile creare variabili di tabella (in memoria), e due diversi tipi di tabella temp:

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

    Edit:

    Seguenti feedback penso che questo ha bisogno di un piccolo chiarimento.

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

    @Table variabili normalmente in memoria, ma non sono garantiti. SQL decide secondo il piano di query e utilizza il database TempDB, se è necessario.

  3. 3

    È possibile dichiarare una “variabile di tabella in SQL Server 2005, come questo:

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

    Quindi fare riferimento ad esso, come una variabile:

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

    Non c’è bisogno di cadere – si va via quando la variabile va al di fuori del campo di applicazione.

  4. 2

    È possibile con MS SQL Server 2014.

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

    Qui è un esempio di generazione SQL codice (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
  5. 1

    Capisco cosa stai cercando di raggiungere. Benvenuti nel mondo di una varietà di database!

    SQL server 2000 supporta le tabelle temporanee create anteponendo # per il nome della tabella, il che rende un locale accessibile tabella temporanea locale per la sessione) e precedente ( # # ) per il nome della tabella, per accessibile a livello globale tabelle temporanee e.g #MyLocalTable e ##MyGlobalTable rispettivamente.

    Di SQL server 2005 e il supporto di entrambe le tabelle temporanee (globale, locale) e le variabili di tabella – guardare fuori per le nuove funzionalità di variabili di tabella in SQL 2008 e il rilascio di due! La differenza tra le tabelle temporanee e le variabili di tabella non è tanto grande, ma sta nel modo in cui il server di database li gestisce.

    Non vorrei parlare di versioni precedenti di SQL server 7, 6, anche se ho lavorato con loro, ed è dove sono venuto comunque 🙂

    È comune pensare che le variabili di tabella, che si trovano sempre in memoria, ma questo è sbagliato. A seconda dell’utilizzo della memoria e il server di database volume delle transazioni, una variabile di tabella delle pagine possono essere esportati dalla memoria e scritti in tempdb e il resto dell’elaborazione avviene in tempdb).

    Siete pregati di notare che il database tempdb è un database in un’istanza, senza fissa gli oggetti in natura, ma è responsabile per la gestione di carichi di lavoro che coinvolgono transazioni come l’ordinamento, e altri il lavoro di elaborazione che è di natura temporanea. D’altra parte, le variabili di tabella (di solito con i più piccoli di dati) vengono mantenute in memoria (RAM) che li rende più veloce l’accesso e, di conseguenza, meno i /o del disco in termini di utilizzo di tempdb in auto quando si utilizzano le variabili di tabella con dati più piccola rispetto alle tabelle temporanee che sempre di log nel database tempdb.

    Tabella variabili non possono essere indicizzati, mentre le tabelle temporanee (locale e globale) può essere indicizzato per un’elaborazione più rapida nel caso in cui la quantità di dati di grandi dimensioni. Quindi conoscere la vostra scelta in caso di elaborazione più veloce con grandi volumi di dati da operazioni temporanee. Vale anche la pena notare che le operazioni su variabili di tabella, da soli non sono registrato e non può essere rotolato indietro, mentre quelli di fatto tabelle temporanee possono essere rollback!

    In sintesi, le variabili di tabella sono migliori per le più piccole di dati, mentre le tabelle temporanee sono meglio per i più grandi i dati elaborati temporaneamente. Se anche voi volete un corretto controllo delle transazioni mediante transazione blocchi, le variabili di tabella non sono un’opzione per il rollback delle transazioni così si sta meglio con le tabelle temporanee in questo caso.

    Infine, le tabelle temporanee saranno sempre aumentare disco IO dato che uso sempre tempdb, mentre le variabili di tabella non può aumentare, a seconda della memoria i livelli di stress.

    Fatemi sapere se volete consigli su come ottimizzare il database tempdb per guadagnare molto di più di prestazioni al di sopra di 100%!

    • Chris, perché non impostare un account?
    • si prega di lasciare religiosa tag linee la fine del tuo post. Anche l’auto promozionali roba appartiene nel vostro profilo, non alla fine del tuo post.
  6. 0

    La sintassi che si desidera è:

    creare la tabella #tablename

    Il prefisso # identifica la tabella come una tabella temporanea.

Lascia un commento