Приветствую
Firebird 3.0
Пытаюсь разобраться, как получить срез последних по времени данных
есть таблица:
набросал запрос который, вроде работает
План: PLAN SORT (SORT (MD M INDEX (MESSAGES_TIME)))
Можно ли обойтись без with, и какие нужны индексы чтобы не вычитывать все записи за сутки?
Firebird 3.0
Пытаюсь разобраться, как получить срез последних по времени данных
есть таблица:
CREATE TABLE MESSAGES ( UUID SYS$UUID NOT NULL /* SYS$UUID = CHAR(16) */, ON_UUID SYS$UUID /* SYS$UUID = CHAR(16) */, TICK SYS$TIMETICK NOT NULL /* SYS$TIMETICK = BIGINT */, MSG_TIME SYS$TIMESTAMP /* SYS$TIMESTAMP = TIMESTAMP */, MSG_LOCAL_TIME COMPUTED BY (dateadd(hour, RDB$GET_CONTEXT('USER_SESSION', 'TIMEZONE'), MSG_TIME)), SITE SYS$NAME NOT NULL /* SYS$NAME = VARCHAR(128) */, DEVICE SYS$NAME NOT NULL /* SYS$NAME = VARCHAR(128) */, MSG_TYPE SYS$NAME NOT NULL /* SYS$NAME = VARCHAR(128) */, MSG_KIND SYS$NAME /* SYS$NAME = VARCHAR(128) */, JSON SYS$JSON /* SYS$JSON = BLOB SUB_TYPE 1 SEGMENT SIZE 80 */ ); ALTER TABLE MESSAGES ADD CONSTRAINT MESSAGES PRIMARY KEY (UUID); CREATE INDEX MESSAGES_TICK ON MESSAGES (TICK, DEVICE, MSG_TYPE, MSG_KIND); CREATE INDEX MESSAGES_TIME ON MESSAGES (MSG_TIME, DEVICE, MSG_TYPE, MSG_KIND); CREATE DESCENDING INDEX MESSAGES_TIME_DESC ON MESSAGES (MSG_TIME, DEVICE, MSG_TYPE, MSG_KIND);
набросал запрос который, вроде работает
with MDATA as ( select UUID, DEVICE, MSG_TIME, MSG_TYPE, MSG_KIND, first_value(UUID) over (partition by DEVICE order by MSG_TIME desc) as OVER_UUID from MESSAGES where MSG_TIME between current_timestamp - 1 and current_timestamp order by DEVICE ) select DEVICE, MSG_TIME, MSG_TYPE, MSG_KIND from MDATA where UUID = OVER_UUID
План: PLAN SORT (SORT (MD M INDEX (MESSAGES_TIME)))
Можно ли обойтись без with, и какие нужны индексы чтобы не вычитывать все записи за сутки?