2016-09-16 3 views
-1

У меня есть таблица records с тремя полями:Как улучшить запрос диапазона временных меток SQL?

id - the row id 
value - the row value 
source - the source of the value 
timestamp - the time when the row was inserted (should this be a unix timestamp or a datetime?) 

И я хочу, чтобы выполнить запрос следующим образом:

SELECT timestamp, value FROM records WHERE timestamp >= a AND timestamp <= b

Однако в таблице с миллионами записей, этот запрос является очень неэффективным !

Я использую Azure SQL Server в качестве СУБД. Можно ли это оптимизировать?

Если да, вы можете предоставить пошаговое руководство для этого (пожалуйста, не пропустите «маленькие» шаги)? Создавать индексы, переделывать запрос, переделывать таблицу (разбиение?) ...

Спасибо!

+0

Казалось бы, вам нужен индекс на 'record (timestamp, value)'. –

+0

Какой тип индекса будет работать лучше всего по этому запросу? – PedroD

+0

Проведите некоторое исследование индексов. Прося каждый отдельный шаг, вы показываете, что не проводили никаких исследований по настройке запросов. – dfundako

ответ

1

После создания индекса в поле, которое вы хотите найти, вы можете использовать между оператором, поэтому это единственная операция, которая наиболее эффективна для sql.

ВЫБРАТЬ XXX ОТ ABC ГДЕ DateField МЕЖДУ «1/1/2015» и '12/31/2015'

Кроме того, в SQL Server 2016 можно создавать индексы диапазона для использования таких вещей, как штампы с использованием оптимизированные по памяти таблицы. Это действительно способ сделать это.

1

Я бы рекомендовал использовать datetime или даже лучше использовать тип данных datetime2 для хранения данных даты (datetime2 лучше, так как он имеет более высокий уровень точности и с более низким уровнем точности будет использовать меньше памяти).

Что касается вашего запроса, в соответствии с опубликованным вами заявлением вы хотите, чтобы метка времени была ключевым столбцом, а затем включала значение. Это связано с тем, что вы используете метку времени как свой предикат и возвращаете значение вместе с ним.

CREATE NONCLUSTERED INDEX IX_Records_Timestamp on Records (Timestamp) INCLUDE (Value) 

Это, как говорится, будьте осторожны с названиями ваших колонок. Я бы настоятельно рекомендовал не использовать зарезервированные ключевые слова для имен столбцов, поскольку с ними можно работать гораздо труднее.