概要:この文書では、パブリケーションやサブスクリプションをデバッグし、パフォーマンスの問題を特定するテクニックについて説明します。この文書は、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
|