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)

  • Cosa devo fare su qualcuno che prova a tentare di forzare il tentativo di accedere al nostro account 's' di SQL Server?
  • Installare i tipi SQL CLR e Report Viewer 2012 sul server Sql 2008
  • Posso modificare in modo sicuro un database SQL in diretta da Autogrow?
  • Errore del Registro di sistema durante l'installazione di SQL Server 2008 R2
  • Perché eseguire l'aggiornamento da SQL 2005 a SQL 2008 R2?
  • Importzione di un grande script SQL in SQL Server?
  • 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.

  • Come si modifica la collazione di un database di SQL Server?
  • Su Amazon Web Services qual è la differenza tra SQL Server Standard e SQL Server Web?
  • Database di crittografia SQL
  • Invia allerta del job di server sql solo quando una query ha righe da restituire
  • La ridimensionamento di una colonna chiude il tavolo?
  • Le idee sbagliate più diffuse sulla networking
  • 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.