2009-09-01 58 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優化器提示強制 一個索引。如果檢查是用於查詢, 您可能會發現執行計劃不 不使用強制索引的生成的執行 計劃。