С фильтрами полное сканирование кажется неизбежным, если вы не знаете приблизительный диапазон идентификаторов оборудования, которые могут находиться в пределах заданной продолжительности, что не всегда возможно.
Альтернативным способом достижения этого может быть использование промежуточной таблицы поиска / индекса, которая отображает вашу вторую часть ключа строки на первую часть или на составной ключ строки в фактической таблице данных.
Это сохранит ваш основной шаблон доступа для поиска записей по идентификатору оборудования как есть, и когда вы хотите искать по второму ключу, используйте таблицу поиска, чтобы найти ключи строк в вашей таблице данных, и используйте эти ключи для извлечения необходимых данных.
Однако этот подход возлагает на ваше приложение ответственность за синхронизацию справочной таблицы для обновления / удаления в вашей таблице данных.
Для автоматического управления индексами вы можете попробовать Phoenix, вы можете создать таблицу Phoenix с глобальным индексом на logTime, вот небольшой пример -
CREATE TABLE "SO50228751"(
"equipNum" integer not null,
"logtime" bigint not null,
"f"."data" varchar
CONSTRAINT pk PRIMARY KEY ("equipNum", "logtime"));
Добавить данные
upsert into "SO50228751"("equipNum", "logtime","f"."data") values(454312,20180304124511,'a');
upsert into "SO50228751"("equipNum", "logtime","f"."data") values(454312,20180304124512,'b');
upsert into "SO50228751"("equipNum", "logtime","f"."data") values(454312,20180304124513,'c');
upsert into "SO50228751"("equipNum", "logtime","f"."data") values(454312,20180304124514,'d');
upsert into "SO50228751"("equipNum", "logtime","f"."data") values(454312,20180304124515,'e');
upsert into "SO50228751"("equipNum", "logtime","f"."data") values(454313,20180304124521,'f');
upsert into "SO50228751"("equipNum", "logtime","f"."data") values(454313,20180304124522,'g');
upsert into "SO50228751"("equipNum", "logtime","f"."data") values(454313,20180304124523,'h');
upsert into "SO50228751"("equipNum", "logtime","f"."data") values(454313,20180304124524,'i');
upsert into "SO50228751"("equipNum", "logtime","f"."data") values(454312,20180304124524,'ii');
Создать индекс
CREATE INDEX so_idx ON "SO50228751"(logtime);
Запрос по logTime с использованием индекса
select /*+ /*+ INDEX("SO50228751" so_idx) */ * from "SO50228751" where "logtime" between 20180304124511 and 20180304124516;
Прежде чем принять решение о выборе индексов Phoenix, пожалуйста, проверьте документацию и эту ссылку -> https://community.hortonworks.com/articles/61705/art-of-phoenix-secondary-indexes.html, чтобы понять, насколько хорошо они подходят для вашего варианта использования.
Надеюсь, это поможет.