Странная проблема заказа postgres SELECT - PullRequest
1 голос
/ 15 декабря 2011

У меня есть запрос postgres sql:

select * from stats where athlete_id = 5

Это вернет, как вы можете себе представить, всю статистику для каждого спортсмена с идентификатором 5

Пока все нормально.

Однако я только что заметил, что для athlete_id выше 110 он возвращает строки статистики в обратном порядке.

Так что для athlete_id = 110 столбец 'id' выглядит примерно так, к чему я привык:

2325
2401
2482
2537
2592
2647
...

и т.д.. Каждая строка таблицы статистики упорядочена по идентификатору.

Тогда, если вы выберете 111, получится так:

5652
5610
5569
5528
5487
5437
5387
5336
...

Как это вообще возможно? Все это делает запросы внутри интерфейса pgadmin. Здесь нет дополнительных предложений where, только тот, который я изложил, т. Е. WHERE athlete_id = 111

Что? Я делаю все виды изменений кода, но что на самом деле может вызвать это в pgaadmin / pgsql?

Что произошло между 110 и 111? Много-много рефакторинга и изменений кода внутри рельсов, но без реальных прямых манипуляций с SQL. Да, я понимаю, что ответ может быть там, но я не знаю, как посмотреть, так как это не в приложении rails - это чистый SQL через pgadmin, поэтому что-то должно быть сделано в postgres - мне нужно понять, что это может быть или я не могу отладить.

Есть идеи? В рельсах такие вещи как:

Athlete.stats.last.score возвращает «первый» ряд вместо «последнего», полностью испортив приложение, но только для спортсменов с идентификатором выше 110!

Совершенно смущен!

Ответы [ 2 ]

6 голосов
/ 15 декабря 2011

Если вы не укажете предложение ORDER BY, существует нет гарантии относительно того, в каком порядке будут возвращаться строки. Это может быть возрастающий порядок, убывающий порядок, порядок, который не имеет видимого логика, и, возможно, даже другой порядок каждый раз, когда вы запрашиваете (хотя на практике это вряд ли произойдет).

Конкретный порядок возврата зависит от деталей реализации шагов в плане запроса. При изменении параметров это может привести к тому, что PostgreSQL предпочтет один план запроса другому. Например, он может решить использовать сканирование таблицы для одного запроса, но индекс для другого. Трудно точно определить причину в вашем конкретном случае, но анализ результатов EXPLAIN может дать некоторые подсказки.

Чтобы исправить запрос на возврат строк в ожидаемом порядке, добавьте предложение ORDER BY:

SELECT *
FROM stats
WHERE athlete_id = 5
ORDER BY id
2 голосов
/ 15 декабря 2011

Если вы не укажете предложение ORDER BY в своем запросе, вы не можете предполагать / ожидать, что SQL вернет вам данные в любом определенном порядке.

...