2017-08-07 30 views
0

我想找出你可以定義在SSMS中使用哪個數據庫的方式的差異。不同的方式來定義使用哪個數據庫?

是否有使用「可用數據庫」下拉列表

Adventure works Available Databases dropdown之間的功能差異,

數據庫在查詢中被定義

SELECT * FROM AdventureWorks2008.dbo.Customers 

和 說明在數據庫開始?

USE AdventureWorks2008 
GO 
SELECT * FROM dbo.Customers 

我很想知道是否在性能方面有差異或者發生在每種情況下的幕後。

謝謝你的幫助

+0

在您提到的所有三種方法中,從未發現任何性能差異 –

回答

0

是的,有。當您使用「USE AdventureWorks2008」時會添加非常小的開銷,因爲它會在您每次執行查詢時針對數據庫執行它。它還將打印「命令已成功完成」。然而,它是如此之小的開銷,如果你對這個消息沒問題,那麼就不要在意這一點。

0

是的,可以有區別。

當您執行如下語句時:SELECT * FROM AdventureWorks2008.dbo.Customers的上下文中另一個數據庫(不是AdventureWorks2008)應用了另一個數據庫的設置。

首先,任何數據庫都有其Compatibility Level,可以是不同的,所以它可以限制某些代碼的使用,例如,你不能使用APPLY運營商的數據庫與CL上下文設置爲80,但你可以在做數據庫CL> = 90

其次,每個數據庫都有自己的一組選項,如AUTO_UPDATE_STATISTICS_ASYNCForced Parameterization,這些選項可能會影響您的查詢計劃。 我也遇到一些情況下,當數據庫的情況下影響了計劃:

一種情況是,當我創建過濾索引一個表,它是在計劃中使用的,直到我在數據庫中有簡單參數的上下文中執行我的查詢,並且在帶有強制參數化的數據庫環境中執行時,它不會用於相同的查詢。當我使用提示強制該索引時,我得到了由於查詢提示而無法生成查詢計劃的錯誤,所以我需要調查並發現我的查詢已被參數化,而不是我的條件fld = 0fld = @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中執行它,它將有正確的估計。這兩個數據庫的執行時間會有很大差異。

相關問題