10

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

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]))

这是同义词的限制,还是我需要做一些特定的事情才能让它工作?

4

4 回答 4

5

这是 Microsoft 已修复的错误:请参阅MS KB 963684

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

于 2010-01-27T06:22:50.947 回答
2

我测试了同样的事情,似乎查询优化器在通过同义词完成时会忽略该提示。详细信息是我对带有索引提示的任意表进行了 select * 以使用非聚集索引。如果没有同义词,它会进行书签查找/嵌套循环连接。有了它,它会进行表扫描。由于创建同义词语法没有选项,我只能假设索引提示被忽略。BOL 中没有详细说明原因。我会把它称为“功能”。

于 2009-09-01T16:56:18.803 回答
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我的架构中没有命名索引,但编译并运行正常。

于 2009-09-02T11:35:07.777 回答
0

您需要提示吗?MS 的建议是尽可能避免索引提示,因为这可能会使更优化的计划无效。即使今天进行了优化,明天也可能由于数据负载等原因而效率低下。

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

我什至尝试将同义词与索引提示一起使用,并成功强制执行非聚集索引查找(以及获取其余数据的键查找),并且我得到了具有完全限定名称的相同执行计划。

你的统计数据更新了吗?您是否有选择性索引或 SQL Server 是否认为使用表扫描更有效。

于 2009-09-02T08:42:20.653 回答