使用过滤器完全扫描似乎是不可避免的,除非您知道设备 ID 的大致范围,这些设备 ID 可以落在给定的持续时间内,这可能并不总是可能的。
实现此目的的另一种方法是使用中间查找/索引表,将行键的第二部分映射到第一部分或实际数据表中的复合行键。
这将使您的主要访问模式按原样按设备 ID 查找记录,当您想按第二个键查找时,使用查找表在数据表中查找行键并使用这些键来获取所需的数据。
然而,这种方法会让您的应用程序负责保持查找表同步以更新/删除您的数据表。
对于索引的自动管理,您可以尝试 Phoenix,您可以在 logTime 上创建一个具有全局索引的 Phoenix 表,这里有一些快速示例 -
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 以了解它们在您的用例中的适用程度。
希望这会有所帮助。