Count(*) возвращает разные результаты при каждом выполнении
Обратите внимание: этот вопрос касается PostgreSQL и pgAdmin4, поэтому он не является дубликатом использования COUNT, который возвращает разные результаты, что касается MySQL.
У меня есть ~4 000 000 записей. Следующий запрос SQL:
SELECT COUNT(*) FROM (SELECT * FROM log LIMIT 40000)a WHERE some_column = true
возвращает другое значение каждый раз, когда я его выполняю. В чем проблема и как я могу это исправить?
1 ответ
Это ваш запрос:
SELECT COUNT(*)
FROM (SELECT * FROM log LIMIT 40000)a
WHERE some_column = true
Подзапрос возвращает произвольный набор из 40000 строк. Этот набор отличается каждый раз, когда вы выполняете запрос. Если вы хотите канонический набор, вам нужно ORDER BY
с уникальными ключами сортировки.
После этого вы выполняете фильтрацию, поэтому число, соответствующее вашему условию, является произвольным.
Если вы хотите произвольный набор из 40000 строк, где условие выполняется, просто выполните:
SELECT COUNT(*)
FROM (SELECT l.*
FROM log
WHERE some_column = true
LIMIT 40000
) ;
Если вы хотите случайный набор из 40000 строк, вы можете сделать:
SELECT COUNT(*)
FROM (SELECT l.*
FROM log
WHERE some_column = true
ORDER BY random()
LIMIT 40000
) ;
Произвольный <> случайный. (Примечание: это дорого; есть более дешевые способы получить случайный набор.).
Если вы хотите повторить образец, ну, есть разные способы сделать это. Один из них - отсортировать по уникальному идентификатору и взять первые 40000 строк:
SELECT COUNT(*)
FROM (SELECT l.*
FROM log l
WHERE some_column = true
ORDER BY primary_key
LIMIT 40000
) ;
Это не случайная выборка, а повторяемая выборка.