Некоторые основные вопросы по СУБД

StackOverflow https://stackoverflow.com/questions/1016444

  •  06-07-2019
  •  | 
  •  

Вопрос

Я просмотрел Date и Silberschatz, но, похоже, не могу найти ответы на эти конкретные мои вопросы.

  1. Если 2 пользователя базы данных отправят запрос - скажем, 'select * from AVERYBIGTABLE;' - где вообще будут сохранены результаты запроса...т. е. независимо от размера результирующего набора?

    a.В управляемой операционной системой физической / виртуальной памяти сервера СУБД?

    b.Во временном файле, управляемом СУБД?

  2. Поддерживается ли набор результатов запроса для каждого соединения?

  3. Если набор результатов запроса действительно поддерживается для каждого соединения, то что, если действует пул соединений (с помощью слоя кода, расположенного над СУБД)?Разве тогда результирующий набор не будет поддерживаться для каждого запроса (а не для каждого соединения)?

  4. Если база данных меняется в режиме реального времени, в то время как ее пользователи одновременно отправляют запросы select, что происходит с запросами, которые уже были выполнены, но еще не (полностью) "использованы" отправителями запросов?Например, предположим, что результирующий набор содержит 50 000 строк;пользователь в настоящее время выполняет итерацию на 100-й, когда параллельно другой пользователь выполняет вставку / удаление таким образом, что это привело бы к большему количеству / меньшему количеству строк, чем 50 000, если бы предыдущий запрос был повторно выдан любым пользователем СУБД?

  5. С другой стороны, в случае базы данных, которая не изменяется в режиме реального времени, если 2 пользователя отправляют идентичные запросы, каждый с идентичными, но ОЧЕНЬ БОЛЬШИМИ наборами результатов, будет ли СУБД поддерживать 2 идентичные копии набора результатов или у нее будет одна общая копия?

Заранее большое спасибо.

Это было полезно?

Решение

Кое-что из этого может быть специфичным для Oracle.

  1. Полные результаты запроса копировать не нужно, каждый пользователь получает курсор (например, указатель), который отслеживает, какие строки были извлечены и какие строки еще нужно извлечь.База данных будет кэшировать столько данных, сколько сможет, по мере считывания данных из таблиц.Тот же принципал, что и у двух пользователей, имеет дескриптор файла только для чтения в файле.

  2. Курсоры поддерживаются для каждого соединения, данные для следующей строки могут быть, а могут и не быть уже в памяти.

  3. Соединения по большей части являются однопоточными, одновременно только 1 клиент может использовать соединение.Если один и тот же запрос выполняется дважды по одному и тому же соединению, то положение курсора сбрасывается.

  4. Если курсор открыт в таблице, которая обновляется, то старые строки копируются в отдельное пространство (отменить в Oracle) и поддерживаются в течение срока службы курсора или, по крайней мере, до тех пор, пока не закончится место для его обслуживания.(Oracle выдаст снимок слишком старой ошибки)

  5. База данных никогда не будет дублировать данные, хранящиеся в кэше, в случае Oracle с общим использованием курсора был бы один кэшированный курсор, и каждый клиентский курсор должен был бы поддерживать только свое положение в кэшированном курсоре.

Концепции баз данных Oracle

Вопросы 1, 2, 5 см. в разделе 8 Memory

См. 13 Параллелизм и согласованность данных (вопросы 3, 4)

Другие советы

Причина, по которой вы не находите этого в Date etc, заключается в том, что они могут меняться между продуктами СУБД, в теории реляционной модели ничего нет о объединении соединений с базой данных или о том, как поддерживать результирующие наборы из запроса (например, кэширование и т.д.).Единственный пункт, который частично покрыт, - это 4, где будет задействован уровень чтения (например, чтение без ограничений), но это применимо только до тех пор, пока не будет создан результирующий набор.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top