У меня есть две таблицы, conttagtable
(t) и contfloattable
(cf). T имеет около 43 тыс. Строк. CF имеет более 9 миллиардов.Эффективное обращение к таблице огромных временных рядов по одной строке каждые 15 минут
Я установил индекс для обеих таблиц в столбце tagindex
на обеих таблицах. Этот столбец можно рассматривать как уникальный идентификатор для conttagtable
и в качестве внешнего ключа в conttagtable
для confloattable
. Я не создал явно PK или внешний ключ в любой таблице, относящейся к другой, хотя эти данные логически связаны столбцом tagindex
на обеих таблицах, как если бы conttagtable.tagindex
были PRIMARY KEY
и contfloattable.tagindex
, где FOREIGN KEY (tagindex) REFERENCES conttagtable(tagindex)
. Данные поступали с дампа доступа к Microsoft и я не знал, могу ли я доверять tagindex быть уникальным, поэтому «уникальность» не применяется.
Данные сами по себе чрезвычайно велики.
Мне нужно получить одиночную произвольно выбранную строку от contfloattable
за каждые 15 минут contfloattable.dateandtime
интервал для каждого conttagtable.tagid
. Итак, если contfloattable
для данного tagid
имеет 4000 образцов, охватывающих 30 минут, мне нужен образец из диапазона 0-14 минут и образец из диапазона 15-30 минут. Любой образец в пределах 15 минут допустим; 1-й, последний, случайный, любой.
Вкратце, мне нужно получить образец каждые 15 минут, но только один образец на t.tagname. Образцы прямо сейчас записываются каждые 5 секунд, а данные охватывают два года. Это большая проблема с данными и мой взгляд с точки зрения sql. Все решения временного интервала, которые я пробовал из поиска или поиска в SO, дали время запроса, которое так долго, что они непрактичны.
- Являются ли мои индексы достаточными для быстрого соединения? (они, как представляется, оставляют часть времени)
- Могу ли я получить дополнительные индексы?
- Какой лучший/самый быстрый запрос, который выполняет вышеуказанные цели?
Вот SQLFiddle, содержащий схему и некоторые примеры данных: http://sqlfiddle.com/#!1/c7d2f/2
Схема:
Table "public.conttagtable" (t)
Column | Type | Modifiers
-------------+---------+-----------
tagname | text |
tagindex | integer |
tagtype | integer |
tagdatatype | integer |
Indexes:
"tagindex" btree (tagindex)
Table "public.contfloattable" (CF)
Column | Type | Modifiers
-------------+-----------------------------+-----------
dateandtime | timestamp without time zone |
millitm | integer |
tagindex | integer |
Val | double precision |
status | text |
marker | text |
Indexes:
"tagindex_contfloat" btree (tagindex)
Выход я хотел бы видеть что-то вроде этого:
cf.dateandtime |cf."Val"|cf.status|t.tagname
--------------------------------------------------
2012-11-16 00:00:02 45 S SuperAlpha
2012-11-16 00:00:02 45 S SuperBeta
2012-11-16 00:00:02 45 S SuperGamma
2012-11-16 00:00:02 45 S SuperDelta
2012-11-16 00:15:02 45 S SuperAlpha
2012-11-16 00:15:02 45 S SuperBeta
2012-11-16 00:15:02 45 S SuperGamma
2012-11-16 00:15:02 45 S SuperDelta
2012-11-16 00:30:02 45 S SuperAlpha
2012-11-16 00:30:02 45 S SuperBeta
2012-11-16 00:30:02 45 S SuperGamma
2012-11-16 00:30:02 45 S SuperDelta
2012-11-16 00:45:02 42 S SuperAlpha
... и т. Д. И т.д. ...
Как было предложено Клодоальдо, это моя последняя попытка, любые предложения по ее ускорению?
with i as (
select cf.tagindex, min(dateandtime) dateandtime
from contfloattable cf
group by
floor(extract(epoch from dateandtime)/60/15),
cf.tagindex
)
select cf.dateandtime, cf."Val", cf.status, t.tagname
from
contfloattable cf
inner join
conttagtable t on cf.tagindex = t.tagindex
inner join
i on i.tagindex = cf.tagindex and i.dateandtime = cf.dateandtime
order by floor(extract(epoch from cf.dateandtime)/60/15), cf.tagindex
план запроса из вышеизложенного: http://explain.depesz.com/s/loR
отдельная строка для каждого {t.tagname, 15 минутного интервала}. Тег - это всего лишь столбец, описывающий устройство. Устройство в этом случае является датчиком, который записывал значение в определенный момент времени. Меня спрашивают предоставить дискретное значение для каждого устройства (тэг) каждые 15 минут. –
Я не совсем понимаю ваши запросы. В среднем каждая запись 'conttagtable' составляет около 200 000' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. Как вы получаете это до одной строки-результата для каждого 'conttagtable.tagname'? – ruakh
@ruakh, да, есть много записей. Извините за запутанное объяснение. Допустим, у меня есть 10 тэгов, и каждый тэг записывает значение каждые 5 секунд. Я хочу только 1 из этих записанных значений, вырванных с интервалом 15 минут. Таким образом, для значения времени 01:00:00 я увижу 10 строк. Если бы я хотел два значения времени, 01:00:00 и 01:15:00, я бы увидел 20 строк. Одна строка для каждого тэга за каждые 15-минутный интервал. Это более ясно? –