Pianificare l'adozione delle funzionalità OLTP in memoria in SQL ServerPlan your adoption of In-Memory OLTP Features in SQL Server

QUESTO ARGOMENTO SI APPLICA A:sìSQL Server (a partire dalla versione 2014)sìDatabase SQL di AzurenoAzure SQL Data Warehouse noParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2014)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

In questo articolo vengono descritte i modi in cui l'adozione delle funzionalità In-Memory influisce su altri aspetti del sistema aziendale.This article describes the ways in which the adoption of In-Memory features affects other aspects of your business system.

A.A. Adozione delle funzionalità OLTP in memoriaAdoption of In-Memory OLTP features

Le sottosezioni seguenti illustrano i fattori da tenere in considerazione quando si intende adottare e implementare le funzionalità In-Memory.The following subsections discuss factors you must consider when you plan to adopt and implement In-Memory features. Molte altre informazioni esplicative sono disponibili in:A lot of explanatory information is available at:

A.1 PrerequisitiA.1 Prerequisites

Uno dei prerequisiti per l'uso di funzionalità In-Memory può implicare l'edizione o il livello di servizio del prodotto SQL.One prerequisite for using the In-Memory features can involve the edition or service tier of the SQL product. Per questo e altri prerequisiti, vedere:For this and other prerequisites, see:

A.2 Prevedere la quantità di memoria attivaA.2 Forecast the amount of active memory

Il sistema dispone di sufficiente memoria attiva per supportare una nuova tabella con ottimizzazione per la memoria?Does your system have enough active memory to support a new memory-optimized table?

Microsoft SQL ServerMicrosoft SQL Server

Una tabella con ottimizzazione per la memoria che contiene 200 GB di dati richiede più di 200 GB di memoria attiva dedicata al suo supporto.A memory-optimized table which contains 200 GB of data requires more than 200 GB of active memory be dedicated to its support. Prima di implementare una tabella con ottimizzazione per la memoria che contiene una grande quantità di dati, si deve prevedere la quantità di memoria aggiuntiva attiva che è necessario aggiungere al computer server.Before you implement a memory-optimized table containing a large amount of data, you must forecast the amount of additional active memory you might need to add to your server computer. Per linee guida sulla stima, vedere:For estimation guidance, see:

Database SQL di AzureAzure SQL Database

Per un database ospitato nel servizio cloud del database SQL di Azure, il livello di servizio scelto influisce sulla quantità di memoria attiva che il database può usare.For a database hosted in the Azure SQL Database cloud service, your chosen service tier affects the amount of active memory your database is allowed to consume. È consigliabile monitorare l'utilizzo della memoria del database tramite un avviso.You should plan to monitor the memory usage of your database by using an alert. Per informazioni dettagliate, vedere:For details, see:

Variabili di tabella con ottimizzazione per la memoriaMemory-optimized table variables

È preferibile usare una variabile di tabella dichiarata con ottimizzazione per la memoria piuttosto che una #TempTable tradizionale che risiede nel database tempdb .A table variable which is declared to be memory-optimzed is sometimes a preferable to a traditional #TempTable that resides in the tempdb database. Tali variabili di tabella possono garantire miglioramenti significativi delle prestazioni senza usare grandi quantità di memoria attiva.Such table variables can provide significant performance gains without using significant amounts of active memory.

A.3 La tabella deve essere offline per la conversione in tabella con ottimizzazione per la memoriaA.3 Table must be offline to convert to memory-optimized

Parte della funzionalità di ALTER TABLE è disponibile per le tabelle con ottimizzazione per la memoria.Some ALTER TABLE functionality is available for memory-optimized tables. Ma non è possibile eseguire un'istruzione ALTER TABLE per convertire una tabella basata su disco in una tabella con ottimizzazione per la memoria.But you cannot issue an ALTER TABLE statement to convert a disk-based table into a memory-optimized table. È invece necessario usare una serie di passaggi più manuali.Instead you must use a more manual set of steps. Di seguito vengono elencati vari modi in cui è possibile convertire la tabella basata su disco in tabella con ottimizzazione per la memoria.What follows are various ways you can convert your disk-based table to be memory-optimized.

Esecuzione manuale di scriptManual scripting

Un modo per convertire la tabella basata su disco in una tabella con ottimizzazione per la memoria consiste nel codificare manualmente i passaggi necessari di Transact-SQL.One way to convert your disk-based table to a memory-optimized table is to code the necessary Transact-SQL steps yourself.

  1. Sospendere l'attività dell'applicazione.Suspend application activity.

  2. Eseguire un backup completo.Take a full backup.

  3. Rinominare la tabella basata su disco.Rename your disk-based table.

  4. Eseguire un'istruzione CREATE TABLE per creare la nuova tabella con ottimizzazione per la memoria.Issue a CREATE TABLE statement to create your new memory-optimized table.

  5. Aggiungere dati nella tabella con ottimizzazione per la memoria dalla tabella basata su disco con un clausola sub-SELECT.INSERT INTO your memory-optimized table with a sub-SELECT from the disk-based table.

  6. Eliminare la tabella basata su disco.DROP your disk-based table.

  7. Eseguire un altro backup completo.Take another full backup.

  8. Riprendere l'attività dell'applicazione.Resume application activity.

Ottimizzazione guidata per la memoriaMemory Optimization Advisor

Lo strumento Ottimizzazione guidata per la memoria può generare uno script per supportare l'implementazione della conversione di una tabella basata su disco in una tabella con ottimizzazione per la memoria.The Memory Optimization Advisor tool can generate a script to help implement the conversion of a disk-based table to a memory-optimized table. Lo strumento è disponibile nell'installazione di SQL Server Data Tools (SSDT).The tool is installed as part of SQL Server Data Tools (SSDT).

file DACPAC.dacpac file

È possibile aggiornare il database sul posto tramite un file con estensione DACPAC gestito da SSDT.You can update your database in-place by using a .dacpac file, managed by SSDT. In SSDT è possibile specificare le modifiche allo schema codificato nel file con estensione DACPAC.In SSDT you can specify changes to the schema that is encoded in the .dacpac file.

Si usano file con estensione DACPAC nel contesto di un progetto di Visual Studio di tipo Database.You work with .dacpac files in the context of a Visual Studio project of type Database.

A.4 Linee guida per verificare se le funzionalità di OLTP in memoria sono adatte all'applicazioneA.4 Guidance for whether In-Memory OLTP features are right for your application

Per le linee guida per verificare se le funzionalità di OLTP in memoria possono migliorare le prestazioni di un'applicazione specifica, vedere:For guidance on whether In-Memory OLTP features can improve the performance of your particular application, see:

B.B. Funzionalità non supportateUnsupported features

Le funzionalità non supportate in alcuni scenari di OLTP in memoria sono descritte in:Features which are not supported in certain In-Memory OLTP scenarios are described at:

Le sottosezioni seguenti illustrano alcune delle più importanti funzionalità non supportate.The following subsections highlight some of the more important unsupported features.

B.1 SNAPSHOT di un databaseB.1 SNAPSHOT of a database

Dopo la prima creazione di un modulo o tabella con ottimizzazione per la memoria in un database specifico, non è più possibile eseguire snapshot del database.After the first time that any memory-optimized table or module is created in a given database, no SNAPSHOT of the database can ever be taken. Il motivo specifico è che:The specific reason is that:

  • Il primo elemento con ottimizzazione per la memoria rende impossibile l'eliminazione dell'ultimo file dal filegroup con ottimizzazione per le memoria eThe first memory-optimized item makes it impossible to ever drop the last file from the memory-optimized FILEGROUP; and
  • nessun database che ha un file nel filegroup con ottimizzazione per la memoria può supportare uno snapshot.No database that has a file in a memory-optimized FILEGROUP can support a SNAPSHOT.

In genere uno snapshot può essere utile per le iterazioni di test rapidi.Normally a SNAPSHOT can be handy for quick testing iterations.

B.2 Query tra databaseB.2 Cross-database queries

Le tabelle con ottimizzazione per la memoria non supportano transazioni tra database .Memory-optimized tables do not support cross-database transactions. Non è possibile accedere a un altro database dalla stessa transazione o dalla stessa query che accede anche a una tabella con ottimizzazione per la memoria.You cannot access another database from the same transaction or the same query that also accesses a memory-optimized table.

Le variabili di tabella non sono transazionali.Table variables are not transactional. Di conseguenza, le variabili di tabella con ottimizzazione per la memoria non possono essere usate nelle query tra database.Therefore, memory-optimized table variables can be used in cross-database queries.

B.3 Hint di tabella READPASTB.3 READPAST table hint

Nessuna query può applicare l' hint di tabella READPAST alle tabelle con ottimizzazione per la memoria.No query can apply the READPAST table hint to any memory-optimized table.

L'hint READPAST è utile in scenari con più sessioni che accedono e modificano lo stesso set di piccole dimensioni di righe, ad esempio nell'elaborazione di una coda.The READPAST hint is helpful in scenarios where several sessions are each accessing and modifying the same small set of rows, such as in processing a queue.

B.4 RowVersion, SequenzaB.4 RowVersion, Sequence

  • Nessuna colonna può essere contrassegnata per RowVersion in una tabella con ottimizzazione per la memoria.No column can be tagged for RowVersion on a memory-optimized table.

  • Un oggetto SEQUENCE non può essere usato con un vincolo in una tabella ottimizzata per la memoria.A SEQUENCE cannot be used with a constraint in a memory-optimized table. Ad esempio, non è possibile creare un vincolo DEFAULT con una clausola NEXT VALUE FOR.For example, you cannot create a DEFAULT constraint with a NEXT VALUE FOR clause. Gli oggetti SEQUENCE possono essere usati con le istruzioni INSERT e UPDATE.SEQUENCEs can be used with INSERT and UPDATE statements.

C.C. Manutenzione amministrativaAdministrative maintenance

In questa sezione vengono descritte le differenze nell'amministrazione di un database in cui vengono usate tabelle con ottimizzazione per la memoria.This section describes differences in database administration where memory-optimized tables are used.

C.1 Reimpostazione del valore di inizializzazione Identity, incremento > 1C.1 Identity seed reset, increment > 1

Per reinizializzare una colonna IDENTITY, non è possibile usareDBCC CHECKIDENTin una tabella con ottimizzazione per la memoria.DBCC CHECKIDENT, to reseed an IDENTITY column, cannot be used on a memory-optimized table.

Il valore di incremento è limitato a 1 per una colonna IDENTITY in una tabella con ottimizzazione per la memoria.The increment value is restricted to exactly 1 for an IDENTITY column on a memory-optimized table.

C.2 DBCC CHECKDB non può validare tabelle con ottimizzazione per la memoriaC.2 DBCC CHECKDB cannot validate memory-optimized tables

Il comando DBCC CHECKDB non produce alcun risultato quando si esegue in una tabella con ottimizzazione per la memoria.The DBCC CHECKDB command does nothing when its target is a memory-optimized table. I passaggi seguenti rappresentano una soluzione alternativa:The following steps are a work-around:

  1. Eseguire un backup del log delle transazioni.Back up the transaction log.

  2. Eseguire il backup dei file del filegroup con ottimizzazione per la memoria in un dispositivo NULL.Back up the files in the memory-optimized FILEGROUP to a null device. Il processo di backup richiama una convalida mediante checksum.The backup process invokes a checksum validation.

    Se viene rilevato un errore, procedere con i passaggi successivi.If corruption is found, proceed with the next steps.

  3. Copiare i dati dalle tabelle con ottimizzazione per la memoria in tabelle basate su disco, per l'archiviazione temporanea.Copy data from your memory-optimized tables into disk-based tables, for temporary storage.

  4. Ripristinare i file del filegroup con ottimizzazione per la memoria.Restore the files of the memory-optimized FILEGROUP.

  5. Inserire nelle tabelle con ottimizzazione per la memoria i dati temporaneamente archiviati nelle tabelle basate su disco.INSERT INTO the memory-optimized tables the data you temporarily stored in the disk-based tables.

  6. Eliminare le tabelle basate su disco che includevano temporaneamente i dati.DROP the disk-based tables which temporarily held the data.

D.D. restazioniPerformance

In questa sezione vengono descritte situazioni in cui le prestazioni delle tabelle con ottimizzazione per la memoria non raggiungono la loro completa potenzialità.This section describes situations where the excellent performance of memory-optimized tables can be held below full potential.

D.1 Considerazioni sugli indiciD.1 Index considerations

Tutti gli indici in una tabella con ottimizzazione per la memoria vengono creati e gestiti dalle istruzioni CREATE TABLE e ALTER TABLE relative alla tabella.All indexes on a memory-optimized table are created and managed by the table-related statements CREATE TABLE and ALTER TABLE. Non è possibile usare come destinazione una tabella con ottimizzazione per la memoria tramite un'istruzione CREATE INDEX.You cannot target a memory-optimized table with a CREATE INDEX statement.

L'indice non cluster ad albero B tradizionale è spesso una scelta ragionevole e semplice quando si implementa una tabella con ottimizzazione per la memoria.The traditional b-tree nonclustered index is often the sensible and simple choice when you first implement a memory-optimized table. In un secondo momento, dopo aver verificato le prestazioni dell'applicazione, è possibile sostituirlo con un altro tipo di indice.Later, after you see how your application performs, you can consider swapping another index type.

Nel contesto di una tabella con ottimizzazione per la memoria è necessario considerare due tipi speciali di indici: gli indici hash e gli indici columnstore.Two special types of indexes need discussion in the context of a memory-optimized table: Hash indexes, and Columnstore indexes.

Per una panoramica degli indici in tabelle con ottimizzazione per la memoria, vedere:For an overview of indexes on memory-optimized tables, see:

Indici hashHash indexes

Gli indici hash possono rappresentare il formato più veloce per l'accesso a una riga specifica con il valore della chiave primaria preciso tramite l'operatore '='.Hash indexes can be the fastest format for accessing one specific row by its exact primary key value by using the '=' operator.

  • Gli operatori non precisi, ad esempio '! =','>', o 'BETWEEN' potrebbero influenzare le prestazioni se usati con un indice hash.Inexact operators such as '!=', '>', or 'BETWEEN' would harm performace if used with a hash index.

  • Un indice hash potrebbe non essere la scelta migliore se la velocità di duplicazione del valore chiave diventa troppo elevata.A hash index might not be the best choice if the rate of key value duplication becomes too high.

  • Per evitare lunghe catene all'interno di singoli bucket, non sottostimare la quantità di bucket necessari all'indice hash, .Guard against underestimating how many buckets your hash index might need, to avoid long chains within individual buckets. Per informazioni dettagliate, vedere:For details, see:

Indici columnstore non clusterNonclustered columnstore indexes

Le tabelle con ottimizzazione per la memoria offrono un'elevata velocità effettiva con dati transazionali aziendali tipici denominata elaborazione delle transazioni online o OLTP (Online Transaction Processing).Memory-optimized tables deliver high throughput of typical business transactional data, in the paradigm we call online transaction processing or OLTP. Gli indici columnstore offrono elevata velocità effettiva con aggregazioni e processi denominata Analisi.Columnstore indexes deliver high throughput of aggregations and similar processing we call Analytics. In passato, l'approccio migliore disponibile per soddisfare le esigenze di analisi e OLTP era quello di separare le tabelle con elevato movimento di dati e con un certo livello di duplicazione dei dati.In years past the best approach available for satisfying the needs of both OLTP and Analytics was to have separate tables with heavy movement of data, and with some degree of data duplication. Oggi è disponibile una soluzione ibrida più semplice, ovvero la creazione di un indice columnstore in una tabella con ottimizzazione per la memoria.Today a simpler hybrid solution is available: have a columnstore index on a memory-optimized table.

  • Un indice columnstore può essere compilato in una tabella basata su disco, anche come indice cluster.A columnstore index can be built on a disk-based table, even as the clustered index. Ma in una tabella con ottimizzazione per la memoria, un indice columnstore non può essere raggruppato in cluster.But on a memory-optimized table a columnstore index cannot be clustered.

  • Le colonne LOB (Large Object, Oggetti di grandi dimensioni) o colonne all'esterno di righe in una tabella con ottimizzazione per la memoria impediscono la creazione di un indice columnstore nella tabella.LOB or off-row columns for a memory-optimized table prevent the creation of a columnstore index on the table.

  • Nessuna istruzione ALTER TABLE può essere eseguita in una tabella con ottimizzazione per la memoria se è presente un indice columnstore nella tabella.No ALTER TABLE statement can be executed against a memory-optimized table while a columnstore index exists on the table.

    • A partire da agosto 2016, Microsoft ha intrapreso un progetto a breve termine per migliorare le prestazioni nel ricreare l'indice columnstore.As of August 2016, Microsoft has near-term plans to improve the performance of re-creating the columnstore index.

D.2 Colonne LOB e colonne all'esterno di righeD.2 LOB and off-row columns

Le colonne LOB sono di tipi specifici, ad esempio varchar (max).Large objects (LOBs) are columns of such types as varchar(max). Un paio di colonne LOB in una tabella con ottimizzazione per la memoria probabilmente non influenza le prestazioni in maniera significativa.Having a couple of LOB columns on a memory-optimized table probably does not harm performance enough to matter. Evitare comunque la presenza di colonne LOB non necessarie.But do avoid having more LOB columns than your data needs. Lo stesso consiglio si applica alle colonne all'esterno di righe.The same advice applies to off-row columns. Non definire una colonna come nvarchar(3072) se varchar(512) è sufficiente.Do not define a column as nvarchar(3072) if varchar(512) will suffice.

Altre informazioni sulle colonne all'esterno di righe e colonne LOB sono disponibili in:A bit more about LOB and off-row columns is available at:

E.E. Limiti delle procedure nativeLimitations of native procs

Alcuni elementi specifici di Transact-SQL non sono supportati in stored procedure compilate in modo nativo.Particular elements of Transact-SQL are not supported in natively compiled stored procedures.

Per considerazioni da tener presente quando si migra uno script Transact-SQL in una procedura nativa, vedere:For considerations when migrating a Transact-SQL script to a native proc, see:

E.1 Espressioni CASE in una procedura nativaE.1 No CASE in a native proc

L'espressione CASE in Transact-SQL non può essere usata all'interno di una procedura nativa.The CASE expression in Transact-SQL cannot be used inside a native proc. È possibile implementare una soluzione alternativa:You can fashion a work-around:

E.2 Istruzione MERGE in una procedura nativaE.2 No MERGE in a native proc

L' istruzione MERGE di Transact-SQL presenta analogie con ciò che viene spesso definito funzionalità Upsert .The Transact-SQL MERGE statement has similarities to what is often called upsert functionality. Una procedura nativa non può usare l'istruzione MERGE.A native proc cannot use the MERGE statement. Tuttavia, è possibile ottenere la stessa funzionalità di MERGE usando una combinazione di istruzioni SELECT, UPDATE e INSERT.However, you can achieve the same functionality as MERGE by using a combination of SELECT plus UPDATE plus INSERT statements. Un codice di esempio si trova in:A code example is at:

E.3 Creazione di join in istruzioni UPDATE o DELETE in una procedura nativaE.3 No joins in UPDATE or DELETE statements, in a native proc

Le istruzioni Transact-SQL in una procedura nativa possono accedere solo a tabelle con ottimizzazione per la memoria.Transact-SQL statements in a native proc can access memory-optimized tables only. Nelle istruzioni UPDATE e DELETE, è possibile creare un join di tutte le tabelle.In UPDATE and DELETE statements, you cannot join any tables. I tentativi eseguiti in una procedura nativa danno esisti negativi e visualizzano un messaggio di errore, ad esempio Msg 12319, che indica quanto segue:Attempts in a native proc fail with a message such as Msg 12319 which explains that you:

  • Impossibile usare una clausola FROM in un'istruzione UPDATE.Cannot use the FROM clause in an UPDATE statement.
  • Impossibile specificare un'origine tabella in un'istruzione DELETE.Cannot specify a table source in a DELETE statement.

Nessun tipo di sottoquery offre una soluzione alternativa.No type of subquery provides a work-around. Tuttavia, è possibile usare una variabile di tabella con ottimizzazione per la memoria per ottenere la creazione di un join su più istruzioni.However, you can use a memory-optimized table variable to achieve a join outcome over multiple statements. Di seguito è possibile vedere due esempi di codice:Two code samples follow:

  • Come si può osservare, non è possibile eseguire istruzioni DELETE, JOIN, ecc. in una procedura nativa.DELETE...JOIN... we want to run in a native proc, but cannot.
  • Set di soluzioni alternative con le istruzioni Transact-SQL per eliminare un join.A work-around set of Transact-SQL statements that achieves the delete join.

Scenario: la tabella TabProjectEmployee ha una chiave univoca di due colonne: ProjectId ed EmployeeId.Scenario: The table TabProjectEmployee has a unique key of two columns: ProjectId and EmployeeId. Ogni riga indica l'assegnazione di un dipendente a un progetto attivo.Each row indicates the assignment of an employee to an active project. Quando un dipendente lascia l'azienda, è necessario eliminarlo dalla tabella TabProjectEmployee.When an Employee leaves the company, the employee must be deleted from the TabProjectEmployee table.

DELETE...JOIN di Transact-SQL non validoInvalid T-SQL, DELETE...JOIN

Una procedura nativa non può avere un'istruzione DELETE...JOIN come illustrato di seguito.A native proc cannot have a DELETE...JOIN such as the following.

DELETE pe
    FROM
             TabProjectEmployee   AS pe
        JOIN TabEmployee          AS e

            ON pe.EmployeeId = e.EmployeeId
    WHERE
            e.EmployeeStatus = 'Left-the-Company'
;

Una soluzione alternativa valida consiste nell'eliminare manualmente il join.Valid work-around, manual delete...join

Di seguito viene illustrato l'esempio di codice alternativo, in due parti:Next is the work-around code sample, in two parts:

  1. L'istruzione CREATE TYPE viene eseguita una sola volta, alcuni giorni prima che il tipo venga usato per la prima volta da qualsiasi variabile di tabella esistente.The CREATE TYPE is executed one time, days before the type is first used by any actual table variable.

  2. Il processo aziendale usa il tipo creato.The business process uses the created type. Inizia con la dichiarazione di una variabile di tabella del tipo di tabella creato.It begins by declaring a table variable of the created table type.


CREATE TYPE dbo.type_TableVar_EmployeeId
    AS TABLE  
    (
        EmployeeId   bigint   NOT NULL
    );

Successivamente, usa il tipo di tabella creato.Next, use the create table type.

DECLARE @MyTableVarMo  dbo.type_TableVar_EmployeeId  

INSERT INTO @MyTableVarMo (EmployeeId)
    SELECT
            e.EmployeeId
        FROM
                 TabProjectEmployee  AS pe
            JOIN TabEmployee         AS e  ON e.EmployeeId = pe.EmployeeId
        WHERE
            e.EmployeeStatus = 'Left-the-Company'
;

DECLARE @EmployeeId   bigint;

WHILE (1=1)
BEGIN
    SET @EmployeeId = NULL;

    SELECT TOP 1 @EmployeeId = v.EmployeeId
        FROM @MyTableVarMo  AS v;

    IF (NULL = @Employeed) BREAK;

    DELETE TabProjectEmployee
        WHERE EmployeeId = @EmployeeId;

    DELETE @MyTableVarMo
        WHERE EmployeeId = @EmployeeId;
END;

E.4 Limiti del piano di query per procedure nativeE.4 Query plan limitations for native procs

Alcuni tipi di piani di query non sono disponibili per le procedure native.Some types of query plans are not available for native procs. Molti dettagli su questo argomento vengono illustrati in:Many details are discussed in:

Elaborazione parallela in una procedura nativaNo parallel processing in a native proc

L'elaborazione parallela non può far parte di nessun piano di query per una procedura nativa.Parallel processing cannot be a part of any query plan for a native proc. Le procedure native sono sempre a thread singolo.Native procs are always single-threaded.

Tipi di joinJoin types

Hash join e merge join non possono far parte di nessun piano di query per una procedura nativa.Neither a hash join nor a merge join can be a part of any query plan for a native proc. Vengono usati join annidati dei cicli.Nested loop joins are used.

Aggregazione di hashNo hash aggregation

Quando il piano di query per una procedura nativa richiede una fase di aggregazione, è disponibile solo l'aggregazione di flusso.When the query plan for a native proc requires an aggregation phase, only stream aggregation is available. L'aggregazione di hash non è supportata in un piano di query per un procedura nativa.Hash aggregation is not supported in a query plan for a native proc.

  • L'aggregazione di hash è più efficace quando è necessario aggregare dati da un numero elevato di righe.Hash aggregation is better when data from a large number of rows must aggregated.

F.F. Progettazione di applicazioni: transazioni e logica ripetizione tentativiApplication design: Transactions and retry logic

Una transazione che coinvolge una tabella con ottimizzazione per la memoria può diventare dipendente di un'altra transazione che coinvolge la stessa tabella.A transaction involving a memory-optimized table can become dependent on another transaction which involves the same table. Se il numero di transazioni dipendenti raggiunge o supera il valore massimo consentito, tutte le transazioni dipendenti avranno esito negativo.If the count of dependent transactions reaches exceeds the allowed maximum, all the dependent transactions fail.

In SQL Server 2016:In SQL Server 2016:

  • Il valore massimo consentito è di 8 transazioni dipendenti.The allowed maximum is 8 dependent transactions. 8 è anche il limite di transazioni di cui una determinata transazione può essere dipendente.8 is also the limit of transactions that any given transaction can be dependent on.
  • Il numero del messaggio di errore è 41839.The error number is 41839. (In SQL Server 2014 il numero del messaggio di errore è 41301).(In SQL Server 2014 the error number is 41301.)

È possibile rendere gli script Transact-SQL più affidabili per evitare possibili errori di transazione aggiungendo la logica ripetizione tentativi agli script.You can make your Transact-SQL scripts more robust against a possible transaction error by adding retry logic to your scripts. La logica ripetizione tentativi è più utile quando le chiamate UPDATE e DELETE sono frequenti oppure se viene fatto riferimento alla tabella con ottimizzazione per la memoria da una chiave esterna in un'altra tabella.Retry logic is more likely to help when UPDATE and DELETE calls are frequent, or if the memory-optimized table is referenced by a foreign key in another table. Per informazioni dettagliate, vedere:For details, see: