В локальном сервере (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
Единственное различие в двух запросах - это действительно синоним. Очевидно, синоним влияет на производительность запроса.
План выполнения 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 сервер извлекает отфильтрованные данные с удаленного сервера, используя, таким образом, удаленные индексы.
Есть ли способ использовать синоним, будучи быстрым? Может быть, установка связанного сервера? сервер локальной базы данных?
Спасибо за помощь!