У нас есть таблица БД PosgtreSQL с большим количеством данных. Интересно, какой тип запроса быстрее/имеет лучшую производительность и почему?
select * from table
select count (*) from table
Два разных вопроса, которые дают разные результаты. Почему вас вообще волнует разница во времени, необходимая для получения таких разных результатов?
Их можно использовать для той же цели, потому что клиенты, как правило, предоставляют переменную ROW_COUNT. В первом случае приложение может считать количество строк, связанное с результатом, во втором — сам результат. Если вам нужны как количество, так и фактические данные, первый запрос может получить их оба сразу. Если вам нужно только количество строк, содержимое таблицы будет просто тратить IO, весить и замедлять работу, поэтому count(*)
достаточно.
Я знаю, что они делают, мне просто нужно сначала посчитать, а потом, в некоторых редких случаях, использовать данные результата. Вот почему мне интересно, лучше ли сначала делать count
, а затем select
, чем делать select
в начале. Если у select
производительность хуже, я буду использовать count
Хотя оба запроса выполняют итерацию по всей таблице, первый запрос обычно будет работать намного хуже на уровне приложения по сравнению со вторым. Это связано с тем, что запрос select *
должен будет отправить всю таблицу по сети в приложение, которое выполняет запрос. С другой стороны, запрос count(*)
должен отправлять только одно целое число.
В дополнение к сетевому времени запрос № 2 может пропускать кучу и подсчитывать записи в индексе, что происходит намного быстрее.
Разные результаты. Выберите тот, который вам нужен.