Можно ли улучшить производительность этого постгресного пейджингового sql? - PullRequest
0 голосов
/ 03 июня 2019

У меня есть HTTP-клиент, который хочет просто отправить смещение в строке запроса для обработки подкачки, например, http://foo.com/cars?offset=50.

В ответ они получают модель, которая имеет общее количество элементов и массив данных. {"totalitemcount":100, "data":[{"id":1,"name":"Porsche"},{"id":2, "name":"Ferrari"}]}

SQL, который я использую для этого, приведен ниже:

select count(items.id) over() as totalitemcount, items.* from ( 
      select * from cars 
      order by id
      ) as items 
limit 20 
offset 50

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

1 Ответ

0 голосов
/ 04 июня 2019

Лучший способ сделать это - сначала запросить вот так:

SELECT * FROM cars 
ORDER BY id
LIMIT 20;

Тогда запомните последний id.

Следующая страница получена с

SELECT * FROM cars 
WHERE id > [the id you remembered]
ORDER BY id
LIMIT 20;

и т. Д.

Таким образом, вы не получаете общее количество результатов, но вы получаете эффективность.

Вам действительно нужно точное общее число? Если приближения достаточно, попробуйте идею в конце этого сообщения в блоге .

...