SQL-запрос для получения самой последней строки — оптимизирован для Vertica DB

У меня есть таблица с миллионами записей. В таблице хранится событие, и каждое событие имеет отметку времени. Учитывая некоторые параметры предложения WHERE, мне нужно самое последнее событие.

Вот что мы придумали:

SELECT * 
FROM eventTable 
WHERE timestamp_date >= '2012-07-16' AND 
      eventType = 1  AND someOtherField = 'value' 
ORDER BY timestamp DESC 
LIMIT 1;

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

спасибо Хосе


person Jose Martinez    schedule 21.09.2012    source источник
comment
у вас есть индекс в поле метки времени   -  person adrianj98    schedule 21.09.2012
comment
это может быть интересно   -  person adrianj98    schedule 21.09.2012
comment
Каковы ваши прогнозы для этой таблицы?   -  person QuinnG    schedule 21.09.2012
comment
у меня 1 на дате. я на самом деле хотел иметь проекцию на someOtherField, потому что в someOtherField меньше записей, чем на дату, которая насчитывает миллионы.   -  person Jose Martinez    schedule 25.09.2012


Ответы (1)


По сути, вы хотите, чтобы по крайней мере одна из ваших проекций была оптимизирована в соответствии со столбцом отметки времени в предложении order by. Если вы делаете свои проекции правильно, это должно быть довольно быстро.

Изменить: просто пояснение. Я не имел в виду, что столбец метки времени должен быть единственным полем в предложении order by. Кроме того, как уже упоминалось в комментариях ниже, в этом случае запуск в конструкторе баз данных для конкретного запроса не был бы плохим. Я считаю, что есть возможность оптимизировать скорость. Поскольку вы делаете «выбрать *», вывод, вероятно, должен служить проекциями супер и приятеля.

person geoffrobinson    schedule 21.09.2012
comment
что, если у вас есть миллионы записей на timestamp_date, но меньше записей для someOtheField. Будет ли тогда иметь больше смысла оптимизировать проекции для someOtherField? - person Jose Martinez; 25.09.2012
comment
Во-первых, вы можете использовать конструктор баз данных и указать конструктору выполнить оптимизацию конкретного запроса. Конечно, для получения хороших результатов потребуется наличие образцов данных для вашей таблицы. - person geoffrobinson; 25.09.2012
comment
Вместо этого вы можете сделать что-то вроде порядка по какому-то другому полю, отметке времени или что-то в этом роде. Важная часть заключается в том, что если вы правильно включите столбец в предложение order by проекции, этот запрос должен быть быстрым. Я бы порекомендовал использовать конструктор баз данных в вашем случае, но вы всегда можете поиграться и протестировать. - person geoffrobinson; 25.09.2012