兩個數據庫中的連接表使查詢變慢?分區數據庫更好嗎?
我對SQL Server 2008 R2有
table1
興趣。db1``table2``db2
如果我對兩個表進行選擇查詢,那麼獲得結果真的很慢。
一個簡單的查詢,例如
SELECT * FROM db1.dbo.table1 t1 LEFT JOIN db2.dbo.table2 t2 ON t1.k1 = t2.k2
有時真的很慢。
我不確定這對於 SQL Server 是否常見,並且“必須像規則一樣”才能“不加入來自不同數據庫的兩個表”。
在那種情況下……我在這個問題中添加了一個儲存在欄位中的數據庫二進制數據,我喜歡與主數據庫分開以不增加主表大小……最好為此分區數據庫?
我用兩個簡單的表進行了測試,但加入這兩個表仍然很慢。
提前感謝您的幫助。
..幾年後更新… 24-09-18
確保您加入的欄位具有相同的類型、大小和排序規則。
範例:一些屬性是 varchar(255) 和另一個 varchar(20) …這可能是一個問題,因為引擎必須將一種類型轉換為另一種類型(發生隱式轉換),雖然有時它執行得更快……如果重新索引或數據庫中發生某些更改,您可以看到在某些時刻查詢開始需要更多時間才能完成……
如果您無法更改欄位類型以匹配其中一個 db/tables,請嘗試進行顯式強制轉換以查看是否可以提高查詢速度。採用
cast(fieldname as type(size)) = fieldName2)
你在這裡有很多不同的問題,所以讓我們單獨解決它們。
問:如果我用上面的查詢連接同一個數據庫中的兩個表,為什麼會很慢?
答:對於初學者,您沒有使用 WHERE 子句,因此 SQL Server 必須建構完整的結果集,將兩個表合併在一起。如果您只需要數據的子集,請考慮使用 WHERE 子句來獲取您需要的數據。
完成此操作後,請注意您使用的是 LEFT OUTER JOIN。這告訴 SQL Server,“並非所有 table1 記錄都會在 table2 中具有匹配的記錄。” 如果這是真的,那完全沒問題 - 但如果您知道所有 t1 記錄將至少有一個 t2 記錄,請改用 INNER JOIN。
接下來,索引開始發揮作用——根據表格的寬度和欄位的數量,您可能希望在用於連接的欄位上添加索引。為了獲得好的建議,最好發布您正在使用的實際執行計劃。
問:如果我的表位於同一個 SQL Server 上的不同數據庫中,這會改變什麼嗎?
答:不。有一些有趣的問題,比如不同數據庫中的預設隔離級別,但在大多數情況下,您的查詢應該產生相同的執行計劃和速度。
問:我應該使用表分區來加快速度嗎?
答:您提到了數據庫分區,但在 SQL Server 中沒有這樣的東西——我猜您的意思是表分區。一般來說,不,我不會為了加快連接速度而進行數據庫設計更改。從基礎開始 - 了解 SQL Server 執行計劃 - 並且只進行數據庫設計更改以解決您無法通過索引等問題解決的問題。