Stiamo provando ad avere una tabella transazionale che inserisce solo nuovi record inseriti regolarmente.Perché SQL Server 2008 blocca SELECT su INSERT di transazioni lunghe?
Questa semplice tabella ci richiede di aggiungere continuamente nuovi record nel tempo. Si prevede che il volume delle transazioni in questa tabella sia piuttosto elevato e inoltre potrebbero esserci importazioni periodiche di transazioni batch (> 1000) che potrebbero richiedere più secondi.
Da questi dati facciamo un insieme di istruzioni select che raggruppano colonne diverse per restituire i valori richiesti.
Dai test iniziali abbiamo riscontrato un collo di bottiglia da correlare a SQL Server che blocca i nostri SELECT quando ci si trova nel mezzo di una transazione di INSERTS.
Di seguito è riportato un semplice esempio che può essere eseguito per illustrare il problema.
- Semplice DB Tabella
create table LOCK_TEST (
LOCK_TEST_ID int identity ,
AMOUNT int);
- Eseguire questo nella finestra 1 di query
begin tran
insert into LOCK_TEST (AMOUNT) values (1);
WAITFOR DELAY '00:00:15' ---- 15 Second Delay
insert into LOCK_TEST (AMOUNT) values (1);
commit
- In Query 2 run questo in parallelo
select SUM(AMOUNT)
from LOCK_TEST;
mi si aspetterebbe Interroga 2 per tornare subito, con 0 fino al completamento della query 1, quindi visualizza 2. Non vogliamo mai vedere 1 restituito dalla seconda query.
Le risposte che abbiamo esaminato riguardano WITH (NOLOCK) sull'istruzione select. Ma questo viola i confini della transazione, e le informazioni restituite potrebbero essere di natura finanziaria e non desideriamo vedere dettagli non archiviati nelle nostre query.
Il mio problema sembra essere sul lato INSERT ...
Perché l'Inserisci Blocco SELECT, anche se non è di modificare i dati esistenti?
Domanda punti bonus: Si tratta di una "funzionalità" di SQL Server o lo troveremmo anche su altri tipi di database?
UPDATE ora ho avuto il tempo di trovare un database Oracle locale ed eseguire lo stesso test semplice. Questo test pass è come mi aspetterei.
Ie posso correre domanda tutte le volte che voglio, e restituirà nulla fino a quando la prima operazione di commit, poi ritorna 2.
C'è un modo per rendere il lavoro di SQL Server in questo modo? o dobbiamo spostarci su Oracle?
quali indici avete su queste tabelle? hai una manutenzione periodica dell'indice? –
Al momento non ci sono indici. Vedere il semplice esempio elencato in questo post, nient'altro che la semplice tabella a 2 colonne, l'inserimento di base e select sono usati per ricreare questo problema. – stevemac