2013-07-28 32 views
16

在SQL Server中使用完全限定的表名對性能有任何影響嗎?使用完全限定名稱會影響性能嗎?

我有一個查詢,我在不同的數據庫中加入兩個表。 DBA建議在主機查詢中省略數據庫名稱,我猜測它是用於性能或慣例。

所有表完全合格

USE [DBFoo] 
SELECT * FROM [DBFoo].[dbo].[people] a 
INNER JOIN [DBBar].[dbo].[passwords] b on b.[EntityID] = a.[EntityID] 

首選?

USE [DBFoo] 
SELECT * FROM [dbo].[people] a 
INNER JOIN [DBBar].[dbo].[passwords] b on b.[EntityID] = a.[EntityID] 

這實際上是否有所作爲?

+8

不會。使用「foo.dbo.people」與使用「people」不會有運行時性能提升。或相反亦然。圖書推薦:「Inside SQL Server」,Kalen Delaney等人。 – paulsm4

回答

11

完全限定名稱通常是首選,但需要考慮一些注意事項。我會說這取決於需求,單個答案可能不足以滿足所有情況。

請注意,這只是一個編譯綁定,而不是執行。因此,如果您執行相同的查詢一千次,只有第一次執行纔會「查找」查找時間,這意味着在完全限定名稱的情況下查找時間更少。這也意味着使用完全限定名稱將節省編譯開銷(執行查詢時的第一次)。

其餘部分將重新使用編譯後的名稱解析爲對象引用。

這個MSDN Article給出了關於SQL Server最佳實踐的公正指導。(檢查命名的部分:如何引用對象

此鏈接在一套做解析和驗證執行前的對象引用步驟的更多細節解釋說:http://blogs.msdn.com/b/mssqlisv/archive/2007/03/23/upgrading-to-sql-server-2005-and-default-schema-setting.aspx

通過第二個鏈接去,結論說:

顯然,最佳實踐仍然是:您應該完全限定所有對象名稱,而不必擔心名稱解析成本。現實情況是,這裏仍然有很多不完善的應用,這種設置對這些情況非常有幫助。

此外,如果數據庫名稱的變化是不允許的生產環境中,你可能會然後把包含在完全合格的名稱數據庫名稱。

+1

這就是說模式限定(兩個部分名稱)不是三個部分名稱。我肯定會避免DB對象(過程等)中的三個部分名稱,因爲這意味着如果數據庫已重命名或以新名稱恢復,則需要更改它們。 –

+0

@Martin: MSDN文章說:要引用位於遠程數據庫中的對象,完全限定對象名稱將包括服務器名稱和數據庫名稱。 這就是爲什麼MSDN文章被引用需要更多的想法。即使是MSDN的結論部分也一樣:始終使用完全限定名稱引用對象。 至少應使用模式名稱,後跟對象名稱。是的,數據庫名稱可以更改。然而,它更多的是在生產場景中不太可能發生。即使在測試場景(UAT)中也很少發生。 –

+0

Msdn也說:評估過程可以通過使用完全限定名稱或DEFAULT_SCHEMA選項來改進。我會說這要求很大程度上取決於要求,單個答案可能不足以滿足所有情況。數據庫名稱的更改是可能的,但迄今爲止我認爲這違反了許多組織遵循的標準做法。例如,因爲我們通常在存儲在web.config中的連接字符串中有數據庫名稱。這肯定會影響部署到Production環境的所有應用程序。 –

3

在SQL Server中使用完全限定的表名是否對性能有任何影響?

有一個微不足道的懲罰,因爲查詢文本更長,所以有更多的字節被髮送到SQL Server和解析。

懲罰是學術的,誠實的,因爲前綴不會更好或更壞。

如果您觀察到性能的差異,可能是因爲查詢文本不同並且SQL Server生成了不同的計劃。如果條件(統計數據,其他)在運行查詢之間不發生變化,那麼很可能SQL Server將生成100%相同的計劃。如果運行前綴和前綴不變的查詢之間的條件發生了變化,則一個計劃可能會比另一個更好。

雖然在這種情況下,性能差異並不是因爲前綴。如果您從計劃緩存中清除計劃並再次運行它們(這樣SQL Server就有機會在相同的條件下生成計劃),您應該可以看到兩個查詢具有相同的計劃。

對符合條件的對象名稱有意義(請參閱CREATE VIEW ... WITH SCHEMABINDING),但對性能沒有影響。

2

如果您遷移或重命名數據庫名稱,具有數據庫前綴將會導致問題。這可能是DBA建議的原因

1

在SQL Server中使用完全限定的表名對性能有任何影響嗎? 是的。重用計劃緩存消除了「重新編譯」計劃的要求。

順便說一句:研究參數嗅探,所以計劃重用不會對性能產生負面影響......另一方面。

MSDN: 將新SQL語句與高速緩存中現有未使用的執行計劃匹配的算法要求所有對象引用都是完全限定的。例如,這些SELECT語句中的第一個與現有計劃不匹配,第二個匹配:

SELECT * FROM Person;

SELECT * FROM Person.Person;

來源: https://technet.microsoft.com/en-us/library/ms181055(v=sql.105).aspx

所以,MSDN認爲schema.name爲完全合格的名稱,它匹配。 不相信這與最佳實踐的混淆表相關,intellisense需要幫助......泥濘的水域。

相關問題