分散パーティション ビューの解決

SQL Server 2005 のクエリ プロセッサでは、分散パーティション ビューのパフォーマンスが最適化されます。分散パーティション ビューのパフォーマンスで最も重要な点は、メンバ サーバー間で転送されるデータの量を最小限に抑えることです。

SQL Server 2005 では、リモート メンバ テーブルからのデータにアクセスするときに分散クエリを効率的に使用できる、高機能で動的なプランが構築されます。

  • クエリ プロセッサでは、最初に OLE DB を使用して、各メンバ テーブルから CHECK 制約の定義が取得されます。これにより、クエリ プロセッサは、メンバ テーブル間でキー値の分布をマップできるようになります。
  • クエリ プロセッサでは、SQL ステートメントの WHERE 句で指定されたキーの範囲が、メンバ テーブルでの行の分布状況を示すマップと比較されます。次に、分散クエリを使用して SQL ステートメントの完了に必要なリモート行だけを取得するクエリ実行プランが構築されます。この実行プランでは、リモート メンバ テーブルのデータやメタデータへのアクセスが、情報が要求されるまで遅延されます。

たとえば、顧客テーブルが Server1 (CustomerID 1 ~ 3299999)、Server2 (CustomerID 3300000 ~ 6599999)、および Server3 (CustomerID 6600000 ~ 9999999) にパーティション分割されたシステムがあるとします。

Server1 で実行される次のクエリ用に構築される実行プランを考えてみます。

SELECT *
FROM CompanyData.dbo.Customers
WHERE CustomerID BETWEEN 3200000 AND 3400000

このクエリの実行プランでは、ローカル メンバ テーブルから CustomerID のキー値が 3200000 ~ 3299999 の行が抽出され、分散クエリを実行して Server2 からキー値が 3300000 ~ 3400000 の行が取得されます。

SQL Server 2005 のクエリ プロセッサでは、プランを構築する必要があるときにキー値がわからない SQL ステートメント用に、クエリの実行プランに動的なロジックを組み込むこともできます。たとえば、次のようなストアド プロシージャがあるとします。

CREATE PROCEDURE GetCustomer @CustomerIDParameter INT
AS
SELECT *
FROM CompanyData.dbo.Customers
WHERE CustomerID = @CustomerIDParameter

SQL Server 2005 では、プロシージャが実行されるたびに **@CustomerIDParameter** パラメータによって指定されるキー値を予測できません。クエリ プロセッサはキー値を予測できないので、アクセスする必要のあるメンバ テーブルを予測することもできません。この状況に対処するために、SQL Server では、動的フィルタと呼ばれる条件ロジックを含む実行プランが構築され、アクセスされるメンバ テーブルが入力パラメータ値に基づいて制御されます。GetCustomer ストアド プロシージャが Server1 で実行されたと仮定すると、実行プランのロジックは次のように表すことができます。

IF @CustomerIDParameter BETWEEN 1 and 3299999
   Retrieve row from local table CustomerData.dbo.Customer_33
ELSEIF @CustomerIDParameter BETWEEN 3300000 and 6599999
   Retrieve row from linked table Server2.CustomerData.dbo.Customer_66
ELSEIF @CustomerIDParameter BETWEEN 6600000 and 9999999
   Retrieve row from linked table Server3.CustomerData.dbo.Customer_99

SQL Server 2005 では、パラメータ化されていないクエリに対してもこのような動的実行プランが構築されます。オプティマイザでは、クエリがパラメータ化され、実行プランを再利用できるようにします。オプティマイザがパーティション ビューを参照しているクエリをパラメータ化すると、必要な行が指定されたベース テーブルにあると仮定することができなくなります。そのため、実行プランで動的フィルタを使用する必要があります。詳細については、「簡易パラメータ化」を参照してください。