2009-09-01 55 views
9

我在2005年我创建了一个同义词在一个数据库访问另一个数据库中的表,写我的查询时,我想利用SQL Server的单个实例多个数据库但是,在评估执行计划时,它似乎没有使用它。如果我编写查询来显式访问数据库,它可以工作,但似乎无法使用同义词来使其工作。例如:SQL Server表的同义词指数

select * 
from testdb..testtable with (index(testindex)) 

|--Nested Loops(Inner Join, OUTER REFERENCES:([testdb].[dbo].[testtable].[id])) 
    |--Index Scan(OBJECT:([testdb].[dbo].[testtable].[testindex])) 
    |--Clustered Index Seek(OBJECT:([testdb].[dbo].[testtable].[PK_testtable]), SEEK:([testdb].[dbo].[testtable].[id]=[testdb].[dbo].[testtable].[id]) LOOKUP ORDERED FORWARD) 

不会产生相同的执行计划以

select * 
from testdb_synonym with (index(testindex)) 

|--Clustered Index Scan(OBJECT:([testdb].[dbo].[testtable].[PK_testtable])) 

这是同义词的限制,还是有一些具体的事情,我需要做的就是这个工作?

+1

能否请您发布的这两个查询基本计划?只要运行'SET SHOWPLAN_TEXT ON GO SELECT ...' – Quassnoi 2009-09-01 14:56:16

+0

我已经更新了说明,包括执行计划... – 2009-09-01 16:46:34

回答

1

我测试过同样的事情,看来,当通过同义词进行查询优化器会忽略提示。详细信息是我对索引提示使用非聚集索引的任意表执行select *操作。没有同义词,它会执行书签查找/嵌套循环连接。有了它,它进行了表扫描。由于在创建同义词语法上没有选项,我只能假定索引提示被忽略。没有关于为什么BOL的细节。我会把它作为一个“特征”来记录。

+0

我希望这不会是这样的...它被吹捧为一种失真功能与部分它有利于简化点符号。我可以理解它是否违背了远程服务器,但如果它是本地服务器,我希望它能够充分利用其固有优势。 – 2009-09-01 17:13:26

0

你需要提示你的情况吗? MS建议避免索引提示,如果可能的话,可能会导致更优化的计划失效。即使它今天进行了优化,但由于数据加载等原因,明天可能会效率低下。

我试图在SQL Server 2008中使用没有提示的同义词,并使用与同义词完全限定的名称相同的执行计划database.schema.table)。

我甚至试图使用索引提示的同义词,并成功地强制非聚集索引查找(和密钥查找来获取其余数据),并且我用完全限定名得到相同的执行计划。

您的统计数据是否已更新?你有选择性索引还是SQL服务器认为使用表扫描更有效率?

1

WITH INDEX提示似乎是同义词被忽略。

CREATE SYNONYM syn_master FOR master 

SELECT * 
FROM syn_master WITH (INDEX (wow_i_can_write_everything_here)) 

编译尽管实际上我没有在我的架构命名wow_i_can_write_everything_here指数好吧运行。

+0

不再适用于SQL Server 2008 R2。顺便说一句:你正在为主数据库创建一个同义词,我不认为这会起作用(select * from master ??)。 – 2011-12-20 08:58:02

5

这是微软已经修正了一个错误:看到MS KB 963684

在Microsoft SQL Server 2005,您 为表创建一个同义词。您针对同义词运行 查询。查询 使用INDEX优化器提示强制 一个索引。如果检查是用于查询, 您可能会发现执行计划不 不使用强制索引的生成的执行 计划。