【问题标题】:SQL Server Table Synonyms with Indexes带索引的 SQL Server 表同义词
【发布时间】:2010-11-24 16:14:39
【问题描述】:

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

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

【问题讨论】:

  • 能否请您发布两个查询的基本计划?只需运行SET SHOWPLAN_TEXT ON GO SELECT …
  • 我已经更新了描述以包含执行计划...

标签: sql sql-server database indexing synonym


【解决方案1】:

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

【讨论】:

  • 我希望不会是这种情况......它被吹捧为一种别名功能,其部分好处是简化了点表示法。我可以理解它是否针对远程服务器,但如果它是本地服务器,我希望它足够聪明以利用其固有的优势。
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

    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 的索引,但编译和运行正常。

    【讨论】:

    • 对于 SQL Server 2008 R2 不再适用。顺便说一句:您正在创建主数据库的同义词,我认为这行不通(从主数据库中选择 *??)。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 2014-05-31
      相关资源
      最近更新 更多