Oracle NoSQL Database Cloud Service 参考

了解支持的数据类型、DDL 语句、Oracle NoSQL Database Cloud Service 服务参数和度量。

本文章包含以下主题:

支持的数据类型

Oracle NoSQL Database Cloud Service 支持多种常用数据类型。

数据类型 说明

BINARY

零个或多个字节的序列。存储大小是字节数加上字节数组大小的编码,这是变量,具体取决于数组的大小。

FIXED_BINARY 固定大小的字节数组。此数据类型没有额外的编码开销。

BOOLEAN

具有以下两个可能值之一的数据类型: TRUEFALSE。布尔值的存储大小为 1 个字节。

DOUBLE

长浮点数,使用 8 字节的索引键存储进行编码。如果是主键,则使用 10 字节的存储空间。

FLOAT

长浮点数,使用 4 字节的索引键存储进行编码。如果是主键,则使用 5 字节的存储空间。

LONG

长整数具有可变长度编码,根据值使用 1-8 字节的存储。如果是主键,则使用 10 字节的存储空间。

INTEGER

长整数具有可变长度编码,根据值使用 1-4 字节的存储。如果是主键,则使用 5 字节的存储空间。

STRING

零个或多个 Unicode 字符的序列。String 类型被编码为 UTF-8 并存储在该编码中。存储大小是 UTF-8 字节数加上长度,这可能是 1-4 字节,具体取决于编码中的字节数。存储在索引键中时,存储大小为 UTF-8 字节数加单个空终止字节数。

NUMBER

任意精度带符号的小数。

它以字节数组格式进行序列化,可用于有序比较。该格式包含 2 个部分:
  1. 符号和指数加一个数字。这需要 1-6 个字节,但通常为 2,除非指数相当大
  2. 值的 mantissa,每 2 位大约一个字节

示例:

12.345678 以 6 字节为单位序列化

1.234E+102 以 5 字节为单位串行化

注意:

当需要在方案中使用数字值时,建议按以下给定的顺序决定数据类型:INTEGER、LONG、FLOAT、DOUBLE、NUMBER Avoid NUMBER,除非您确实需要使用 NUMBER,因为 NUMBER 在使用的存储和处理能力方面都很昂贵。
TIMESTAMP

精确度的时间点。精度会影响存储大小和使用情况。时间戳以 UTC(世界协调时间)存储和管理。时间戳数据类型需要 3 到 9 字节之间的任何位置,具体取决于使用的精度。

以下细分说明了此数据类型使用的存储:
  • bit[0~13] 年 - 14 位
  • bit[14~17] 个月 - 4 位
  • bit[18~22] 天 - 5 位
  • bit[23~27] 小时 - 5 位 [可选]
  • bit[28~33] 分钟 - 6 位 [可选]
  • bit[34~39] 秒 - 6 位 [可选]
  • bit[40~71] 小数秒 [可变长度]

UUID

注:UUID 数据类型被视为 STRING 数据类型的子类型。存储大小为 16 个字节作为索引键。如果用作主键,则存储大小为 19 字节。

ENUM

枚举表示为字符串数组。ENUM 值是符号标识符(令牌),存储为表示枚举中有序位置的小整数值。

ARRAY

零个有序的更多类型项集合。未定义为 JSON 的数组不能包含 NULL 值。

声明为 JSON 的数组可以包含任何有效的 JSON,包括与 JSON 相关的特殊值 null。

MAP

无序的零个或多个键 - 项对集合,其中所有键都是字符串,所有项都是相同类型。所有键都必须唯一。关键字 - 项对称为字段,关键字为字段名称,关联的项为字段值。字段值可以有不同的类型,但映射不能包含 NULL 字段值。

RECORD

一个或多个键 - 项对的固定集合,其中所有键都是字符串。记录中的所有键都必须唯一。

JSON

任何有效的 JSON 数据。

表状态和生命周期

了解不同的表状态及其重要性(表生命周期过程)。

每个表都经历了一系列从表创建到删除(删除)的不同状态。例如,处于 DROPPING 状态的表不能继续处于 ACTIVE 状态,而处于 ACTIVE 状态的表可以更改为 UPDATING 状态。您可以通过监视表生命周期来跟踪不同的表状态。本节介绍各种表状态。

下面是表 state.png 的说明
插图表的说明 -state.png

表状态 说明

CREATING

正在创建该表。它尚未就绪,无法使用。

UPDATING

正在更新表。表处于此状态时,无法进一步修改表。

在以下情况下,表处于 UPDATING 状态:

  • 正在更改表限制
  • 正在演化表方案
  • 添加或删除表索引

ACTIVE

该表可以在当前状态下使用。该表可能是最近创建或修改的,但表状态现在稳定。

DROPPING

正在删除表,无法出于任何目的访问该表。

DROPPED

该表已被删除,读取、写入或查询活动不再存在。

注意:

删除后,可以再次创建同名的表。

在 OCI 控制台中调试 SQL 语句错误

使用 OCI 控制台使用 DDL 语句或使用 DML 语句插入或更新数据或使用 SELECT 查询提取数据创建表时,您可能会在以下常见情况之一中收到语句不完整或有故障的错误:
  • SQL 语句的末尾有分号。
  • 如果 SQL 语句中存在语法错误,如逗号、语句中任何不必要字符的使用错误等。
  • 如果在 SQL 关键字或数据类型定义中的 SQL 语句中有拼写错误。
  • 如果已将列定义为 NOT NULL,但未为其指定默认值,
  • 如果已将列定义为 NOT NULL,但未为其指定默认值,
使用 OCI 控制台创建或管理数据时,如何处理一些不完整或有故障错误:
  • 删除 SQL 语句末尾的分号(如果存在)。
  • 检查 SQL 语句中是否存在不需要的字符或错误的标点符号。
  • 检查 SQL 语句中的拼写错误。
  • 检查您的所有列定义是否完整且正确。
  • 检查是否已为表定义了主键。

如果您在消除上面讨论的一些可能情况后仍然遇到错误,您可以使用 Cloud Shell 运行查询并捕获确切错误,如下例所示。

示例:从 cloud shell 获取 SELECT 语句的错误消息

summarize 命令检查语法并返回 SQL 语句的简要摘要。
  1. 在 OCI 控制台中,从右上方菜单打开云 Shell
  2. 将 SQL SELECT 语句(例如 query1.sql)复制到变量 (SQL_SELECTSTMT) 中。
    示例:
    SQL_SELECTSTMT=$(cat ~/query1.sql | tr '\n' ' ')
  3. 调用下面的 oci 命令检查 SQL SELECT 语句的语法。

    注意:

    此 SELECT 语句需要提供 compartment_id
    oci raw-request --http-method GET --target-uri 
    https://nosql.${OCI_REGION}.oci.oraclecloud.com/20190828/query/summarize?compartmentId=$NOSQL_COMPID\
    &statement="$SQL_SELECTSTMT" | jq '.data'

这将显示 SQL 语句中的确切错误。

数据定义语言参考

了解如何在 Oracle NoSQL Database Cloud Service 中使用 DDL。

使用 Oracle NoSQL Database Cloud Service DDL 创建、变更和删除表和索引。

有关 DDL 语言语法的信息,请参见 Table Data Definition Language Guide 。本指南介绍了本地部署 Oracle NoSQL Database 产品支持的 DDL 语言。Oracle NoSQL Database Cloud Service 支持此功能的子集,这些差异记录在云中的 DDL 差异部分中。

此外,每个 NoSQL <language> 驱动程序都提供一个 API 来执行 DDL 语句。要编写应用程序,请参阅在 Oracle NoSQL Database Cloud Service 中使用 API 创建表和索引

典型的 DDL 语句数

常见 DDL 语句的几个示例如下:

创建表
CREATE TABLE [IF NOT EXISTS] (
    field-definition, field-definition-2 ...,
    PRIMARY KEY (field-name, field-name-2...),
) [USING TTL ttl]
例如:
CREATE TABLE IF NOT EXISTS audience_info (
    cookie_id LONG,
    ipaddr STRING,
    audience_segment JSON,
    PRIMARY KEY(cookie_id))
更改表
ALTER TABLE table-name (ADD field-definition)
ALTER TABLE table-name (DROP field-name)
ALTER TABLE table-name USING TTL ttl 
例如:
ALTER TABLE audience_info USING TTL 7 days
创建索引
CREATE INDEX [IF NOT EXISTS] index-name ON table-name (path_list)
例如:
CREATE INDEX segmentIdx ON audience_info
       (audience_segment.sports_lover AS STRING)
删除表
DROP TABLE [IF EXISTS] table-name
例如:
DROP TABLE audience_info

请参阅参考指南以获得完整列表:

云中的 DDL 差异

云服务 DDL 语言与参考指南中描述的语言有以下不同:

表名称

  • 限制为 256 个字符,并且限制为字母数字字符和下划线
  • 必须以字母开头
  • 不能包含特殊字符
  • 不支持子表

不支持的概念

  • DESCRIBESHOW TABLE 语句。
  • 全文索引
  • 用户和角色管理
  • 内部部署区域

查询语言参考

了解如何使用 SQL 语句在 Oracle NoSQL Database Cloud Service 中更新和查询数据。

Oracle NoSQL Database 使用 SQL 查询语言更新和查询 NoSQL 表中的数据。要了解查询语言语法,请参阅 SQL Reference for Oracle NoSQL Database

典型查询

SELECT <expression>
FROM <table name>
[WHERE <expression>]
[GROUP BY <expression>]
[ORDER BY <expression> [<sort order>]]
[LIMIT <number>]
[OFFSET <number>]; 

For example:
SELECT * FROM Users;
SELECT id, firstname, lastname FROM Users WHERE firstname = "Taylor";
UPDATE <table_name> [AS <table_alias>]
    <update_clause>[, <update_clause>]*
WHERE <expr>[<returning_clause>];

For example:
UPDATE JSONPersons $j
  SET TTL 1 DAYS
  WHERE id = 6
  RETURNING remaining_days($j) AS Expires;

查询云中的语言差异

云服务查询支持与查询语言参考指南中的描述不同,具体如下:

对 SELECT 子句中使用的表达式的限制

Oracle NoSQL Database Cloud Service 支持在聚合函数之间对表达式或算术表达式进行分组。SELECT 子句中不允许使用其他类型的表达式。例如,SELECT 子句中不允许使用 CASE 表达式。

每个 NoSQL 数据库驱动程序都提供一个 API 来执行查询语句。

查询计划参考

查询执行计划是 Oracle NoSQL Database 为运行查询而执行的操作序列。

查询执行计划是规划迭代器的树。每种迭代器对可能出现在查询中的不同类型的表达式求值。通常,选择索引和关联索引谓词的种类会对查询性能产生巨大影响。因此,作为用户,您通常希望查看查询使用的索引以及向下推送的谓词。根据这些信息,您可能希望通过索引提示强制使用其他索引。此信息包含在查询执行计划中。所有 Oracle NoSQL 驱动程序都提供 API 来显示查询的执行计划。

查询中使用的一些最常见和最重要的迭代器是:

表迭代器:表迭代器负责:
  • 扫描查询使用的索引(可以是主索引)。
  • 应用推送到索引的任何过滤谓词
  • 如果需要,检索合格索引条目指向的行。如果索引覆盖,则 TABLE 迭代器的结果集是一组索引条目,否则,它是一组表行。

注意:

如果只能使用该索引的条目(即无需检索关联的行)对查询求值,则对于查询,索引称为覆盖索引。

SELECT 迭代器:它负责执行 SELECT 表达式。

每个查询都有一个 SELECT 子句。因此,每个查询计划都将有一个 SELECT 迭代器。SELECT 迭代程序具有以下结构:

"iterator kind" : "SELECT",
"FROM" :
  {
  },
"FROM variable" : "...",
"SELECT expressions" : 
[
  {
  }
]

SELECT 迭代器包含以下字段:“FROM”、“WHERE”、“FROM 变量”和“SELECT 表达式”。“FROM”和“FROM 变量”表示 SELECT 表达式的 FROM 子句,WHERE 表示筛选器子句,而“SELECT 表达式”表示 SELECT 子句。

RECEIVE 迭代器:它是一个特殊的内部迭代器,将查询计划分为两部分:
  1. RECEIVE 迭代器本身以及迭代器树中其上方的所有迭代器将在驱动程序处执行。
  2. RECEIVE 迭代器下的所有迭代器在复制节点 (RN) 上执行;这些迭代器形成一个基于 RECEIVE 迭代器唯一子项的子树。

通常,RECEIVE 迭代器充当查询协调器。它将其学术方向发送到适当的 RN 以执行并收集结果。它可以执行其他操作,例如排序和重复清除,并将结果传播到其祖先迭代器(如果有)以进行进一步处理。

分配类型:

分发类型指定如何在参与 Oracle NoSQL 数据库(存储)的 RN 中分发查询以供执行。分发类型是 RECEIVE 迭代器的属性。

不同的分布类型有:
  • SINGLE_PARTITION:SINGLE_PARTITION 查询在其 WHERE 子句中指定完整的分片键。因此,其完整结果集包含在单个分区中,RECEIVE 迭代器将其子计划发送到存储该分区的单个 RN。SINGLE_PARTITION 查询可以使用主键索引或辅助索引。
  • ALL_PARTITIONS:查询在此处使用主键索引,但不会指定完整的分片键。因此,如果存储具有 M 分区,则 RECEIVE 迭代器将发送其子计划的 M 副本,使其在每个 M 分区中的一个上执行。
  • ALL_SHARDS :查询在此处使用辅助索引,但不会指定完整的分片键。因此,如果存储具有 N 个分片,则 RECEIVE 迭代器将发送其子计划的 N 个副本,以在每个 N 个分片中执行。

查询执行计划的结构:

查询执行分批进行。将查询子计划发送到分区或分片以供执行时,它将在那里执行,直到达到批处理限制。批处理限制是查询在本地使用的读取单位数。默认值为 2000 个读取单位(约为 2MB 数据),只能通过查询级选项来减少。

当达到批处理限制时,生成的任何本地结果都将发送回 RECEIVE 迭代器以进行进一步处理,并带有布尔标志,该标志表示是否可以使用更多本地结果。如果该标志为 true,则回复包括简历信息。如果 RECEIVE 迭代器决定将查询重新发送到同一分区/分片,它将在其请求中包含此恢复信息,以便查询执行将在上一批处理期间停止的位置重新启动。这是因为在批完成后,RN 中不会维护查询状态。同一分区/分片的下一批可能发生在与上一批相同的 RN 或同时存储相同分区/分片的其他 RN。