Pregunta

He hojeado hasta Date y Silberschatz pero parece que no puedo encontrar respuestas a estas preguntas específicas mías.

  1. Si 2 usuarios de la base de datos emiten una consulta, diga 'seleccione * de AVERYBIGTABLE;' - ¿Dónde se almacenarían los resultados de la consulta en general ... es decir, independientemente del tamaño del conjunto de resultados?

    a. ¿En la memoria física / virtual administrada por el sistema operativo del servidor DBMS?

    b. ¿En un archivo temporal administrado por DBMS?

  2. ¿El conjunto de resultados de la consulta se mantiene por conexión?

  3. Si el conjunto de resultados de la consulta se mantiene por conexión, ¿qué sucede si hay una agrupación de conexiones en efecto (por una capa de código que se encuentra por encima del DBMS)? ¿No se mantendrá el conjunto de resultados por consulta (en lugar de por conexión)?

  4. Si la base de datos está cambiando en tiempo real mientras sus usuarios emiten simultáneamente consultas de selección, ¿qué sucede con las consultas que ya han sido ejecutadas pero que los emisores de consultas aún no han "consumido" por completo? Por ejemplo, suponga que el conjunto de resultados tiene 50,000 filas; ¿El usuario está actualmente iterando en la posición 100, cuando paralelamente otro usuario ejecuta una inserción / eliminación de manera que conduzca a más / menos de 50,000 filas si la consulta anterior fuera emitida por cualquier usuario del DBMS?

  5. Por otro lado, en el caso de una base de datos que no cambia en tiempo real, si 2 usuarios emiten consultas idénticas cada una con conjuntos de resultados idénticos pero MUY GRANDES, el DBMS mantendría 2 copias idénticas del conjunto de resultados, o tendría una sola copia compartida?

Muchas gracias de antemano.

¿Fue útil?

Solución

Algo de esto puede ser específico de Oracle.

  1. Los resultados completos de la consulta no necesitan copiarse; cada usuario obtiene un cursor (como un puntero) que mantiene qué filas se han recuperado y qué filas aún deben recuperarse. La base de datos almacenará en caché la mayor cantidad de datos posible mientras lee los datos de las tablas. El mismo principio que dos usuarios tienen identificador de archivo de solo lectura en el archivo.

  2. Los cursores se mantienen por conexión, los datos para la siguiente fila pueden o no estar en la memoria.

  3. Las conexiones en su mayor parte son de un solo hilo, solo 1 cliente puede usar una conexión a la vez. Si la misma consulta se ejecuta dos veces en la misma conexión, la posición del cursor se restablece.

  4. Si un cursor está abierto en la tabla que se está actualizando, las filas antiguas se copian en un espacio separado (deshacer en Oracle) y se mantienen durante la vida útil del cursor, o al menos hasta que se agote espacio para mantenerlo. (Oracle dará un error de instantánea demasiado antiguo)

  5. La base de datos nunca duplicará los datos almacenados en caché, en el caso de Oracle con el uso compartido del cursor, habría un solo cursor en caché y cada cursor del cliente solo tendría que mantener su posición en el cursor en caché.

Conceptos de la base de datos Oracle

Ver 8 Memoria para las preguntas 1, 2, 5

Ver 13 Concurrencia y coherencia de datos (Preguntas 3, 4)

Otros consejos

La razón por la que no encuentra esto en Date, etc. es porque podrían cambiar entre los productos DBMS, no hay nada en la teoría del modelo relacional sobre la agrupación de conexiones a la base de datos o cómo mantener los conjuntos de resultados de una consulta (como el almacenamiento en caché etc) El único punto que está parcialmente cubierto es 4, donde el nivel de lectura entraría en juego (por ejemplo, lectura no confirmada), pero esto solo se aplica hasta que se haya producido el conjunto de resultados.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top