Introduzione alle tabelle con ottimizzazione per la memoriaIntroduction to Memory-Optimized Tables

In questo argomento si applica a: SìSQL ServerSìDatabase SQL di AzurenonAzure SQL Data Warehouse non Parallel Data WarehouseTHIS TOPIC APPLIES TO: yesSQL ServeryesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Le tabelle con ottimizzazione per la memoria vengono create usando CREATE TABLE (Transact-SQL).Memory-optimized tables are created using CREATE TABLE (Transact-SQL).

Le tabelle ottimizzate per la memoria sono completamente durevoli per impostazione predefinita e, come per le transazioni delle tabelle tradizionali basate su disco, le transazioni nelle tabelle ottimizzate per la memoria sono completamente ACID (atomicità, coerenza, isolamento e durabilità).Memory-optimized tables are fully durable by default, and, like transactions on (traditional) disk-based tables, transactions on memory-optimized tables are fully atomic, consistent, isolated, and durable (ACID). Le tabelle con ottimizzazione per la memoria e le stored procedure compilate in modo nativo supportano solo un subset di funzionalità Transact-SQLTransact-SQL.Memory-optimized tables and natively compiled stored procedures support only a subset of Transact-SQLTransact-SQL features.

A partire da SQL Server 2016 e nel database SQL di Azure, non sono presenti limitazioni per regole di confronto o tabelle codici specifici di OLTP in memoria.Starting with SQL Server 2016, and in Azure SQL Database, there are no limitations for collations or code pages that are specific to In-Memory OLTP.

Lo spazio di archiviazione primario per le tabelle ottimizzate per la memoria è la memoria principale.The primary storage for memory-optimized tables is the main memory. Le righe della tabella vengono lette e scritte in memoria.Rows in the table are read from and written to memory. Una seconda copia dei dati della tabella viene mantenuta su disco, ma solo per motivi di durabilità.A second copy of the table data is maintained on disk, but only for durability purposes. Vedere Creazione e gestione dell'archiviazione per gli oggetti con ottimizzazione per la memoria per altre informazioni sulle tabelle durevoli.See Creating and Managing Storage for Memory-Optimized Objects for more information about durable tables. I dati nelle tabelle ottimizzate per la memoria vengono letti dal disco solo durante il recupero del database,Data in memory-optimized tables is only read from disk during database recovery (eg. ovvero dopo un riavvio del server.after a server restart).

Per miglioramenti delle prestazioni ancora superiori, OLTP in memoria supporta tabelle durevoli con durabilità delle transazioni posticipata.For even greater performance gains, In-Memory OLTP supports durable tables with transaction durability delayed. Le transazioni durevoli posticipate vengono salvate su disco subito dopo il commit e la restituzione del controllo al client da parte della transazione.Delayed durable transactions are saved to disk soon after the transaction has committed and control was returned to the client. In cambio di un miglioramento delle prestazioni, le transazioni di cui è stato eseguito il commit non salvate su disco vengono perse in caso di arresto anomalo del server o di failover.In exchange for the increased performance, committed transactions that have not saved to disk are lost in a server crash or fail over.

Oltre alle tabelle ottimizzate per la memoria durevoli predefinite, SQL ServerSQL Server supporta anche le tabelle ottimizzate per la memoria non durevoli che non vengono registrate e i cui dati non vengono salvati in modo persistente su disco.Besides the default durable memory-optimized tables, SQL ServerSQL Server also supports non-durable memory-optimized tables, which are not logged and their data is not persisted on disk. Ciò significa che le transazioni in tali tabelle non richiedono alcuna attività di I/O su disco, ma i dati non verranno recuperati in caso di un arresto anomalo o di un failover del server.This means that transactions on these tables do not require any disk IO, but the data will not be recovered if there is a server crash or failover.

OLTP in memoria viene integrato con SQL ServerSQL Server per fornire un'esperienza senza problemi in tutte le aree, ad esempio sviluppo, distribuzione, gestibilità e supporto.In-Memory OLTP is integrated with SQL ServerSQL Server to provide a seamless experience in all areas such as development, deployment, manageability, and supportability. Un database può contenere sia oggetti in memoria che oggetti basati su disco.A database can contain in-memory as well as disk-based objects.

Le righe delle tabelle ottimizzate per la memoria dispongono di versioni.Rows in memory-optimized tables are versioned. Ciò significa che ogni riga nella tabella dispone potenzialmente di più versioni.This means that each row in the table potentially has multiple versions. Tutte le versioni delle righe vengono mantenute nella stessa struttura dei dati della tabella.All row versions are maintained in the same table data structure. Il controllo delle versioni delle righe viene utilizzato per consentire letture e scritture simultanee nella stessa riga.Row versioning is used to allow concurrent reads and writes on the same row. Per altre informazioni sulle letture e scritture simultanee nella stessa riga, vedere Transactions with Memory-Optimized Tables(Transazioni con tabelle con ottimizzazione per la memoria).For more information about concurrent reads and writes on the same row, see Transactions with Memory-Optimized Tables.

Nella figura seguente viene illustrato il controllo di più versioni.The following figure illustrates multi-versioning. Nella figura è illustrata una tabella con tre righe e ogni riga ha diverse versioni.The figure shows a table with three rows and each row has different versions.

Controllo di più versioni.Multi-versioning.

Nella tabella sono presenti tre righe: r1, r2 e r3.The table has three rows: r1, r2, and r3. r1 include tre versioni, r2 due versioni e r3 quattro versioni.r1 has three versions, r2 has two versions, and r3 has four versions. Si noti che diverse versioni della stessa riga non occupano necessariamente posizioni di memoria consecutive.Note that different versions of the same row do not necessarily occupy consecutive memory locations. Le diverse versioni delle righe possono essere presenti in diverse posizioni della struttura dei dati della tabella.The different row versions can be dispersed throughout the table data structure.

La struttura dei dati della tabella ottimizzata per la memoria può essere considerata una raccolta di versioni di riga.The memory-optimized table data structure can be seen as a collection of row versions. Le righe nelle tabelle basate su disco sono organizzate in pagine ed extent e alle singole righe viene fatto riferimento utilizzando il numero e l'offset della pagina, alle versioni di riga nelle tabelle ottimizzate per la memoria viene fatto riferimento tramite puntatori alla memoria a 8 byte.Rows in disk-based tables are organized in pages and extents, and individual rows addressed using page number and page offset, row versions in memory-optimized tables are addressed using 8-byte memory pointers.

Ai dati nelle tabelle ottimizzate per la memoria è possibile accedere in due modi:Data in memory-optimized tables is accessed in two ways:

  • Tramite stored procedure compilate in modo nativo.Through natively compiled stored procedures.

  • Tramite codice Transact-SQLTransact-SQLinterpretato, all'esterno di una stored procedure compilata in modo nativo.Through interpreted Transact-SQLTransact-SQL, outside of a natively-compiled stored procedure. Queste istruzioni Transact-SQLTransact-SQL possono essere incluse in stored procedure interpretate o essere istruzioni Transact-SQLTransact-SQL ad hoc.These Transact-SQLTransact-SQL statements may be either inside interpreted stored procedures or they may be ad-hoc Transact-SQLTransact-SQL statements.

Accesso ai dati nelle tabelle con ottimizzazione per la memoriaAccessing Data in Memory-Optimized Tables

È possibile accedere alle tabelle con ottimizzazione per la memoria in modo più efficiente da stored procedure compilate in modo nativo (Stored procedure compilate in modo nativo).Memory-optimized tables can be accessed most efficiently from natively compiled stored procedures (Natively Compiled Stored Procedures). È inoltre possibile accedere alle tabelle con ottimizzazione per la memoria con codice Transact-SQLTransact-SQLtradizionale interpretato.Memory-optimized tables can also be accessed with (traditional) interpreted Transact-SQLTransact-SQL. Con Transact-SQLTransact-SQL interpretato si fa riferimento all'accesso a tabelle ottimizzate per la memoria senza una stored procedure compilata in modo nativo.Interpreted Transact-SQLTransact-SQL refers to accessing memory-optimized tables without a natively compiled stored procedure. Alcuni esempi di accesso Transact-SQLTransact-SQL interpretato includono l'accesso a una tabella ottimizzata per la memoria da un trigger DML o un batch, una vista e una funzione con valori di tabella Transact-SQLTransact-SQL ad hoc.Some examples of interpreted Transact-SQLTransact-SQL access include accessing a memory-optimized table from a DML trigger, ad hoc Transact-SQLTransact-SQL batch, view, and table-valued function.

Nella tabella seguente viene riepilogato l'accesso Transact-SQLTransact-SQL interpretato e nativo per vari oggetti.The following table summarizes native and interpreted Transact-SQLTransact-SQL access for various objects.

FunzionalitàFeature Accesso tramite una stored procedure compilata in modo nativoAccess Using a Natively Compiled Stored Procedure Accesso Transact-SQLTransact-SQL interpretatoInterpreted Transact-SQLTransact-SQL Access Accesso con CLRCLR Access
Tabella con ottimizzazione per la memoriaMemory-optimized table Yes Yes NoNo
Tipo di tabella con ottimizzazione per la memoriaMemory-optimized table type Yes Yes NoNo
Stored procedure compilata in modo nativoNatively compiled stored procedure L'annidamento di stored procedure compilate in modo nativo ora è supportato.Nesting of natively compiled stored procedures is now supported. È possibile usare la sintassi EXECUTE all'interno delle stored procedure, purché la procedura a cui viene fatto riferimento sia anch'essa compilata in modo nativo.You can use the EXECUTE syntax inside the stored procedures, as long as the referenced procedure is also natively compiled. Yes NoNo

Non è possibile accedere a una tabella ottimizzata per la memoria o a una stored procedure compilata in modo nativo dalla connessione del contesto, ovvero la connessione da SQL ServerSQL Server quando si esegue un modulo CLR.You cannot access a memory-optimized table or natively compiled stored procedure from the context connection (the connection from SQL ServerSQL Server when executing a CLR module). È tuttavia possibile creare e aprire un'altra connessione da cui accedere a tabelle ottimizzate per la memoria e stored procedure compilate in modo nativo.You can, however, create and open another connection from which you can access memory-optimized tables and natively compiled stored procedures.

Prestazioni e scalabilitàPerformance and Scalability

I seguenti fattori influiranno sui miglioramenti delle prestazioni che possono essere ottenuti con OLTP in memoria:The following factors will affect the performance gains that can be achieved with In-Memory OLTP:

Comunicazione: Il miglioramento delle prestazioni per un'applicazione con molte chiamate a stored procedure brevi può risultare inferiore rispetto a un'applicazione con meno chiamate e più funzionalità implementate in ogni stored procedure.Communication: An application with many calls to short stored procedures may see a smaller performance gain compared to an application with fewer calls and more functionality implemented in each stored procedure.

Transact-SQLTransact-SQL : In OLTP in memoria si ottengono le migliori prestazioni quando si usano le stored procedure compilate in modo nativo anziché le stored procedure interpretate o l'esecuzione delle query. Transact-SQLTransact-SQL Execution: In-Memory OLTP achieves the best performance when using natively compiled stored procedures rather than interpreted stored procedures or query execution. L'accesso alle tabelle ottimizzate per la memoria da queste stored procedure può essere vantaggioso.There can be a benefit to accessing memory-optimized tables from such stored procedures.

Analisi dell'intervallo e ricerca di punti: Gli indici non cluster con ottimizzazione per la memoria supportano le analisi di intervalli e le analisi ordinate.Range Scan vs Point Lookup: Memory-optimized nonclustered indexes support range scans and ordered scans. Per le ricerche a punti, gli indici hash ottimizzati per la memoria offrono prestazioni migliori rispetto agli indici non cluster ottimizzati per la memoria.For point lookups, memory-optimized hash indexes have better performance than memory-optimized nonclustered indexes. Gli indici non cluster con ottimizzazione per la memoria offrono prestazioni migliori rispetto agli indici basati su disco.Memory-optimized nonclustered indexes have better performance than disk-based indexes.

  • A partire da SQL Server 2016, il piano di query per una tabella ottimizzata per la memoria può analizzare la tabella in parallelo.Starting in SQL Server 2016, the query plan for a memory-optimized table can scan the table in parallel. Ciò migliora le prestazioni delle query di analisi.This improves the performance of analytical queries.
    • In SQL Server 2016 è ora possibile anche analizzare in parallelo gli indici hashHash indexes also became scannable in parallel in SQL Server 2016.
    • e gli indici non cluster.Nonclustered indexes also became scannable in parallel in SQL Server 2016.
    • Gli indici columnstore sono analizzabili in parallelo dall'inizio in SQL Server 2014.Columnstore indexes have been scannable in parallel since their inception in SQL Server 2014.

Operazioni sugli indici: le operazioni sugli indici non vengono registrate e sono presenti solo in memoria.Index operations: Index operations are not logged, and they exist only in memory.

Concorrenza: le prestazioni di applicazioni interessate dalla concorrenza a livello di motore, ad esempio la contesa di latch o il blocco, migliorano significativamente quando l'applicazione viene spostata in OLTP in memoria.Concurrency: Applications whose performance is affected by engine-level concurrency, such as latch contention or blocking, improves significantly when the application moves to In-Memory OLTP.

Nella tabella seguente sono elencati i problemi relativi a prestazioni e scalabilità presenti in genere nei database relazionali e viene descritto in che modo OLTP in memoria può consentire il miglioramento delle prestazioni.The following table lists the performance and scalability issues that are commonly found in relational databases and how In-Memory OLTP can improve performance.

ProblemaIssue Impatto di OLTP in memoriaIn-Memory OLTP Impact
restazioniPerformance

Utilizzo elevato delle risorse (CPU, I/O, rete o memoria).High resource (CPU, I/O, network or memory) usage.
CPUCPU
Le stored procedure compilate in modo nativo possono ridurre in modo significativo l'utilizzo della CPU perché richiedono un numero decisamente inferiore di istruzioni per eseguire un'istruzione Transact-SQLTransact-SQL rispetto alle stored procedure interpretate.Natively compiled stored procedures can lower CPU usage significantly because they require significantly fewer instructions to execute a Transact-SQLTransact-SQL statement compared to interpreted stored procedures.

OLTP in memoria può ridurre l'investimento hardware nei carichi di lavoro con scalabilità orizzontale, in quanto un server può potenzialmente fornire la velocità effettiva di cinque/dieci server.In-Memory OLTP can help reduce the hardware investment in scaled-out workloads because one server can potentially deliver the throughput of five to ten servers.

I/OI/O
Se si verifica un collo di bottiglia a livello di I/O in seguito all'elaborazione di pagine di dati o di indice, in OLTP in memoria il collo di bottiglia potrebbe risultare contenuto.If you encounter an I/O bottleneck from processing to data or index pages, In-Memory OLTP may reduce the bottleneck. Inoltre, il checkpoint degli oggetti di OLTP in memoria è continuo e non genera aumenti improvvisi nelle operazioni di I/O.Additionally, the checkpointing of In-Memory OLTP objects is continuous and does not lead to sudden increases in I/O operations. Se tuttavia il working set delle tabelle critiche per le prestazioni eccede la memoria disponibile, OLTP in memoria non sarà in grado di migliorare le prestazioni in quanto è necessario che i dati siano residenti in memoria.However, if the working set of the performance critical tables does not fit in memory, In-Memory OLTP will not improve performance because it requires data to be memory resident. Se si verifica un collo di bottiglia a livello di I/O durante la registrazione, OLTP in memoria può ridurre il collo di bottiglia perché richiede meno attività di registrazione.If you encounter an I/O bottleneck in logging, In-Memory OLTP can reduce the bottleneck because it does less logging. Se una o più tabelle ottimizzate per la memoria sono configurate come tabelle non durevoli, è possibile eliminare la registrazione dei dati.If one or more memory-optimized tables are configured as non-durable tables, you can eliminate logging for data.

MemoriaMemory
Con OLTP in memoria non si ottiene alcun vantaggio in termini di prestazioni.In-Memory OLTP does not offer any performance benefit. È possibile che OLTP in memoria comporti un utilizzo elevato di memoria, in quando gli oggetti devono essere residenti in memoria.In-Memory OLTP can put extra pressure on memory as the objects need to be memory resident.

ReteNetwork
Con OLTP in memoria non si ottiene alcun vantaggio in termini di prestazioni.In-Memory OLTP does not offer any performance benefit. I dati devo essere comunicati dal livello dati al livello applicazione.The data needs to be communicated from data tier to application tier.
ScalabilitàScalability

La maggior parte dei problemi di scalabilità nelle applicazioni di SQL ServerSQL Server è causata da problemi di concorrenza, ad esempio la contesa in blocchi, latch e spinlock.Most scaling issues in SQL ServerSQL Server applications are caused by concurrency issues such as contention in locks, latches, and spinlocks.
Contesa di latchLatch Contention
Uno scenario tipico riguarda la contesa nell'ultima pagina di un indice quando vengono inserite contemporaneamente righe nell'ordine delle chiavi.A typical scenario is contention on the last page of an index when inserting rows concurrently in key order. Poiché in OLTP in memoria non vengono utilizzati latch per l'accesso ai dati, i problemi di scalabilità correlati alle contese di latch vengono completamente rimossi.Because In-Memory OLTP does not take latches when accessing data, the scalability issues related to latch contentions are fully removed.

Contesa di spinlockSpinlock Contention
Poiché in OLTP in memoria non vengono utilizzati latch per l'accesso ai dati, i problemi di scalabilità correlati alle contese di spinlock vengono completamente rimossi.Because In-Memory OLTP does not take latches when accessing data, the scalability issues related to spinlock contentions are fully removed.

Contesa correlata al bloccoLocking Related Contention
Se nell'applicazione di database vengono rilevati problemi di blocco tra operazioni di lettura e scrittura, con OLTP in memoria vengono rimossi i problemi che impediscono di proseguire perché è previsto l'utilizzo di una nuova forma di controllo della concorrenza ottimistica per implementare tutti i livelli di isolamento delle transazioni.If your database application encounters blocking issues between read and write operations, In-Memory OLTP removes the blocking issues because it uses a new form of optimistic concurrency control to implement all transaction isolation levels. In OLTP in memoria, TempDB non viene utilizzato per l'archiviazione delle versioni di riga.In-Memory OLTP does not use TempDB to store row versions.

Se il problema di scalabilità è determinato dal conflitto tra due operazioni di scrittura, ad esempio due transazioni simultanee che tentano di aggiornare la stessa riga, OLTP in memoria consente il completamento di una transazione e genera un errore per l'altra.If the scaling issue is caused by conflict between two write operations, such as two concurrent transactions trying to update the same row, In-Memory OLTP lets one transaction succeed and fails the other transaction. La transazione non riuscita deve essere inviata di nuovo in modo esplicito o implicito, ripetendone l'esecuzione.The failed transaction must be re-submitted either explicitly or implicitly, re-trying the transaction. In entrambi i casi è necessario apportare modifiche all'applicazione.In either case, you need to make changes to the application.

Se nell'applicazione si verificano frequenti conflitti tra due operazioni di scrittura, il valore del blocco ottimistico viene ridotto.If your application experiences frequent conflicts between two write operations, the value of optimistic locking is diminished. L'applicazione non è appropriata per OLTP in memoria.The application is not suitable for In-Memory OLTP. La maggior parte delle applicazioni OLTP non presenta conflitti di scrittura, a meno che il conflitto non venga attivato da escalation blocchi.Most OLTP applications don’t have a write conflicts unless the conflict is induced by lock escalation.

Sicurezza a livello di riga nelle tabelle con ottimizzazione per la memoriaRow-Level Security in Memory-Optimized Tables

LaSicurezza a livello di riga è supportata per le tabelle ottimizzate per la memoria.Row-Level Security is supported in memory-optimized tables. L'applicazione dei criteri di sicurezza a livello di riga alle tabelle ottimizzate per la memoria corrisponde essenzialmente alle tabelle basate su disco, ad eccezione del fatto che le funzioni con valori di tabella inline usate come predicati di sicurezza devono essere compilate in modo nativo, ovvero create con l'opzione WITH NATIVE_COMPILATION.Applying Row-Level Security policies to memory-optimized tables is essentially the same as disk-based tables, except that the inline table-valued functions used as security predicates must be natively compiled (created using the WITH NATIVE_COMPILATION option). Per informazioni dettagliate, vedere la sezione Compatibilità tra funzionalità e l'argomento Sicurezza a livello di riga .For details, see the Cross-Feature Compatibility section in the Row-Level Security topic.

Varie funzioni di sicurezza predefinite essenziali per la sicurezza a livello di riga sono state abilitate per le tabelle in memoria.Various built-in security functions that are essential to row-level security have been enabled for in-memory tables. Per informazioni dettagliate, vedere Funzioni predefinite nei moduli compilati in modo nativo.For details, see Built-in Functions in Natively Compiled Modules.

EXECUTE AS CALLER : tutti i moduli nativi ora supportano e usano EXECUTE AS CALLER per impostazione definitiva, anche se non viene specificato l'hint.EXECUTE AS CALLER - All native modules now support and use EXECUTE AS CALLER by default, even if the hint is not specified. Questo perché è previsto che tutte le funzioni di predicato di sicurezza a livello di riga usino EXECUTE AS CALLER per fare in modo che la funzione (e tutte le funzioni predefinite usate al suo interno) venga valutata nel contesto dell'utente chiamante.This is because it is expected that all row-level security predicate functions will use EXECUTE AS CALLER so that the function (and any built-in functions used within it) will be evaluated in the context of the calling user.
EXECUTE AS CALLER influisce in proporzione modesta (circa il 10%) sulle prestazioni a causa dei controlli delle autorizzazioni sul chiamante.EXECUTE AS CALLER has a small (approximately10%) performance hit caused by permission checks on the caller. Se il modulo specifica EXECUTE AS SELF o EXECUTE AS OWNER in modo esplicito, si evitano questi controlli delle autorizzazioni e il conseguente impatto sulle prestazioni.If the module specifies EXECUTE AS OWNER or EXECUTE AS SELF explicitly, these permission checks and their associated performance cost will be avoided. Se però queste due opzioni vengono usate insieme alle funzioni predefinite di cui sopra, l'impatto sulle prestazioni sarà notevolmente maggiore a causa del necessario cambio di contesto.However, using either of these options together with the built-in functions above will incur a significantly higher performance hit due to the necessary context-switching.

ScenariScenarios

Per una breve descrizione degli scenari in cui OLTP in memoria di SQL ServerSQL Server In-Memory OLTP può migliorare le prestazioni, vedere OLTP in memoria.For a brief discussion of typical scenarios where OLTP in memoria di SQL ServerSQL Server In-Memory OLTP can improve performance, see In-Memory OLTP.

Vedere ancheSee Also

OLTP in memoria (ottimizzazione per la memoria)In-Memory OLTP (In-Memory Optimization)