SQL Remote のパブリケーションとサブスクリプションの確認

概要:この文書では、パブリケーションやサブスクリプションをデバッグし、パフォーマンスの問題を特定するテクニックについて説明します。この文書は、SQL Anywhere のすべてのバージョンを対象としています。

SQL Remote のパブリケーションとサブスクリプションの確認

SQL Remote サブスクリプションと同等の SELECT 文を ISQL で実行できます。このテクニックを使用して、SQL Remote のパブリケーションやサブスクリプションをデバッグし、パフォーマンスの問題を特定できます。

パブリケーションやサブスクリプションを実行可能な SQL に変換するルールは、次のとおりです。

パブリケーションは、アーティクルごとに 1 つの SELECT 文に変換します。各 select リストは、アーティクル内でパブリッシュされたカラムになります。
SELECT 文の WHERE 句は、次のようにして作成します。
SUBSCRIBE または WHERE の制限がない場合は、WHERE 句はありません。
WHERE 制限がパブリケーションにある場合は、この WHERE 制限を WHERE 句として使用します。
SUBSCRIBE 制限がある場合は、次のようになります。
SUBSCRIBE BY 式 (カラムまたは句) を WHERE 句の一方の辺に使用します。
演算子は等号 (=) です。
サブスクリプションで指定する引数は、WHERE 句のもう一方の辺を構成します。
WHERE 制限と SUBSCRIBE 制限の両方がある場合は、WHERE 句はその両方の制限の論理積として構成します。

例 1

次の例は、SQL Anywhere に付属の SALESPUB.SQL スクリプトの一部です。

CREATE PUBLICATION sales(

     TABLE customer,
     TABLE product,
     TABLE sales_order SUBSCRIBE BY region,
     TABLE sales_order_items SUBSCRIBE BY region,
     TABLE employee(emp_id,emp_fname,emp_lname,dept_id) WHERE dept_id=200);

CREATE SUBSCRIPTION TO sales(‘Eastern’) FOR east;

“east” ユーザ用の次の select 文は、”sales” パブリケーション内の各アーティクルに相当します。

SELECT * FROM customer;

SELECT * FROM product;

SELECT * FROM sales_order
   WHERE region = ‘Eastern';

SELECT * FROM sales_order_items
     WHERE region = ‘Eastern';

SELECT emp_id, emp_fname, emp_lname, dept_
     FROM employee
     WHERE dept_id=200;

例 2

次のパブリケーションは、SUBSCRIBE BY でのサブクエリの使用方法を示しています。これは、『SQL Anywhere User’s Guide』の 「27.8.3 Subqueries in a SUBSCRIBE BY expression」から抜粋したものです。

CREATE PUBLICATION pub_name (
TABLE sales_order SUBSCRIBE BY region
TABLE sales_order_items SUBSCRIBE BY
(select region
from sales_order
where sales_order.id = sales_order_items.id) )

CREATE SUBSCRIPTION TO pub_name(‘Eastern’) FOR east;

次の select 文は、このパブリケーション内のアーティクルに相当します。

SELECT * FROM sales_order
WHERE region = ‘Eastern';

SELECT * FROM sales_order_items
WHERE ‘Eastern’ IN (SELECT region
FROM sales_order
WHERE sales_order.id = sales_order_items.id)

この例は、サブクエリがパブリケーションで機能するかどうかを特定する方法を示しています。演算子が IN 句にあるため、サブクエリが複数の値を返すことがあります。 したがって、可能な関係は 1 対 1、1 対複数、複数対複数のいずれかになります。

例 3

次の例は、WHERE 制限と SUBSCRIBE 制限の両方を示しています。

CREATE PUBLICATION example3(
TABLE employee(emp_id,emp_fname,emp_lname,dept_id,sex)
WHERE dept_id=200
SUBSCRIBE BY sex);

CREATE SUBSCRIPTION TO example3(‘F’) FOR anyuser;

次の select 文は、このパブリケーション内のアーティクルに相当します。

SELECT emp_id,emp_fname,emp_lname,dept_id,sex
     FROM employee
     FROM employee