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