行の関数
表管理の項で説明しているように、表の行は表スキーマに準拠するレコード値ですが、表スキーマに含まれない追加のプロパティが含まれています。このようなプロパティの値を抽出するには、この項にリストされた関数を使用する必要があります。
これらの関数のシグネチャでは、入力パラメータの型としてAnyRecordを指定していますが、関数では実際には入力として行が必要です。行を返す唯一の式は、行変数、つまり、名前が$で始まる表の別名です。「例: TTLの更新」の項に、remaining_hours()
関数(行が使用可能な関数の1つ)の使用例を示します。
timestamp(3) modification_time (AnyRecord)
modification_time
関数を使用すると、行の最新の変更時間(UTC)を表示できます。この時間は、精度3 (ミリ秒)のタイムスタンプ値として返されます。行が挿入後に変更されていない場合は、挿入時間を返します。これは、表が複数のリージョンにまたがり、Oracle NoSQL Databaseクロスリージョン・エージェントがリモート・リージョンからデータをレプリケートして表を更新しているデプロイメントで役立つ場合があります。
例:
次の問合せは、id
10の行の最新の変更時間を戻します。
SELECT modification_time($u) FROM users $u WHERE id=10;
+--------------------------+
| Column_1 |
+--------------------------+
| 2021-02-26T07:16:37.266Z |
+--------------------------+
integer remaining_hours(AnyRecord)
行の有効期限が切れるまでの満で数えた時間数を返します。行に有効期限がない場合は、負数を返します。
integer remaining_days(AnyRecord)
行の有効期限が切れるまでの満で数えた日数を返します。行に有効期限がない場合は、負数を返します。
timestamp(0) expiration_time(AnyRecord)
行の有効期限を精度ゼロのタイムスタンプ値として返します。行に有効期限がない場合は、UTC 1970年1月1日に設定されたタイムスタンプを返します。
long expiration_time_millis(AnyRecord)
行の有効期限をUTC 1970年1月1日以降のミリ秒数で返します。行に有効期限がない場合は、ゼロを返します。
次の関数を使用すると、データがストア全体にどのように分散されているかを確認し、統計を収集できます。
integer shard (AnyRecord)
shard
関数を使用すると、特定のデータ行が格納されているシャードIDを取得できます。整数値を返します。シャードIDの詳細は、管理者ガイドのキー配布統計の表示に関する項を参照してください。
例:
次の問合せは、id
10の行が格納されているシャードを返します。
SELECT shard($u) FROM users $u WHERE id=10;
+----------+
| Column_1 |
+----------+
| 1 |
+----------+
この関数を使用して、Oracle NoSQL Databaseクラスタ内の潜在的なストレージ・ホットスポットまたは不均衡を識別できます。たとえば、特定のシャードが他のシャードより多くの記憶域を消費しているように見える場合があります。次のコマンドを発行して、そのシャード内のレコード数をストア内の他のシャードと比較できます。SELECT count(id) FROM users $u WHERE shard($u) =1;
integer partition (AnyRecord)
partition
関数を使用すると、特定のデータ行が格納されているパーティションIDを表示できます。
例:
次の問合せは、id
10の行が格納されているパーティションを返します。
SELECT partition($u) FROM users $u WHERE id=10;
+----------+
| Column_1 |
+----------+
| 6 |
+----------+
例:
次の問合せは、id
1のシャード内のパーティションのリストを返します。
SELECT DISTINCT partition ($u) FROM users $u WHERE shard($u)=1;
+----------+
| Column_1 |
+----------+
| 2 |
| 4 |
| 9 |
+----------+
integer row_storage_size (AnyRecord)
row_storage_size
関数を使用すると、特定のデータ行で使用される永続記憶域サイズ(バイト単位)を確認できます。整数値を返します。
例:
次の問合せは、id
10の行の記憶域サイズを返します。
SELECT row_storage_size($u) FROM users $u WHERE id=10;
+----------+
| Column_1 |
+----------+
| 163 |
+----------+
integer index_storage_size (AnyRecord, String)
index_storage_size
関数を使用すると、指定したデータ行の索引で使用される永続記憶域サイズ(バイト単位)を確認できます。整数値を返します。この関数では2つの引数を指定します。最初の引数は、索引が作成される表参照です。2番目の引数は、記憶域サイズが必要な索引名です。索引名では、大文字と小文字は区別されません。
例:
次の問合せは、id
10の行の索引の記憶域サイズを返します。2番目の引数"myindex1"は、users
表に作成された索引の名前です。
sql-> SELECT index_storage_size($u,"myindex1")
FROM users $u WHERE id=10;
+----------+
| Column_1 |
+----------+
| 24 |
+----------+
例11-1 行関数の例
次の問合せでは、各パーティションについて、そのパーティションに含まれるusers
表のすべての行を格納するために使用される合計バイト数が返されます。出力の最初の列はパーティション番号のリストで、2番目の列はそれらのパーティションの現在のサイズです。次の問合せを使用すると、クラスタ内のパーティション間で表の記憶域がどのように分散されているかを詳細に表示できます。
sql-> SELECT partition($u),
sum(row_storage_size($u))
FROM users $u
GROUP BY partition($u);
+----------+----------+
| Column_1 | Column_2 |
+----------+----------+
| 1 | 143 |
| 6 | 163 |
| 8 | 143 |
+----------+----------+
3 rows returned