Является ли последовательное чтение с диска действительно последовательным?

Я использую PostgreSQL 9.4.

Во-первых, у меня установлен postgreSQL в системе с единственным ssd-диском.

Я пытаюсь понять, что такое последовательное чтение, и в итоге возникает какая-то проблема. Например, если мы попросим SQL-сервер предоставить нам некоторые неиндексированные данные, скорее всего, произойдет последовательное сканирование. Но что, если два разных клиента одновременно запрашивают данные из двух разных таблиц? В этом случае sql-server создает два разных процесса для каждого клиента и одновременно выполняет запросы.

Но если запросы выполняются одновременно, головка диска должна перейти из области, в которой хранится первая таблица, в область, в которой находится вторая.

Таким образом, у нас фактически нет последовательного чтения, прыгающего между областями таблиц. Где я ношу? Не могли бы вы немного объяснить эти вещи?


person St.Antario    schedule 10.09.2015    source источник
comment
@user2864740 user2864740 Ну да, но я не рассматриваю этот случай... Если сервер только что запущен, у нас все кэши пусты.   -  person St.Antario    schedule 10.09.2015
comment
возможно, он уже находится в буферах --- честно говоря, в большинстве случаев данные считываются только из кеша файловой системы.   -  person zerkms    schedule 10.09.2015
comment
@zerkms Вы имеете в виду, что планировщик выставляет как shared hits? Но мы не можем предположить, что вся таблица находится в чаше. Это то, что я знаю. Таким образом, чтение кучи произойдет в любом случае.   -  person St.Antario    schedule 10.09.2015
comment
даже если это холодный запуск, большинство приложений не считывают напрямую с устройства хранения, а только из кэша. Это означает, что ядро ​​сначала загружает данные в кеш, а затем ваше приложение читает их оттуда. Думайте об этом как о кэше для чтения.   -  person zerkms    schedule 10.09.2015
comment
Ваш вопрос касается MS SQL Server, но вы пометили его как PostgreSQL. Который? PostgreSQL и MS SQL используют довольно разные методы доступа к диску, насколько мне известно.   -  person Craig Ringer    schedule 10.09.2015


Ответы (1)


"последовательное сканирование" означает, что таблица читалась от начала до конца, последовательно строка за строкой. Это ничего не значит с точки зрения того, как данные считываются из физического хранилища.

Таким образом, этот термин относится к логическим чтениям.

Не уверен, что ответ нуждается в дополнительных пояснениях.

person zerkms    schedule 10.09.2015
comment
Что ж, я думал, что термины последовательное сканирование и random_block_read тесно связаны с терминами, применяемыми к диску. т.е. Я предполагаю, но не знаю точно, что SQL-сервер хранит данные каждой таблицы, которую он имеет, последовательно, блок за блоком на диске. - person St.Antario; 10.09.2015
comment
@St.Antario SQL-сервер хранит данные каждой таблицы последовательно, блок за блоком на диске. --- Как вы думаете, почему эти блоки физически организованы друг за другом? - person zerkms; 10.09.2015
comment
Потому что это, вероятно, сделает операцию чтения более оптимальной, выполняя ее последовательно, а не случайным образом. Но, как я уже сказал, я не знаю этого наверняка. - person St.Antario; 10.09.2015
comment
Потому что это, вероятно, сделает операцию чтения более оптимальной --- это действительно было бы более оптимальным. Как если бы все дороги были прямыми без светофоров - вы бы быстрее добирались до офиса. Хотя это утопия. - person zerkms; 10.09.2015
comment
@St.Antario: даже если SQL Server хранит данные в кластерном индексе (что означает, что данные логически отсортированы на диске), это все равно не означает, что данные записываются физически таким образом. Файл данных может не быть непрерывным на диске. И если в фоновом режиме есть система RAID (которая в основном используется по умолчанию для любого серьезного производственного сервера БД), то файл определенно не является непрерывным, поскольку он распределен по нескольким дискам. Плюс: у Postgres нет кластеризованного индекса, поэтому данные никогда не хранятся (логически) в отсортированном виде. - person a_horse_with_no_name; 10.09.2015
comment
@St.Antario Ни в SQL Server, ни в PostgreSQL термины «случайное чтение/последовательное сканирование» не относятся к тому, что происходит в файловой системе на уровне блоков диска. - person nos; 10.09.2015
comment
@a_horse_with_no_name Но чтение индексов означает выполнение некоторого количества операций произвольного чтения. И по умолчанию операции случайного чтения стоят в 4 раза больше, чем последовательные. Итак, что означает произвольное чтение при сканировании индексов с точки зрения PostgreSQL? - person St.Antario; 10.09.2015
comment
Случайное чтение @St.Antario означает, что доступ к фрагментам структуры данных осуществлялся случайным образом (как следует из названия). - person zerkms; 10.09.2015
comment
@zerkms Случайным образом в смысле выбора любого случайного блока из всего, что содержится в индексе? Но на самом деле мы выполняем обход btree при чтении индексов btree. И мы должны пройти от корневого элемента к нижнему. Где здесь может происходить случайное чтение? Я смущен.... - person St.Antario; 10.09.2015
comment
@St.Antario не случайно с точки зрения логики приложения, а с точки зрения шаблонов доступа. Когда вам нужно получить средний элемент (как в бинарном поиске) — вы выполняете произвольный доступ к N-му элементу структуры. - person zerkms; 10.09.2015
comment
@zerkms А, кажется, теперь я понимаю ... Он просто называется random access и не имеет ничего общего со случайным дисковым вводом-выводом, как я изначально думал. Концепция лежит поверх работы аппаратного обеспечения. Могу ли я так думать об этом? - person St.Antario; 10.09.2015
comment
@St.Antario вообще забудьте о хранении. - person zerkms; 10.09.2015