是的,可以有區別。
當您執行如下語句時:SELECT * FROM AdventureWorks2008.dbo.Customers
在的上下文中另一個數據庫(不是AdventureWorks2008)應用了另一個數據庫的設置。
首先,任何數據庫都有其Compatibility Level,可以是不同的,所以它可以限制某些代碼的使用,例如,你不能使用APPLY
運營商的數據庫與CL上下文設置爲80,但你可以在做數據庫CL> = 90
其次,每個數據庫都有自己的一組選項,如AUTO_UPDATE_STATISTICS_ASYNC
和Forced Parameterization
,這些選項可能會影響您的查詢計劃。 我也遇到一些情況下,當數據庫的情況下影響了計劃:
一種情況是,當我創建過濾索引一個表,它是在計劃中使用的,直到我在數據庫中有簡單參數的上下文中執行我的查詢,並且在帶有強制參數化的數據庫環境中執行時,它不會用於相同的查詢。當我使用提示強制該索引時,我得到了由於查詢提示而無法生成查詢計劃的錯誤,所以我需要調查並發現我的查詢已被參數化,而不是我的條件fld = 0
有fld = @p
它不能使用我的篩選索引與fld = 0
條件。
第二種情況是reguarding表基數估計:我們用臨時表來加載在我們的ETL過程的數據,然後再切換到實際表是這樣的:
insert into stg with(tablock);
...
truncate table actual;
alter table stg swith to actual;
所有臨時表是空的時過程編譯,但在過程中他們充滿了數據,所以當我們在他們之間加入時,他們不再是emty了。從0行傳遞到非0行會觸發語句重新編譯,應該考慮到實際行數,但它不會在生產服務器上發生,因此所有估計都是完全錯誤的(每個表格有1行),我需要調查。生產數據庫中的原因是AUTO_UPDATE_STATISTICS_ASYNC
設置爲ON。 現在想象你有2 db:db1和db2這個選項分別設置爲ON和OFF,在db1中,這個代碼將有錯誤的估計,而如果你使用db1.dbo.stg在db2中執行它,它將有正確的估計。這兩個數據庫的執行時間會有很大差異。
在您提到的所有三種方法中,從未發現任何性能差異 –