Domanda

Ho sfogliato Date e Silberschatz ma non riesco a trovare risposte a queste mie domande specifiche.

  1. Se 2 utenti del database generano una query, ad esempio "selezionare * da AVERYBIGTABLE;" - dove verranno archiviati i risultati della query in generale ... ovvero, indipendentemente dalle dimensioni del set di risultati?

    a. Nella memoria fisica / virtuale gestita dal sistema operativo del server DBMS?

    b. In un file temporaneo gestito da DBMS?

  2. Il set di risultati della query è gestito per connessione?

  3. Se il set di risultati della query viene effettivamente mantenuto per connessione, cosa succede se è attivo il pool di connessioni (da uno strato di codice sopra il DBMS)? Quindi, il set di risultati non verrà mantenuto per query (anziché per connessione)?

  4. Se il database cambia in tempo reale mentre i suoi utenti eseguono simultaneamente query di selezione, cosa succede alle query che sono già state eseguite ma non ancora (completamente) "consumate" dagli utenti delle query? Ad esempio, supponiamo che il set di risultati abbia 50.000 righe; l'utente sta attualmente eseguendo l'iterazione al 100 °, quando parallelamente un altro utente esegue un inserimento / eliminazione in modo tale che porterebbe a più / meno di 50.000 righe se la query precedente dovesse essere riemessa da qualsiasi utente del DBMS?

  5. D'altra parte, nel caso di un database che non cambia in tempo reale, se 2 utenti inviano query identiche ciascuna con set di risultati identici ma MOLTO GRANDI, il DBMS manterrebbe 2 copie identiche del set di risultati, o avrebbe una singola copia condivisa?

Molte grazie in anticipo.

È stato utile?

Soluzione

Alcuni di questi potrebbero essere specifici di Oracle.

  1. Non è necessario copiare i risultati completi della query per ogni utente che ottiene un cursore (come un puntatore) che mantiene quali righe sono state recuperate e quali righe devono ancora essere recuperate. Il database memorizzerà nella cache il maggior numero di dati possibile poiché legge i dati dalle tabelle. Lo stesso principio di due utenti ha letto solo l'handle del file sul file.

  2. I cursori vengono mantenuti per connessione, i dati per la riga successiva potrebbero essere o non essere già in memoria.

  3. Le connessioni per la maggior parte sono a thread singolo, solo 1 client può utilizzare una connessione alla volta. Se la stessa query viene eseguita due volte sulla stessa connessione, la posizione del cursore viene ripristinata.

  4. Se un cursore è aperto sulla tabella che viene aggiornata, le vecchie righe vengono copiate in uno spazio separato (annulla in Oracle) e viene mantenuta per tutta la vita del cursore, o almeno fino a quando non si esaurisce spazio per mantenerlo. (Oracle restituirà uno snapshot con un errore troppo vecchio)

  5. Il database non duplicherà mai i dati memorizzati nella cache, nel caso di Oracle con la condivisione del cursore ci sarebbe un singolo cursore memorizzato nella cache e ogni cursore client dovrebbe solo mantenere la sua posizione nel cursore memorizzato nella cache.

Oracle Database Concepts

Vedi 8 Memoria per le domande 1, 2, 5

Vedi 13 Concorrenza e coerenza dei dati (domande 3, 4)

Altri suggerimenti

Il motivo per cui non lo trovi in ??Date etc è perché potrebbero cambiare tra i prodotti DBMS, non c'è nulla nella teoria dei modelli relazionali sul raggruppamento delle connessioni al database o su come mantenere i set di risultati da una query (come la cache eccetera). L'unico punto che è parzialmente coperto è 4 - dove entrerebbe in gioco il livello di lettura (ad es. Lettura senza commit), ma questo vale solo fino a quando non è stato prodotto il set di risultati.

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