Domanda

Il mio scenario del caso passa il parametro a una procedura, che fa solo un inserto. Ma due thread potrebbero provare a passare lo stesso valore.

Come gestire questa situazione senza lanciare un'eccezione e con un minor numero di blocchi?

Il mio requisito di prestazione è di almeno 10K inserti al secondo.

MODIFICARE: La colonna è unica. Il timestamp potrebbe essere modificato (regolato) prima dell'inserimento.

È stato utile?

Soluzione

Crea indice sulla tabella con Ignora l'opzione chiave duplicata. Non inserirà una riga duplicata e non lo farà per nessun errore.

Per esempio

create unique index i1 on #tmp(id) with ignore_dup_key

insert into #tmp values(1,"A")
2> go
(1 row affected)


1> insert into #tmp values(1,"A")
2> go
Duplicate key was ignored.
(0 rows affected)

Altri suggerimenti

Prova il Unire dichiarazione

Da msdn. Uno scenario comune è l'aggiornamento di una o più colonne in una tabella se esiste una riga corrispondente o inserire i dati come nuova riga se non esiste una riga corrispondente. Questo di solito viene eseguito passando i parametri a una procedura memorizzata che contiene le istruzioni di aggiornamento e inserimento appropriate. Con l'istruzione Merge, è possibile eseguire entrambe le attività in una singola dichiarazione.

Per quanto riguarda i tuoi problemi di prestazioni, c'è anche una pagina su Ottimizzazione delle prestazioni della dichiarazione di unione

Come @Martin Smith Ha sottolineato che c'è una buona soluzione - anche se è contrario alla mia domanda, ha un buon ragionamento dietro che sembra ben supportato. La risposta originale che puoi trovare qui Pubblicato da @gbn.

BEGIN TRY
   INSERT etc
END TRY
BEGIN CATCH
    IF ERROR_NUMBER() <> 2627
      RAISERROR etc
END CATCH

Seriamente, questo è più veloce e il più simultaneo senza serrature, specialmente ad alti volumi. Cosa succede se l'UPDLOCK viene intensificato e l'intero tavolo è bloccato?

Il testo originale di Paul Nielsen puoi trovare qui. - Lezione 4.

Se qualcuno ha un problema simile al mio, è bene guardarlo.

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