0

我需要根据给定的年份从亚马逊 QLDB 中获取所有记录。

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

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

如果我通过了 2020 年,我想选择相关记录。

我怎样才能写一个选择查询呢?

4

1 回答 1

1

为了立即回答您的问题,根据 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'
}

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

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

我想提一下,虽然这些查询会达到您想要的效果,但它们并未针对 QLDB 进行优化,并且随着数据集大小的增长,查询延迟、事务超时、和并发冲突。这样做的原因是 QLDB 执行全表扫描,除非提供了对索引字段进行相等性检查的谓词,例如

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

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

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

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

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

于 2021-07-07T19:04:48.360 回答