Domanda

Ho un processo in background che viene costantemente inserito in una tabella in tempo reale. Potrebbero essere migliaia di inserti all'ora (con alcuni aggiornamenti). Questa stessa tabella viene utilizzata dall'applicazione Web per ottenere alcuni dati necessari per la visualizzazione all'utente.

Attualmente ogni volta che il processo in background esegue inserimenti / aggiornamenti, l'app Web sembra bloccata e non può accedere al database.

Mi chiedo quale potrebbe essere una buona soluzione. Devo creare un'altra tabella in cui inserisco e quindi copiare la tabella su un'altra tabella di sola lettura? C'è un altro metodo?

Qualsiasi aiuto e suggerimento è molto apprezzato!

È stato utile?

Soluzione

Soprattutto per SQL Server potresti voler cambiare il tuo database per trasformare READ_COMMITTED_SHAPSHOT su.

Questo in pratica impedisce il blocco delle query selezionate in presenza di inserimenti / aggiornamenti in sospeso sui dati.

Altri suggerimenti

Alcune cose da guardare sarebbero:

1) I tuoi inserimenti / aggiornamenti o le tue query selezionate fanno parte delle transazioni? In tal caso, assicurati di aver impostato il livello di isolamento della transazione per la tua situazione particolare.

2) Hai troppi indici su questa gigantesca tabella? Gli indici accelerano la selezione ma rallentano inserimenti e aggiornamenti. Assicurati di avere solo gli indici di cui hai assolutamente bisogno.

3) Relativo a # 2. Ti mancano gli indici che accelereranno la selezione? Le tue dichiarazioni selezionate eseguono scansioni di tabelle complete? Dai un'occhiata al piano di esecuzione della query per vedere cosa sta realmente accadendo. (Query Analyzer può aiutarti in questo).

4) Valuta la possibilità di replicare i tuoi dati giganti su uno o più server di database di sola lettura in grado di gestire il traffico selezionato mentre la tabella principale di lettura / scrittura (ovvero la tabella esistente) gestisce principalmente il traffico di inserimento / aggiornamento.

5) Esistono trigger che si attivano nelle operazioni di inserimento / aggiornamento che potrebbero causare problemi di prestazioni o blocco?

6) L'applicazione sta riscontrando transazioni in deadlock? Dai un'occhiata a questo articolo MSDN sull'argomento e vedi se aiuta. Inoltre, assicurati di comprendere il problema dei filosofi di sala in modo da evitare transazioni in deadlock.

Se sei su Enterprise Edition, la soluzione ideale sarebbe quella di utilizzare il partizionamento della finestra scorrevole. In sostanza, crei una tabella identica nello stesso filegroup, carichi i dati in detta tabella e quindi " switch " la partizione della tabella nella tabella di produzione. L'operazione effettiva è solo una vibrazione di metadati, quindi avviene più o meno istantaneamente. Dai un'occhiata qui per maggiori informazioni: http://technet.microsoft.com/en-us/library/ms191160. aspx

Se hai solo bisogno di leggere i dati dalla tabella nell'applicazione web, potresti provare a usare il livello di isolamento READ_UNCOMMITTED per la query. Non richiede alcun blocco e legge i dati non impegnati. Non consiglierei di farlo per qualcosa di simile a un'applicazione bancaria, ma la maggior parte delle tipiche applicazioni web aziendali probabilmente non avrebbero problemi. Assicurati di reimpostare il livello di isolamento su ciò che di solito usi (LEGGI IMPEGNATO?) Dopo la query.

Se l'utilizzo di READ_UNCOMMITTED non ti va bene, potresti familiarizzare con Row Livelli di isolamento basati sulla versione . Ad esempio, l'isolamento dello snapshot utilizza un approccio ottimistico alla modifica dei dati, riducendo così la necessità di eseguire il blocco pessimistico delle righe.

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