문제

나는 날짜와 Silberschatz를 통해 훑어 보았지만 내 특정 질문에 대한 답을 찾을 수없는 것 같습니다.

  1. 2 명의 데이터베이스 사용자가 쿼리를 발행하는 경우 - 'AveryBigtable에서'select * ' - 쿼리 결과는 일반적으로 어디서 저장됩니까? 즉, 결과 세트의 크기와 무관하게?

    ㅏ. DBMS 서버의 OS로 관리되는 물리적/가상 메모리에서?

    비. DBMS 관리 임시 파일에서?

  2. 쿼리 결과 세트가 연결 당 유지됩니까?

  3. 쿼리 결과 세트가 실제로 연결 당 유지되면 연결 풀링이 적용되는 경우 (DBMS 위에 앉아있는 코드 레이어)는 어떻게됩니까? 그렇다면 결과 세트는 연결 당 대신 쿼리 당 유지되지 않습니까?

  4. 사용자가 동시에 선택 쿼리를 발행하는 동안 데이터베이스가 실시간으로 변경되는 경우, 쿼리 발급자가 이미 실행되었지만 아직 (완전히) '소비되지 않은'쿼리는 어떻게됩니까? 예를 들어, 결과 세트에 50,000 행이 있다고 가정합니다. 다른 사용자가 삽입/삭제를 실행하면 DBMS의 어떤 사용자가 이전 쿼리를 다시 발행 해야하는 경우, 다른 사용자가 삽입/삭제를 실행하면 현재 100 번째로 반복되고 있습니까?

  5. 반면에, 실시간에 변경되지 않는 데이터베이스의 경우, 2 명의 사용자가 동일하지만 매우 큰 결과 세트로 각각 동일한 쿼리를 발행하면 DBMS가 결과 세트의 동일한 사본 2 개를 유지하거나 단일이있을 것입니다. 공유 사본?

미리 감사드립니다.

도움이 되었습니까?

해결책

이 중 일부는 Oracle에만 해당 될 수 있습니다.

  1. 쿼리의 전체 결과는 각 사용자를 복사 할 필요가 없습니다. 각 사용자는 검색 된 행과 어떤 행을 가져와야하는지를 유지하는 커서 (포인터와 같은)를 가져옵니다. 데이터베이스는 테이블에서 데이터를 읽는 것처럼 가능한 한 많은 데이터를 캐시합니다. 두 사용자와 동일한 원칙은 파일에서 파일 핸들 만 읽습니다.

  2. 커서는 연결 당 유지되며 다음 행의 데이터는 메모리에 있거나 아직 메모리에있을 수 있습니다.

  3. 대부분의 연결은 단일 스레드이며 한 번에 한 번에 연결을 사용할 수 있습니다. 동일한 연결에서 동일한 쿼리가 두 번 실행되면 커서 위치가 재설정됩니다.

  4. 커서가 업데이트되는 테이블에서 열린 경우 기존 행은 별도의 공간 (Oracle에서 실행 취소)으로 복사되며 커서의 수명을 위해 또는 적어도 공간을 유지하기 위해 공간이 부족할 때까지 유지됩니다. (Oracle은 스냅 샷이 너무 오래된 오류를 줄 것입니다)

  5. 데이터베이스는 캐시에 저장된 데이터를 절대로 복제하지 않습니다. Oracle의 경우 커서 공유가있는 Oracle의 경우 단일 캐시 커서가있을 것이며 각 클라이언트 커서는 캐시 된 커서에서만 위치를 유지해야합니다.

Oracle 데이터베이스 개념

질문 1, 2, 5에 대한 8 개의 메모리 참조

13 개의 데이터 동시성 및 일관성을 참조하십시오 (질문 3, 4)

다른 팁

날짜 등으로 찾을 수없는 이유는 DBMS 제품간에 변경 될 수 있기 때문에 데이터베이스에 대한 연결을 풀링하거나 쿼리 (캐싱 등)에서 결과 세트를 유지 관리하는 방법에 대한 관계형 모델 이론에는 아무것도 없습니다. 부분적으로 다루는 유일한 지점은 4입니다. 읽기 레벨이 작동하는 곳 (예 : 읽기가 커밋되지 않음)이지만 결과 세트가 생성 될 때까지만 적용됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top