Come gestire in modo efficace in modo duplicato inserzioni chiave con l'out di lanciare un'eccezione
-
29-10-2019 - |
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.
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.