如何在 Amazon QLDB 中获取基于年份的所有记录

How to fetch all records based on year in Amazon QLDB

我需要根据给定年份从 amazon QLDB 中获取所有记录。

这是我在收入中的数据 Table。

{
  ownerId: "u102john2021",
  transactionId: "tran010101010101",
  timeStamp: 2021-06-11T19:31:31.000Z
}
{
   ownerId: "u102john2021",
      transactionId: "tran010101010101",
      timeStamp: 2020-06-11T19:31:31.000Z
    }

如果我过了2020年我要select相关记录

如何编写 select 查询?

要立即回答您的问题,根据 timeStamp 字段的 ION 数据类型,有几种方法可以实现您想要做的事情。

1/ 如果数据类型是时间戳类型即

{
    'ownerId' : 'A',
    'transactionId' : 't1',
    'timeStamp' : `2021-06-11T19:31:31.000Z`
},
{
    'ownerId' : 'B',
    'transactionId' : 't2',
    'timeStamp' : `2020-06-11T19:31:31.000Z`
}

您可以使用 WHERE 子句来设置 SELECT 语句的边界,即

SELECT * FROM revenues WHERE "timeStamp" < `2021T` AND "timeStamp" >= `2020T`

请注意,我将 timeStamp 字段放在双引号中,因为它是保留关键字:https://docs.aws.amazon.com/qldb/latest/developerguide/ql-reference.reserved.html.

2/ 如果数据类型是字符串类型即

{
    'ownerId' : 'C',
    'transactionId' : 't3',
    'timeStamp' : '2021-06-11T19:31:31.000Z'
},
{
    'ownerId' : 'D',
    'transactionId' : 't4',
    'timeStamp' : '2020-06-11T19:31:31.000Z'
}

您可以使用带有 LIKE 运算符的 WHERE 子句来匹配模式,即

SELECT * FROM revenues WHERE "timeStamp" LIKE "2020%"

我想提一下,尽管这些查询会实现您想要的结果,但它们并未针对 QLDB 进行优化,并且随着数据集大小的增长,查询形式会出现严重的性能问题延迟、事务超时和并发冲突。这样做的原因是 QLDB 执行完整的 table 扫描,除非提供了对索引字段进行相等性检查的谓词,例如

SELECT * FROM revenues WHERE "timeStamp" = `2021-06-11T19:31:31.000Z`

扫描查询面临高延迟,随着必须检查的数据量的增加而增加。提供的查询将导致扫描,以确定 return 符合范围的正确文档。

随着延迟的增加,另一个必须考虑的方面是QLDB事务超时30秒。 QLDB 中的所有查询都是具有可序列化隔离的事务,包括 SELECT 语句。由于扫描延迟随着数据集的增加而增加,不可避免地会触发事务超时,从而导致查询出错。

理想情况下,您应该 运行 带有 WHERE 谓词子句的语句,该谓词子句在索引字段或文档 ID 上进行过滤。有关 QLDB 优化查询的更多信息,请参阅:https://docs.aws.amazon.com/qldb/latest/developerguide/working.optimize.html.

对于运行以上提供的此类扫描,我们建议将数据流式传输到您选择的针对分析用例优化的专用数据库服务。