サポートされる問合せ構成と問合せ形態の例
Oracle Globally Distributed Databaseでは、単一シャード問合せとマルチシャード問合せの形式がサポートされていますが、いくつかの制限事項があります。
Oracle Globally Distributed Databaseでの問合せコンストラクトに関する制限事項は次のとおりです。
-
CONNECT BYを使用する問合せ
CONNECT BY
を使用する問合せはサポートされません。 -
MODEL句
MODEL
句はサポートされていません。 -
WHERE句のユーザー定義のPL/SQL マルチシャード問合せでは、ユーザー定義のPL/SQLは
SELECT
句でのみ使用できます。WHERE
句で指定された場合は、エラーがスローされます。 -
XLATEおよびXML問合せタイプ XLATEおよびXML問合せタイプの列はサポートされません。
-
オブジェクト型 オブジェクト型を
SELECT
リスト、WHERE
句などに含めることはできますが、オブジェクト型のカスタム・コンストラクタおよびメンバー関数をWHERE
句に含めることはできません。さらに、重複表の場合、NOT FINAL型(つまり
NOT FINAL
キーワードを指定して作成されたオブジェクト型)は、列のデータ型として使用できません。シャード表の場合、NOT FINAL型を列のデータ型として使用できますが、キーワードNOT SUBSTITUTABLE AT ALL LEVELS
を指定して列を作成する必要があります。
ノート:
重複表のみに関連する問合せは、コーディネータで実行されます。次のトピックでは、Oracle Globally Distributed Databaseでサポートされる問合せ形式の例をいくつか示します。
シャード表のみに対する問合せ
単一表の問合せの場合、問合せにはシャードを限定するシャーディング・キーに対する等価フィルタを指定できます。結合問合せの場合は、すべての表がシャーディング・キーに対する等価フィルタを使用して結合される必要があります。
次の例は、シャード表のみが関与する問合せを示しています。
例8-1 内部結合
SELECT … FROM s1 INNER JOIN s2 ON s1.sk=s2.sk
WHERE any_filter(s1) AND any_filter(s2)
例8-2 左外部結合
SELECT … FROM s1 LEFT OUTER JOIN s2 ON s1.sk=s2.sk
例8-3 右側外部結合
SELECT … FROM s1 RIGHT OUTER JOIN s2 ON s1.sk=s2.sk
例8-4 完全外部結合
SELECT … FROM s1 FULL OUTER JOIN s2 ON s1.sk=s2.sk
WHERE any_filter(s1) AND any_filter(s2)
シャード表および重複表の両方が関係する問合せ
シャード表と重複表が関係する問合せは、シャーディング・キーに対する述語に応じて、単一シャード問合せまたはマルチシャード問合せになります。唯一の違いは、問合せに非シャード表が含まれていることです。
ノート:
シャード表と重複表の結合では、任意の列で、任意の比較演算子(= < > <= >=)または任意の結合式を使用できます。例8-5 内部結合
SELECT … FROM s1 INNER JOIN r1 ON any_join_condition(s1,r1)
WHERE any_filter(s1) AND any_filter(r1)
例8-6 左外部結合または右外部結合
この場合、シャード表はLEFT OUTER JOIN
の最初の表です。
SELECT … FROM s1 LEFT OUTER JOIN r1 ON any_join_condition(s1,r1)
WHERE any_filter(s1) AND any_filter(r1)
SELECT … FROM r1 LEFT OUTER JOIN s1 ON any_join_condition(s1,s2)
AND any_filter(r1) AND filter_one_shard(s1)
この場合、シャード表はRIGHT OUTER JOIN
の2番目の表です。
SELECT … FROM r1 RIGHT OUTER JOIN s1 ON any_join_condition(s1,r1)
WHERE any_filter(s1) AND any_filter(r1)
SELECT … FROM s1 RIGHT OUTER JOIN r1 ON any_join_condition(s1,s2)
AND filter_one_shard(s1) AND any_filter(r1)
場合によっては、重複表がLEFT OUTER JOIN
の最初の表であるか、シャード表が最初の表でシャーディング・キーに対するフィルタ述語に基づいて単一のシャードにマップされます。
SELECT … FROM r1 LEFT OUTER JOIN s1 ON any_join_condition(s1,s2)
AND any_filter(r1) AND any_filter(s1)
場合によっては、重複表がRIGHT OUTER JOIN
の2番目の表であるか、シャード表が2番目の表でシャーディング・キーに対するフィルタ述語に基づいて単一のシャードにマップされます。
SELECT … FROM s1 RIGHT OUTER JOIN r1 ON any_join_condition(s1,s2)
AND any_filter (s1) AND any_filter(r1)
例8-7 完全外部結合
SELECT … FROM s1 FULL OUTER JOIN r1 ON s1.sk=s2.sk
WHERE any_filter(s1) AND any_filter(s2)
この場合、シャード表で複数のシャードへのアクセスが必要となります。
SELECT … FROM s1 FULL OUTER JOIN r1 ON s1.non_sk=s2.non_sk
WHERE any_filter(s1) AND any_filter(s2)
例8-8 セミ結合(EXISTS
)
SELECT … FROM s1 EXISTS
(SELECT 1 FROM r1 WHERE r1.anykey=s1.anykey)
SELECT … FROM r1 EXISTS
(SELECT 1 FROM s1 WHERE r1.anykey=s1.anykey and filter_one_shard(s1))
この場合、シャード表は複数シャードの関与を必要とする副問合せにあります。
SELECT … FROM r1 EXISTS
(SELECT 1 FROM s1 WHERE r1.anykey=s1.anykey)
例8-9 アンチ結合(NOT EXISTS
)
SELECT … FROM s1 NOT EXISTS
(SELECT 1 FROM r1 WHERE r1.anykey=s1.anykey)
この場合、シャード表は副問合せにあります。
SELECT … FROM r1 NOT EXISTS
(SELECT 1 FROM s1 WHERE r1.anykey=s1.anykey
サポートされる集計関数
次の集計は、Oracle Globally Distributed Databaseでのプロキシ・ルーティングによってサポートされます。
-
COUNT
-
SUM
-
MIN
-
MAX
-
AVG
ユーザー定義型を使用した問合せ
ユーザー定義のSQLオブジェクト型とSQLコレクション型は、ユーザー定義型と呼ばれます。Oracle Globally Distributed Databaseでは、ユーザー定義型を使用した問合せがサポートされます。
例8-10 ユーザー定義型を持つ表の作成
次の例では、全シャード・タイプおよびタイプ本体を作成し、そのタイプを参照するシャード表を作成します。
ALTER SESSION ENABLE SHARD DDL;
CREATE OR REPLACE TYPE person_typ AS OBJECT (
first_name VARCHAR2(20),
last_name VARCHAR2(25),
email VARCHAR2(25),
phone VARCHAR2(20),
MEMBER FUNCTION details (
self IN person_typ
) RETURN VARCHAR2
);
/
CREATE OR REPLACE TYPE BODY person_typ AS
MEMBER FUNCTION details (
self IN person_typ
) RETURN VARCHAR2 IS
result VARCHAR2(100);
BEGIN
result := first_name || ' ' || last_name || ' ' || email || ' ' || phone;
RETURN result;
END;
END;
/
CREATE SHARDED TABLE Employees
( Employee_id NUMBER NOT NULL
, person person_typ
, signup_date DATE NOT NULL
, CONSTRAINT RootPK PRIMARY KEY(CustNo)
)
PARTITION BY CONSISTENT HASH (CustNo)
PARTITIONS AUTO
TABLESPACE SET ts1
;
例8-11 型コンストラクタを使用したデータの挿入
INSERT INTO Employees values ( 1, person_typ('John', 'Doe', 'jdoe@example.com', '123-456-7890'), to_date('24 Jun 2020', 'dd Mon YYYY'));
例8-12 ユーザー定義型の列のマルチシャード問合せ
SELECT e.person FROM Employees e;
SELECT e.person.first_name, e.person.last_name FROM Employees e;
SELECT e.person.details() FROM Employee e where e.person.first_name = 'John’;
SELECT signup_date from Employees e where e.person = person_typ('John', 'Doe', 'jdoe@example.com', '123-456-7890’);
プロキシ・ルーティング用の実行計画
マルチシャード問合せでは、各シャードで別個の実行計画が生成されます。この実行計画はデータのサイズに応じて最適化され、シャードで使用可能なリソースが計算されます。
SQLフラグメントの実行計画を参照するために、個々のシャードに接続する必要はありません。dbms_xplan.display_cursor()
で提供されるインタフェースは、シャードで実行されたSQLセグメントの計画をコーディネータに表示します。また、[V/X]$SHARD_SQL
は、マルチシャード問合せのシャードSQLフラグメントをターゲットのシャード・データベースに一意にマップします。
dbms_xplan.display_cursor()
のSQLセグメント・インタフェース
2つのインタフェースを使用して、シャードで実行されたSQLセグメントの計画を表示できます。これらのインタフェースは、引数としてシャードIDを取り、指定されたシャードの計画を表示します。ALL_SHARDS
形式では、すべてのシャードの計画が表示されます。
シャードのすべての計画を出力するには、次に示すようにformat
値ALL_SHARDS
を使用します。
select * from table(dbms_xplan.display_cursor(sql_id=>:sqlid,
cursor_child_no=>:childno,
format=>'BASIC +ALL_SHARDS‘,
shard_ids=>shard_ids))
シャードの計画を選択して出力するには、display_cursor()
関数内でシャードIDを渡します。複数のシャードの計画を出力する場合は、次に示すようにshard_ids
パラメータでシャードIDを含む数値の配列を渡します。
select * from table(dbms_xplan.display_cursor(sql_id=>:sqlid,
cursor_child_no=>:childno,
format=>'BASIC',
shard_ids=>ids))
1つのシャードの計画を返すには、次に示すようにshard_id
パラメータにシャードIDを直接渡します。
select * from table(dbms_xplan.display_cursor(sql_id=>:sqlid,
cursor_child_no=>:childno,
format=>'BASIC',
shard_id=>1))
V$SQL_SHARD
V$SQL_SHARD
は、マルチシャード問合せのシャードSQLフラグメントをターゲットのシャード・データベースに一意にマップします。このビューは、特定のマルチシャード問合せのシャードSQLフラグメントごとにアクセスされたシャードのリストがシャード・コーディネータ・データベースに格納されている場合にのみ関連します。マルチシャード問合せが実行されるたびに、異なるシャード・セットでシャードSQLフラグメントを実行できるため、実行されるたびにシャードIDが更新されます。このビューには、各リモート・ノードのシャードSQLフラグメントのSQL IDと、シャードSQLフラグメントが実行されたシャードIDが保持されています。
Name Null? Type
----------------------------------------- -------- ----------------------------
SQL_ID VARCHAR2(13)
CHILD_NUMBER NUMBER
NODE_ID NUMBER
SHARD_SQL_ID VARCHAR2(13)
SHARD_ID NUMBER
SHARD_CHILD_NUMBER NUMBER
-
SQL ID - コーディネータ上のマルチシャード問合せのSQL ID
-
CHILD_NUMBER - コーディネータ上のマルチシャード問合せのカーソル子番号
-
NODE - マルチシャード問合せのシャードSQLフラグメントのリモート・ノードのID
-
SHARD_SQL_ID - 指定されたリモート・ノードIDに対するシャードSQLフラグメントのSQL ID
-
SHARD_ID - シャードSQLフラグメントが実行されたシャードのID
-
SHARD_CHILD_NUMBER - シャードに対するシャードSQLフラグメントのカーソル子番号(デフォルトは0)
分散データベースに対するマルチシャード問合せと実行計画の例を次に示します。
SQL> select count(*) from departments a where exists (select distinct department_id
from departments b where b.department_id=60);
------------------------------------------------
| Id | Operation | Name |
------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | SORT AGGREGATE | |
| 2 | FILTER | |
| 3 | VIEW | VW_SHARD_377C5901 |
| 4 | SHARD ITERATOR | |
| 5 | REMOTE | |
| 6 | VIEW | VW_SHARD_EEC581E4 |
| 7 | SHARD ITERATOR | |
| 8 | REMOTE | |
------------------------------------------------
V$SQL_SHARD
ビューに対するSQL_IDの問合せ。
SQL> Select * from v$sql_shard where SQL_ID = ‘1m024z033271u’;
SQL_ID NODE_ID SHARD_SQL_ID SHARD_ID
------------- ------- -------------- --------
1m024z033271u 5 5z386yz9suujt 1
1m024z033271u 5 5z386yz9suujt 11
1m024z033271u 5 5z386yz9suujt 21
1m024z033271u 8 8f50ctj1a2tbs 11