Funzione JetOpenTempTable

Si applica a: Windows | Windows Server

Funzione JetOpenTempTable

La funzione JetOpenTempTable crea una tabella temporanea con un singolo indice. Una tabella temporanea archivia e recupera i record come una tabella normale creata usando JetCreateTableColumnIndex. Tuttavia, le tabelle temporanee sono molto più veloci rispetto alle tabelle normali a causa della loro natura volatile. Possono anche essere usati per ordinare in modo molto rapido ed eseguire la rimozione duplicata nei set di record quando si accede in modo puramente sequenziale.

    JET_ERR JET_API JetOpenTempTable(
      __in          JET_SESID sesid,
      __in          const JET_COLUMNDEF* prgcolumndef,
      __in          unsigned long ccolumn,
      __in          JET_GRBIT grbit,
      __out         JET_TABLEID* ptableid,
      __out         JET_COLUMNID* prgcolumnid
    );

Parametri

sesid

Sessione da usare.

prgcolumndef

Definizioni di colonna per le colonne create nella tabella temporanea.

Esistono limitazioni importanti per le opzioni di definizione della colonna usate con una tabella temporanea. Per altre informazioni, vedere la sezione Osservazioni.

Oltre alle opzioni di definizione di colonna consuete, è possibile specificare zero o più delle opzioni seguenti che sono rilevanti solo nel contesto di una tabella temporanea.

Valore

Significato

JET_bitColumnTTDescending

L'ordinamento della colonna chiave per la tabella temporanea deve essere decrescente anziché crescente. Se questa opzione viene specificata senza JET_bitColumnTTKey, questa opzione viene ignorata.

JET_bitColumnTTKey

La colonna sarà una colonna chiave per la tabella temporanea.

L'ordine delle definizioni di colonna con questa opzione specificata nella matrice di input determina la precedenza di ogni colonna chiave per la tabella temporanea. La prima definizione di colonna nella matrice con questo set di opzioni sarà la colonna chiave più significativa e così via. Se sono richieste più colonne chiave di quanto possa essere supportato dal motore di database, questa opzione viene ignorata per le colonne chiave non supportate.

ccolumn

Vedere prgcolumndef.

grbit

Un gruppo di bit che specificano zero o più delle opzioni seguenti.

Valore

Significato

JET_bitTTErrorOnDuplicateInsertion

Qualsiasi tentativo di inserimento di un record con la stessa chiave di indice di un record inserito in precedenza avrà esito negativo con JET_errKeyDuplicate. Se questa opzione non viene richiesta, viene rilevato immediatamente un duplicato e non riesce oppure viene rimosso in modo automatico in un secondo momento, a seconda della strategia scelta dal motore di database per implementare la tabella temporanea, in base alla funzionalità richiesta.

Se questa funzionalità non è necessaria, è preferibile non richiederla. Se questa funzionalità non è richiesta, la gestione tabelle temporanee può essere in grado di scegliere una strategia per la gestione della tabella temporanea che comporterà un miglioramento delle prestazioni.

JET_bitTTForceMaterialization

Forza il gestore tabelle temporanee ad abbandonare la ricerca della strategia migliore per usare la gestione della tabella temporanea che comporterà prestazioni migliorate.

JET_bitTTForwardOnly

La tabella temporanea viene creata solo se gestione tabelle temporanee può usare l'implementazione ottimizzata per i risultati delle query intermedie. Se una caratteristica della tabella temporanea impedisce l'uso di questa ottimizzazione, l'operazione avrà esito negativo con JET_errCannotMaterializeForwardOnlySort.

Un effetto collaterale di questa opzione consiste nell'consentire alla tabella temporanea di contenere record con chiavi di indice duplicate. Per altre informazioni, vedere JET_bitTTUnique.

Questa opzione è disponibile solo nelle versioni di Windows Server 2003 e versioni successive.

JET_bitTTIndexed

Questa opzione richiede che la tabella temporanea sia abbastanza flessibile per consentire l'uso di JetSeek per cercare i record in base alla chiave di indice.

Se questa funzionalità non è necessaria, è preferibile non richiederla. Se questa funzionalità non è richiesta, la gestione tabelle temporanee può essere in grado di scegliere una strategia per la gestione della tabella temporanea che comporterà un miglioramento delle prestazioni.

JET_bitTTUnique

Richieste che registrano con chiavi di indice duplicate vengano rimosse dal set finale di record nella tabella temporanea.

Prima di Windows Server 2003, il motore di database ha sempre assunto questa opzione a causa del fatto che tutti gli indici cluster devono essere anche una chiave primaria e quindi devono essere univoci. A partire da Windows Server 2003, è ora possibile creare una tabella temporanea che non rimuove duplicati quando viene specificata anche l'opzione JET_bitTTForwardOnly.

Non è possibile sapere quale duplicato avrà esito positivo e quali duplicati verranno eliminati, in generale. Tuttavia, quando l'opzione JET_bitTTErrorOnDuplicateInsertion viene richiesta, il primo record con una determinata chiave di indice da inserire nella tabella temporanea avrà sempre esito positivo.

JET_bitTTUpdatable

Richiede che la tabella temporanea sia abbastanza flessibile per consentire la modifica dei record inseriti in precedenza. Se questa funzionalità non è necessaria, è preferibile non richiederla.

Se questa funzionalità non è richiesta, la gestione tabelle temporanee può essere in grado di scegliere una strategia per la gestione della tabella temporanea che comporterà un miglioramento delle prestazioni.

JET_bitTTScrollable

Richiede che la tabella temporanea sia abbastanza flessibile per consentire l'analisi dei record in ordine arbitrario e direzione usando JetMove.

Se questa funzionalità non è necessaria, è consigliabile non richiederla. Se questa funzionalità non è richiesta, la gestione tabelle temporanee può essere in grado di scegliere una strategia per la gestione della tabella temporanea che comporterà un miglioramento delle prestazioni.

JET_bitTTSortNullsHigh

Richiede che i valori di colonna chiave NULL siano ordinati più vicino alla fine dell'indice rispetto ai valori di colonna non NULL.

JET_bitTTIntrinsicLVsOnly

Richieste per consentire solo valori intrinseci a lungo termine.

Windows 7: JET_bitTTIntrinsicLVsOnly è stato introdotto in Windows 7.

ptableid

Buffer di output che riceve il nuovo cursore aperto nella tabella temporanea appena creata.

prgcolumnid

Buffer di output che riceve la matrice di ID di colonna generati durante la creazione della tabella temporanea.

Gli ID di colonna in questa matrice corrispondono esattamente alla matrice di input delle definizioni di colonna. Di conseguenza, le dimensioni di questo buffer devono corrispondere alle dimensioni della matrice di input.

Valore restituito

Questa funzione restituisce il tipo di dati JET_ERR con uno dei codici restituiti seguenti. Per altre informazioni sugli errori ESE possibili, vedere Errori del motore di archiviazione estendibili e parametri di gestione degli errori.

Codice restituito

Descrizione

JET_errSuccess

Operazione riuscita.

JET_errCannotMaterializeForwardOnlySort

JetOpenTempTable non è riuscito perché JET_bitTTForwardOnly è stato specificato e la tabella temporanea come specificato non è stato possibile creare usando l'ottimizzazione solo in avanti. Questo errore verrà restituito solo da Windows Server 2003 e versioni successive.

JET_errClientRequestToStopJetService

Non è possibile completare l'operazione perché tutte le attività nell'istanza associata alla sessione non sono state interrotte in seguito a una chiamata a JetStopService.

JET_errIndexInvalidDef

Impossibile creare l'indice perché è stata specificata una definizione di indice non valida.

JetOpenTempTable restituirà questo errore quando:

  • Le impostazioni locali Language Neutral sono specificate.

  • Viene specificato un set non valido di flag di normalizzazione.

Questo errore verrà restituito solo da Windows 2000.

JET_errInstanceUnavailable

Non è possibile completare l'operazione perché l'istanza associata alla sessione ha rilevato un errore irreversibile che richiede che l'accesso a tutti i dati venga revocato per proteggere l'integrità dei dati. Questo errore verrà restituito solo da Windows XP e versioni successive.

JET_errInvalidCodePage

Il campo cp della JET_COLUMNDEF non è stato impostato su una tabella codici valida. Gli unici valori validi per le colonne di testo sono inglese (1252) e Unicode (1200). Un valore pari a 0 indica che il valore predefinito verrà usato (inglese, 1252).

JET_errInvalidColumnType

Il campo coltyp del JET_COLUMNDEF non è stato impostato su un tipo di colonna valido.

JET_errInvalidLanguageId

Impossibile creare l'indice perché è stato effettuato un tentativo di usare un ID delle impostazioni locali non valido. L'ID delle impostazioni locali potrebbe non essere completamente valido o il Language Pack associato potrebbe non essere installato.

JET_errInvalidLCMapStringFlags

Impossibile creare l'indice perché è stato effettuato un tentativo di usare un set non valido di flag di normalizzazione. Questo errore verrà restituito solo da Windows XP e versioni successive. In Windows 2000 i flag di normalizzazione non validi generano invece JET_errIndexInvalidDef.

JET_errInvalidSesid

L'handle di sessione non è valido o fa riferimento a una sessione chiusa.

Nota Questo errore non viene restituito in tutte le circostanze. Gli handle vengono convalidati solo su base ottimale.

JET_errNotInitialized

Non è possibile completare l'operazione perché l'istanza associata alla sessione non è ancora stata inizializzata.

JET_errOutOfCursors

Operazione non riuscita perché il motore non può allocare le risorse necessarie per aprire un nuovo cursore. Le risorse del cursore vengono configurate usando JetSetSystemParameter con JET_paramMaxCursors.

JET_errOutOfMemory

L'operazione non è riuscita perché non è possibile allocare memoria sufficiente per completarla.

JetOpenTempTable può restituire JET_errOutOfMemory se lo spazio indirizzi del processo host diventa troppo frammentato. La gestione tabelle temporanee allocherà sempre un blocco di 1 MB di spazio indirizzi per ogni tabella temporanea creata indipendentemente dalla quantità di dati da archiviare.

JET_errRestoreInProgress

Non è possibile completare l'operazione perché un'operazione di ripristino è in corso nell'istanza associata alla sessione.

JET_errSessionSharingViolation

La stessa sessione non può essere usata contemporaneamente per più thread.

Questo errore verrà restituito solo da Windows XP e versioni successive.

JET_errTermInProgress

Non è possibile completare l'operazione perché l'istanza associata alla sessione viene arrestata.

JET_errTooManyColumns

È stato effettuato un tentativo di aggiungere troppe colonne alla tabella. Una tabella non può avere più di JET_ccolFixedMost colonne fisse, non più di JET_ccolVarMost colonne a lunghezza variabile e non più di JET_ccolTaggedMost colonne contrassegnate.

JET_errTooManyOpenIndexes

Operazione non riuscita perché il motore non può allocare le risorse necessarie per memorizzare nella cache gli indici della tabella. Il numero di indici il cui schema può essere memorizzato nella cache è configurato usando JetSetSystemParameter con JET_paramMaxOpenTables.

JET_errTooManyOpenTables

Operazione non riuscita perché il motore non può allocare le risorse necessarie per memorizzare nella cache lo schema della tabella. Il numero di tabelle di cui è possibile memorizzare nella cache lo schema è configurato usando JetSetSystemParameter con JET_paramMaxOpenTables.

JET_errTooManySorts

Operazione non riuscita perché il motore non può allocare le risorse necessarie per creare una tabella temporanea. Le risorse di tabella temporanee vengono configurate usando JetSetSystemParameter con JET_paramMaxTemporaryTables.

In caso di esito positivo, verrà restituito un cursore aperto nella tabella temporanea appena creata. Lo stato del database temporaneo verrà preparato per contenere la nuova tabella temporanea. Lo stato di tutti i database normali in uso dal motore di database rimarrà invariato.

In caso di errore, la tabella temporanea non verrà creata e non verrà restituito un cursore. Lo stato del database temporaneo può essere modificato. Lo stato di tutti i database normali in uso dal motore di database rimarrà invariato.

Commenti

Le tabelle temporanee non supportano il complemento completo delle opzioni di definizione di colonna che sono normalmente supportate dal motore di database. Infatti, sono supportati solo JET_bitColumnFixed e JET_bitColumnTagged. Ciò significa che non è possibile creare una colonna con incremento automatico, versione o multivalore in una tabella temporanea. Infine, le colonne di aggiornamento di escrow non sono supportate perché non sono utili in una tabella temporanea poiché possono essere usate solo da una sessione alla volta. Se una di queste opzioni viene richiesta, verranno ignorate.

Le tabelle temporanee non supportano i valori predefiniti. Se viene fornita una definizione di colonna che contiene una specifica di valore predefinita, tale specifica verrà ignorata.

Le tabelle temporanee vengono restituite al chiamante come risultato di molte funzioni ESE diverse. Ad esempio, JetGetIndexInfo con l'opzione JET_IdxInfo impostata nel parametro InfoLevel restituirà una tabella temporanea contenente un elenco di tutte le colonne chiave in un determinato indice. Le tabelle temporanee seguono le stesse regole del ciclo di vita delle tabelle temporanee normali descritte qui.

Le tabelle temporanee vengono usate internamente dal motore di database per molte attività. La più importante di queste attività è la creazione di un indice su una tabella esistente. Verrà usata una tabella temporanea per ordinare le chiavi di indice usate per costruire tale indice.

Tutte le tabelle temporanee vengono archiviate nel database temporaneo. Il database temporaneo è un file di database speciale gestito durante la durata di un'istanza ESE e viene eliminato quando tale istanza viene arrestata o riavviata. Il percorso del database temporaneo può essere configurato usando JetSetSystemParameter con JET_paramTempPath. Il posizionamento del database temporaneo sul disco rispetto ai file di log delle transazioni e ai file di database può essere importante se l'applicazione usa pesantemente tabelle temporanee o crea spesso indici.

Il ciclo di vita di una tabella temporanea è associato ai cursori che lo fanno riferimento. Se tutti i cursori che fanno riferimento a una tabella temporanea vengono chiusi, in modo implicito o esplicito, la tabella temporanea verrà eliminata. Se una tabella temporanea viene creata all'interno di una transazione e tale transazione viene successivamente eseguito il rollback, la tabella temporanea verrà eliminata perché tutti i cursori a cui fa riferimento in questo momento verranno chiusi in modo implicito. I nuovi cursori possono fare riferimento a una tabella temporanea solo tramite l'uso di JetDupCursor. In questo caso, i nuovi cursori verranno posizionati sulla prima voce di indice della tabella temporanea. JetDupCursor funzionerà solo durante determinate fasi di utilizzo per la tabella temporanea. Per altre informazioni, vedere le osservazioni relative alle funzionalità del cursore della tabella temporanea. Non è possibile fare riferimento a una tabella temporanea da più sessioni alla volta.

C'è un problema importante in JetDupCursor che influisce sulle tabelle temporanee. Se viene eseguito un tentativo di duplicare una tabella temporanea in modalità forward-only, il cursore risultante non verrà creato correttamente e non funzionerà correttamente. È comunque sicuro duplicare un cursore su una tabella temporanea materializzata.

Gestione tabelle temporanee può scegliere di implementare una tabella temporanea in tre modi. Il primo metodo consiste nel mantenere una tabella in memoria. Questa strategia è la più veloce, ma può essere usata solo per tabelle temporanee di piccole dimensioni. Il secondo metodo consiste nel creare un ordinamento basato su disco che può essere guidato usando un iteratore solo forward.The second method is to create a disk-based sort that can be driven using a forward-only iterator. Questa strategia può essere usata solo in determinate circostanze ed è il modo più veloce per ordinare e rimuovere duplicati da un set di dati molto grande. Il terzo metodo consiste nel creare un albero B+ nel database temporaneo per contenere la tabella temporanea. Questa strategia è la più lenta, ma la più versatile e viene definita una tabella temporanea materializzata. Queste strategie possono essere usate in combinazione per ottenere in definitiva la funzionalità richiesta della tabella temporanea.

Quando la tabella temporanea non viene materializzata, viene usata principalmente in due fasi principali. La prima fase è la fase di inserimento in cui la tabella viene popolata con il set di dati iniziale. Durante questa fase è consentito solo l'inserimento dei dati. Questa fase termina quando viene eseguito un tentativo di spostare il cursore usando JetMove o JetSeek. La seconda fase è la fase di estrazione dei dati. Durante questa fase, i dati archiviati nella tabella temporanea possono essere estratti in base alle funzionalità richieste al momento della creazione della tabella temporanea.

Funzionalità del cursore di tabella temporanea

Quando la tabella temporanea viene materializzata, il cursore ha le funzionalità seguenti, ma può essere ulteriormente limitato dalle opzioni richieste:

Quando la tabella temporanea non viene materializzata e si trova nella fase di inserimento, il cursore ha le funzionalità seguenti, ma può essere ulteriormente limitato dalle opzioni richieste:

Quando la tabella temporanea non viene materializzata e si trova nella fase di estrazione, il cursore ha le funzionalità seguenti, ma può essere ulteriormente limitato dalle opzioni richieste:

Requisiti

Requisito Valore

Client

Richiede Windows Vista, Windows XP o Windows 2000 Professional.

Server

Richiede Windows Server 2008, Windows Server 2003 o Windows 2000 Server.

Intestazione

Dichiarato in Esent.h.

Libreria

Usare ESENT.lib.

DLL

Richiede ESENT.dll.

Vedere anche

JET_COLUMNDEF
JET_COLUMNID
JET_ERR
JET_GRBIT
JET_SESID
JET_TABLEID
JET_UNICODEINDEX
JetCloseTable
JetCreateTableColumnIndex
JetDupCursor
JetMove
JetRollback
JetSeek
JetSetSystemParameter
Parametri di database temporanei