Это становится длиннее, чтобы получить последнее значение моей таблицы - PullRequest
2 голосов
/ 21 октября 2011

В моей базе данных Postgres есть таблица, в которой значения хранятся каждые 10 минут. У меня сейчас много записей в этой таблице (я не хочу удалять старые). По сути, строка содержит значение и метку времени. Мой SQL-запрос не оптимизирован, поскольку кажется, что он перебирает всю таблицу ...

SELECT value, date FROM measures order by date desc limit 1

Я также пытался добавить фильтр по дате, например:

SELECT value, date FROM measures WHERE date > date '2011-10-20' order by date desc limit 1

(конечно, с динамической датой). Но то же самое ...

Нужен ли индекс или можно оптимизировать запрос?

Ответы [ 2 ]

2 голосов
/ 21 октября 2011

Прежде всего, вы не должны называть свой столбец отметки времени date. «дата» не является «отметкой времени» . Кроме того, хотя это разрешено в PostgreSQL, это зарезервированное слово в любом стандарте SQL. (Однако для ответа на этот вопрос я буду придерживаться date)

Кроме того, не нужно для индекса для выражения и предложения WHERE, как предлагает Томми. (date(created_at)). A обычный индекс B-дерева и запрос без предложения WHERE делают работу проще и быстрее.

CREATE INDEX measures_date_idx ON measures(date);

Тогда ваш запрос будет работать так, как он есть, быстро молниеносно. Индексы B-дерева можно использовать для сортировки по возрастанию и убыванию одинаково эффективно. Прочитайте главу Индексы и ЗАКАЗАТЬ в руководстве - охватывает большую часть того, что вам нужно знать для вашего случая.


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

CREATE INDEX measures_date_idx ON measures(date)
WHERE date > '2011-10-20 00:00:00'::timestamp;

Тогда ваш запрос должен включать точно такое же предложение WHERE, которое используется для частичного индекса. Как это:

SELECT value, date
FROM   measures
WHERE  date > '2011-10-20 00:00:00'::timestamp
ORDER  BY date DESC
LIMIT  1;
1 голос
/ 21 октября 2011

Сначала - +1 для динамического. Вы правы, ваш запрос становится медленнее, так как без индексов вы выполняете полное сканирование таблицы каждый раз, когда запрашиваете значение. Я не сильный пользователь базы данных postgres, но похоже, что вы можете поместить индекс в поле даты (поскольку это то, к чему вы чаще всего обращаетесь).

Из этой статьи:

Другим распространенным примером является поиск строк для данной даты, где мы сохранили метки времени в поле даты и времени, но хотим найти их по дата приведенная стоимость. Индекс как

CREATE INDEX articles_day ON articles ( date(created_at) )  

может использоваться запросом, содержащим

WHERE date(articles.created_at) = date('2011-03-07').

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...