Oracle NoSQL Database Cloud Service 參考資料

瞭解支援的資料類型、DDL 敘述句、Oracle NoSQL Database Cloud Service 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 字元。字串類型編碼為 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 在使用的儲存和處理能力方面都相當昂貴。
TIMESTAMP

具有精確度的時間點。精確度會影響儲存大小和使用量。時戳是以 UTC (國際標準時間) 儲存並管理。根據使用的精確度,時間戳記資料類型需要 3 到 9 個位元組的任意位置。

下列明細說明此資料類型所使用的儲存:
  • bit[0~13] 年 ~14 位
  • 位元 [14~17] 月 - 4 位元
  • 位元 [18~22] 天 - 5 位元
  • bit[23~27] 小時 ~5 位元【任意】
  • bit[28~33] 分 -6 位 [ 可選 ]
  • 位元 [34~39] 秒 - 6 位元 [ 任意 ]
  • bit[40~71] 分秒 [ 可變長度選擇 ]

UUID

注意:UUID 資料類型被視為 STRING 資料類型的子類型。儲存大小為 16 個位元組作為索引索引鍵。如果用作主索引鍵,則儲存大小為 19 個位元組。

ENUM

列舉會以字串的陣列來表示。ENUM 值為符號 ID (記號),並儲存為代表列舉中排序位置的小整數值。

ARRAY

一個排序的集合,其中包含多個類型的項目。未定義為 JSON 的陣列不可包含 NULL 值。

宣告為 JSON 的陣列可以包含任何與 JSON 相關的有效 JSON,包括特殊值空值。

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,但未指派 DEFAULT 值給它。
  • 如果您已將資料欄定義為 NOT NULL,但未指派 DEFAULT 值給它。
如何使用 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 語言語法的資訊,請參閱表格資料定義語言指南。本指南說明內部部署 Oracle NoSQL Database 產品支援的 DDL 語言。Oracle NoSQL Database Cloud Service 支援此功能的子集,其差異記錄在 DDL 雲端差異段落中。

此外,每個 NoSQL <language> 驅動程式也提供一個 API 來執行 DDL 敘述句。若要撰寫應用程式,請參閱使用 API 在 Oracle NoSQL Database Cloud Service 中建立表格和索引

一般 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 重複程式:表格重複程式負責:
  • 掃描查詢所使用的索引 (可能是主要索引)。
  • 套用任何推送至索引的篩選述詞
  • 視需要擷取限定索引項目所指向的資料列。如果索引已涵蓋,則 TABLE 重複程式的結果集是一組索引項目,否則便是一組表格資料列。

附註:

如果查詢只能使用該索引的項目 (亦即不需要擷取相關的資料列) 來評估,就稱為查詢的涵蓋索引。

SELECT 重複程式:負責執行 SELECT 表示式。

每個查詢都有一個 SELECT 子句。因此,每個查詢計畫都會有 SELECT 重複程式。SELECT 重複程式具有下列結構:

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

SELECT 重複程式具有以下欄位:"FROM"、"WHERE"、"FROM variable" 和 「SELECT 表示式」。"FROM" 和 "FROM variable" 代表 SELECT 表示式的 FROM 子句,WHERE 代表篩選條件子句,而 「SELECT 表示式」代表 SELECT 子句。

RECEIVE iterator:這是特殊的內部重複程式,可將查詢計畫分成 2 個部分:
  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。