Oracle NoSQL Database Cloud Serviceリファレンス
サポートされているデータ型、DDL文、Oracle NoSQL Database Cloud Service Serviceのパラメータおよびメトリックについて学習します。
この記事には次のトピックが含まれます:
サポートされているデータ型
Oracle NoSQL Database Cloud Serviceは、多くの共通データ型をサポートしています。
| データ・タイプ | 説明 |
|---|---|
BINARY |
0バイト以上のバイト・シーケンス。ストレージ・サイズは、バイト数にバイト配列のサイズのエンコーディングを加えたものです。これは、配列のサイズに応じて変数です。 |
FIXED_BINARY |
固定サイズのバイト配列。このデータ型に対する追加のエンコーディング・オーバーヘッドはありません。 |
BOOLEAN |
TRUEまたはFALSEの2つの値のいずれかを持つデータ型。ブールのストレージ・サイズは1バイトです。 |
DOUBLE |
索引キー用に8バイトの記憶域を使用してエンコードされた長い浮動小数点数。主キーの場合は、10バイトの記憶域が使用されます。 |
FLOAT |
4バイトのストレージを使用してインデックスキー用にエンコードされた長い浮動小数点数。主キーの場合は、5バイトの記憶域が使用されます。 |
LONG |
long整数には、値に応じて1から8バイトのストレージを使用する可変長エンコーディングがあります。主キーの場合は、10バイトの記憶域が使用されます。 |
INTEGER |
long整数には、値に応じて1から4バイトのストレージを使用する可変長エンコーディングがあります。主キーの場合は、5バイトの記憶域が使用されます。 |
STRING |
ゼロ個以上の一連のUnicode文字。文字列型はUTF-8としてエンコードされ、そのエンコーディングに格納されます。ストレージ・サイズは、UTF-8バイト数に長さを加えたもので、エンコーディングのバイト数に応じて1から4バイトになります。索引キーに格納される場合、ストレージ・サイズは、UTF-8バイト数と単一のNULL終了バイト数です。 |
NUMBER |
任意の精度符号付き10進数。 順序付き比較に使用できるバイト配列形式でシリアライズされます。この形式には2つの部分があります。 1. 符号と指数に1桁を加えたもの。これは1-6バイトかかりますが、指数が非常に大きい場合を除き、通常は2です 2。2桁ごとに約1バイトの値の仮数 例: 12.345678は6バイトでシリアライズされます 1.234E+102は5バイトでシリアライズされます ノート:スキーマで数値を使用する必要がある場合、次の順序でデータ型を決定することをお薦めします: INTEGER、LONG、FLOAT、DOUBLE、NUMBER NUMBERは、使用したストレージと処理能力の両方でコストがかかるため、ユース・ケースに本当に必要でないかぎり、NUMBERは使用しないでください。 |
TIMESTAMP |
精度付きの時点。精度はストレージのサイズおよび使用に影響します。タイムスタンプは、UTC (協定世界時)で格納されて管理されます。Timestampデータ型には、使用される精度に応じて3バイトから9バイトの任意の場所が必要です。 次の内訳は、このデータ型で使用される記憶域を示しています。 - bit[0~13] year - 14 bits - bit[14~17] month - 4 bits - bit[18~22] day - 5 bits - bit[23~27] hour - 5 bits [optional] - bit[28~33] minute - 6 bits [optional] - bit[34~39] second - 6 bits [optional] - bit[40~71] fragmental second [optional with variable length] |
UUID |
ノート: UUIDデータ型は、STRINGデータ型のサブタイプとみなされます。記憶域のサイズは索引キーとして16バイトです。主キーとして使用する場合、ストレージ・サイズは19バイトです。 |
ENUM |
列挙は、文字列の配列として表されます。ENUM値は記号識別子(トークン)であり、列挙内に並んだ位置を表す整数値として格納されます。 |
ARRAY |
0個以上の型指定されたアイテムの順序付きコレクション。JSON型として宣言されていない配列には、NULL値を含めることはできません。JSONとして宣言されている配列は、任意の有効なJSONを含めることができます。この中には、JSONに関連する特殊な値であるNULLも含まれます。 |
MAP |
0個以上のキーとアイテムのペアの順序なしコレクションで、すべてのキーが文字列であり、すべてのアイテムが同じ型です。すべてのキーは一意である必要があります。キーとアイテムのペアはフィールドと呼ばれ、キーがフィールド名、それに関連付けられたアイテムがフィールド値です。各フィールド値は異なる型を持つことができますが、マップにNULLのフィールド値を含めることはできません。 |
RECORD |
すべてのキーが文字列である、1つ以上のキーとアイテムのペアの固定コレクション。レコード内のすべてのキーは一意である必要があります。 |
JSON |
任意の有効なJSONデータ。 |
表の状態およびライフ・サイクル
様々な表の状態とその重要度(表のライフ・サイクル・プロセス)について学習します。
それぞれの表は、表の作成から削除まで、一連の様々な状態を経過します。たとえば、DROPPING状態の表はACTIVE状態に移行できませんが、ACTIVE状態の表はUPDATING状態に変わることができます。表のライフ・サイクルをモニタリングすることにより、表の様々な状態をトラッキングできます。この項では、表の様々な状態について説明します。

| 表の状態 | 説明 |
|---|---|
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文にスペル・エラーがないか確認します。
- すべての列定義が完全で正しいかどうかを確認します。
- 表に主キーが定義されているかどうかを確認します。
前述のように考えられる状況の一部を削除した後も引き続きエラーが発生する場合は、クラウド・シェルを使用して問合せを実行し、次の例に示すように正確なエラーを取得できます。
例: クラウド・シェルからのSELECT文のエラー・メッセージの取得
summarizeコマンドは構文をチェックし、SQLステートメントの簡単なサマリーを返します。
-
OCIコンソールで、右上のメニューからクラウド・シェルを開きます。
-
SQL SELECT文(たとえば、
query1.sql)を変数(SQL_SELECTSTMT)にコピーします。次に例を示します:
SQL_SELECTSTMT=$(cat ~/query1.sql | tr '\n' ' ') -
次の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言語ドライバには、DDL文を実行するためのAPIが用意されています。アプリケーションを記述するには、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言語とリファレンス・ガイドに記載されているDDL言語の違いは、次のとおりです:
表名
- 256文字以内に制限され、英数字およびアンダースコアのみ使用できます
- 文字で始まる必要があります
- 特殊文字は使用できません
- 子表はサポートされていません
サポートされていない概念
DESCRIBEおよびSHOW TABLE文。- 全文索引
- ユーザーおよびロールの管理
- オンプレミス・リージョン
問合せ言語リファレンス
SQL文を使用してOracle NoSQL Database Cloud Serviceでデータを更新および問合せする方法について学習します。
Oracle NoSQL Databaseでは、SQL問合せ言語を使用して、NoSQL表のデータの更新と問合せを行います。問合せ言語の構文を学習するには、Oracle NoSQL DatabaseのSQLリファレンスを参照してください。
標準的な問合せ
SELECT <expression>
FROM <table name>
[WHERE <expression>]
[GROUP BY <expression>]
[ORDER BY <expression> [<sort order>]]
[LIMIT <number>]
[OFFSET <number>];
たとえば:
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>];
たとえば:
UPDATE JSONPersons $j
SET TTL 1 DAYS
WHERE id = 6
RETURNING remaining_days($j) AS Expires;
クラウドにおける問合せ言語の違い
クラウド・サービスの問合せサポートと、問合せ言語リファレンス・ガイドに記載されている内容では、次の点で異なります。
SELECT句で使用される式に関する制限
Oracle NoSQL Database Cloud Serviceでは、集計ファンクション間でのグループ化式または算術式がサポートされています。他の種類の式は、SELECT句では許可されていません。たとえば、CASE式は、SELECT句では使用できません。
各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変数"および"SELECT式"などのフィールドがあります。"FROM"および"FROM変数"はSELECT式のFROM句を表し、WHEREはフィルタ句を表し、"SELECT式"はSELECT句を表します。
RECEIVEイテレータ:問合せ計画が2つの部分に分けられる特別な内部イテレータ:
-
RECEIVEイテレータ自体と、イテレータ・ツリー内でその上にあるすべてのイテレータは、ドライバで実行されます。
-
RECEIVEイテレータの下にある全てのイテレータは、レプリケーション・ノード(RN)で実行されます。これらのイテレータは、RECEIVEイテレーターの固有の子がルートになるサブツリーを形成します。
一般に、RECEIVEイテレータは問合せコーディネータとして機能します。これにより、そのサブプランを適切なRNに送信して実行し、その結果を収集します。ソートや重複削除などの追加操作を実行し、さらに処理するためにその結果を祖先イテレータ(存在する場合)に伝播することもできます。
分散の種類:
分散の種類は、Oracle NoSQLデータベース(ストア)に参加しているRN間で問合せを分散させて実行する方法を指定します。distribution kindは、RECEIVEイテレータのプロパティです。
分散の種類には次の選択肢があります。
- SINGLE_PARTITION: SINGLE_PARTITION問合せでは、WHERE句に完全なシャード・キーを指定します。その結果、結果セット全体が単一のパーティションに含まれ、RECEIVEイテレータは、そのパーティションを格納する単一のRNへそのサブプランを送信します。SINGLE_PARTITION問合せは、主キー索引または2次索引のどちらかを使用できます。
- ALL_PARTITIONS:問合せでは、ここで主キー索引が使用され、完全なシャード・キーは指定されません。その結果、ストアにMのパーティションがある場合、RECEIVEイテレータはそのサブプランのMコピーをM個人送信して、それぞれがMのパーティションのいずれかに対して実行されます。
- ALL_SHARDS:問合せでは、ここで2次索引が使用され、完全なシャード・キーは指定されません。その結果、ストアにN個のシャードがある場合、RECEIVEイテレータは、そのサブプランのN個のコピーを送信して、それぞれがN個のシャードのいずれかに対して実行されます。
問合せ実行計画の構造:
問合せ実行は、複数のバッチに分けて行われます。問合せサブプランは、実行のためにパーティションまたはシャードに送信されると、バッチ制限に到達するまでそこで実行されます。バッチ制限は、問合せによってローカルで使用される読取りユニットの数です。デフォルトは読取りユニット2000個(約2MBのデータ)であり、それは、問合せレベルのオプションによってのみ減らすことができます。
バッチ制限に到達すると、生成されたローカル結果は、さらにローカル結果が存在するかどうかを示すブール・フラグとともに、さらに処理するためにRECEIVEイテレータに対して送り返されます。このフラグがtrueの場合、この応答には再開情報が含まれています。RECEIVEイテレータによって、問合せを同じパーティションまたはシャードに再送信することが決定された場合は、そのリクエストにこの再開情報が含まれます。それにより、問合せ実行は、前回のバッチでの停止箇所から再開されます。これは、バッチの完了後にそのRNで問合せ状態が保持されていないためです。同じパーティションまたはシャードに対する次回のバッチは、前回のバッチと同じRNで、または同じパーティションまたはシャードが格納されている別のRNで実行できます。