Почему имеет смысл разбивать страницы на страницы с помощью PSQL? - PullRequest
0 голосов
/ 30 октября 2019

Я искал пагинацию (разбивку по временным меткам) с помощью PSQL dbms. В настоящее время мой подход заключается в создании индекса b +, чтобы значительно сократить затраты на поиск начала следующего фрагмента. Но везде я смотрю учебные пособия и модули NPM, такие как express-paginate (https://www.npmjs.com/package/express-paginate), люди, кажется, получают куски, используя смещение тем или иным способом или выбирая все данные в любом случае, но просто отправляя их кусками, что мне не нужноПохоже, это полная оптимизация, для которой предназначена нумерация страниц.

Я вижу, что они все еще проводят оптимизацию путем ленивой загрузки и потоковой передачи фрагментов (таким образом, сохраняя пропускную способность и любое время загрузки / обработки на клиенте. сторона), но так как смещение на psql все еще требует сканирования предыдущих строк. В худшем случае, когда пользователь хочет просмотреть все данные, разве этот подход не требует очень высоких затрат на сервер, поскольку, если у вас, скажем, n блоков, вы 'повторный доступ к первому чанку n раз, второй чек n-1 раз, третий чанк n-2 раза и т. д. Я понимаю, что это действительно с точки зрения операций ввода-вывода, так что это не так дорого, но все равно беспокоит меня?

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

1 Ответ

2 голосов
/ 30 октября 2019

Нет, вы хорошо это понимаете.

Причина, по которой так много людей и инструментов все еще отстаивают нумерацию страниц с OFFSET и LIMIT (или FETCH FIRST n ROWS ONLY, используя язык стандарта), заключается в том, чтоони мало знают о базах данных. Легко понять LIMIT и OFFSET, даже если у вас слово «указатель» для вас не имеет никакого другого значения, кроме как «последние страницы в книге».

Существует еще одна причина: реализовать ключустановите pagination, в вашем запросе должно быть предложение ORDER BY, в котором предложение ORDER BY должно содержать уникальный столбец, и вы должны создать индекс, поддерживающий этот порядок.

Кроме того, ваша база данных имеетчтобы иметь возможность обрабатывать такие условия, как

... WHERE (name, id) > ('last_found', 42)

и поддерживать сканирование индекса по нескольким столбцам для них.

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

...