Come gestisce SQL Server le richieste di lettura / scrittura simultanee?

Sfondo:

Abbiamo un'applicazione che utilizza fortemente un database di SQL Server 2008. Stiamo cercando di ottimizzare questa applicazione. E 'stato filettato singolarmente, e abbiamo notato attraverso il logging / profiling dell'app che il più grande bottleneck fosse db reads / writes. Alcune chiamate hanno preso fino a 100 ms, che è troppo a lungo per affrontare. Tra le altre ottimizzazioni, abbiamo separato alcune di queste chiamate in un thread separato. Da questo solo cambiamento, vediamo un notevole miglioramento nel tempo di elaborazione (il codice è quasi esattamente lo stesso, solo alcuni sono stati spostati in un thread diverso)

Domanda:

Supponendo che il tempo trascorso in esecuzione del codice in memory è trascurabile, avrei indovinato che l'esecuzione di alcune delle letture / scrive in un altro thread non avrebbe alcun risultato di rendimento. Sento che se SQL Server stava semplicemente in coda alle richieste, le letture / scritture non potrebbero accadere in parallelo comunque in modo che il tempo di elaborazione sarebbe simile. Questo non è il caso.

Mi chiedo come SQL Server gestisce due richieste simultanee (qualsiasi combinazione di lettura / scrittura) da thread diversi. È in qualche modo in grado di eseguirli contemporaneamente?

In sintesi, avrei pensato che il tempo totale di Query1 + Query2 chiamato uno dopo l'altro sarebbe simile a Query1 + Query2 chiamato contemporaneamente.

Questo è in esecuzione su un server dual core.

  • Bloccato da SQL Server 2008
  • Perché il mio piano di manutenzione di SQL Server 08 non funziona affatto?
  • Quanti contatori di performance sono i migliori 5 per verificare la salute della mia casella di SQL Server 2008
  • Aggiungere l'utente corrente di amministratore a SQL Server Express 2008
  • Disponibilità di SQL Server 2008 R2 100%
  • L'account di MS SQL Server 2008 è bloccato e il login di authentication di Windows è distriggersto
  • SQL Server 2008: cosa succede se l'identity framework; supera il valore massimo di int?
  • Sta ospitando i miei siti web e database con fornitori diversi una ctriggers idea?
  • 3 Solutions collect form web for “Come gestisce SQL Server le richieste di lettura / scrittura simultanee?”

    SQL Server è un database multiutente. È destinato principalmente a gestire più richieste simultanee.

    Idealmente, due query che richiedono A + B quando eseguite in serie richiedono MAX (A, B) quando eseguite simultaneamente.

    Per evitare che i dati danneggiati vengano letti o scritti, SQL Server utilizza transactions e block . Oltre a ciò, le applicazioni possono anche gestire la concorrenza ( ottimista , ad esempio).

    Penso che David B ha fornito una buona risposta, ma sto solo andando ad ampliarlo un po 'qui con un esempio.

    Diciamo che hai due tabelle nel tuo database, Table_A e Table_B. Il server dispone di più processri. Inoltre, il sottosistema del disco mette each tabella su un drive separato / LUN / mandrino (qualunque sia la terminologia corretta, io non sono un grande tipo hardware). Inoltre, il server dispone di più tabs NIC.

    Se due utenti accedono al database e si vuole scrivere a Table_A mentre un altro vuole leggere da Table_B, speriamo di vedere come le richieste possono venire contemporaneamente su diverse tabs di networking, essere gestite contemporaneamente da diverse CPU / core e l'IO l'attività potrebbe verificarsi simultaneamente sui diversi dischi.

    Ora, nel mondo reale raramente è così semplice. Di solito sono presenti strozzature in una o più di queste aree a seconda dell'hardware e dell'utilizzo dell'applicazione. Inoltre, se entrambi gli utenti tentano di accedere alle stesse righe della stessa tabella, potrebbe causare un collo di bottiglia delle risorse. Così, nella vita reale ci sono persone che spendono gran parte del loro tempo cercando di trovare quali risorse stanno causando queste strozzature per un'applicazione e sbarazzarsi di quelle colli di bottiglia. Alless però, di solito ci sono alcune aree in cui le cose possono essere elaborate in parallelo.

    La tua domanda implica che, prima dei miglioramenti, l'accesso SQL è stato sequenziale, cioè le query successive vengono eseguite una dopo l'altra, sulla stessa connessione, nello stesso thread di codice.

    Spostamento della logica in thread separati provocherà due effetti distinti: in primo luogo, il codice non deve più aspettare che each query finisca prima di continuare, e in secondo luogo le query SQL verranno parallele (ad un certo livello), consentendo al server SQL di ottimizzare i dati accesso ai file – che è lontano, molto meglio di quanto il codice potrebbe mai essere.

    Supponendo che il codice sia costituito da più di una chiamata SQL pura, il primo può avere un grande impatto come il secondo.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.