localserver (SQL Server 2008 R2) にはsyn_view1
、リンク サーバーを指すというシノニムがあります。remoteserver.remotedb.dbo.view1
この SLOW クエリの実行には20 秒かかります。
select e.column1, e.column2
from syn_view1 e
where e.column3 = 'xxx'
and e.column4 = 'yyy'
order by e.column1
この FAST クエリの実行には1 秒かかります。
select e.column1, e.column2
from remoteserver.remotedb.dbo.view1 e
where e.column3 = 'xxx'
and e.column4 = 'yyy'
order by e.column1
2 つのクエリの唯一の違いは、シノニムの存在です。明らかに、シノニムはクエリのパフォーマンスに影響を与えます。
SLOW クエリの実行プランは次のとおりです。
Plan Cost % Subtree cost
4 SELECT
I/O cost: 0.000000 CPU cost: 0.000000 Executes: 0
Cost: 0.000000 0.00 3.3521
3 Filter
I/O cost: 0.000000 CPU cost: 0.008800 Executes: 1
Cost: 0.008800 0.26 3.3521
2 Compute Scalar
I/O cost: 0.000000 CPU cost: 3.343333 Executes: 1
Cost: 0.000000 0.00 3.3433
1 Remote Query
I/O cost: 0.000000 CPU cost: 3.343333 Executes: 1
Cost: 3.343333 99.74 3.3433
FAST クエリの場合:
Plan Cost % Subtree cost
3 SELECT
I/O cost: 0.000000 CPU cost: 0.000000 Executes: 0
Cost: 0.000000 0.00 0.1974
2 Compute Scalar
I/O cost: 0.000000 CPU cost: 0.197447 Executes: 1
Cost: 0.000000 0.00 0.1974
1 Remote Query
I/O cost: 0.000000 CPU cost: 0.197447 Executes: 1
Cost: 0.197447 100.00 0.1974
私の理解では、SLOW クエリでは、サーバーはリモート サーバーからすべてのデータをフェッチしてからフィルターを適用しますが (インデックスはありません)、FAST クエリでは、サーバーはリモート サーバーからフィルター処理されたデータをフェッチし、リモート インデックスを使用します。 .
高速で同義語を使用する方法はありますか? たぶん、リンクサーバーのセットアップですか?ローカルデータベースサーバー?
助けてくれてありがとう!