11

在本地服务器(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 查询中,服务器从远程服务器获取过滤后的数据,因此使用远程索引.

有没有办法在快速的同时使用同义词?也许是链接服务器的设置?本地数据库服务器?

谢谢您的帮助!

4

2 回答 2

2

我会将没有顺序的数据转储到本地服务器上的临时表中。然后我会从临时表中选择 order by。Order by 几乎总是杀手锏。

于 2014-07-24T19:26:10.440 回答
1

dba.stackexchange.com 上这篇文章的公认答案指出,由于链接服务器上的访问权限有限,因此在查询链接服务器时可能会出现性能问题,从而限制了表统计信息对本地服务器的可见性。这会影响查询计划,从而影响性能。

摘抄:

这就是为什么我得到不同的结果。当以系统管理员身份运行时,我得到了完整的分布统计信息,表明没有订单 ID > 20000 的行,估计是一行。(回想一下,优化器从不假定统计信息中的行数为零。)但是当以普通用户身份运行时,DBCC SHOW_STATISTICS 因权限错误而失败。这个错误没有传播,而是优化器接受没有统计信息并使用默认假设。由于它确实获得了基数信息,它了解到远程表有 830 行,因此估计为 249 行。

于 2014-07-24T08:44:30.727 回答