Sql-Server

如何使聯合視圖更有效地執行?

  • April 10, 2019

我有一個大表(數千萬到數億條記錄),出於性能原因,我們已將其拆分為活動表和存檔表,使用直接欄位映射,並且每晚執行存檔程序。

在我們的程式碼中的幾個地方,我們需要執行結合活動表和存檔表的查詢,幾乎總是由一個或多個欄位過濾(我們顯然在兩個表中都放置了索引)。為方便起見,有這樣的視圖是有意義的:

create view vMyTable_Combined as
select * from MyTable_Active
union all
select * from MyTable_Archive

但是,如果我執行類似的查詢

select * from vMyTable_Combined where IndexedField = @val

在過濾之前,它將對 Active 和 Store中的所有內容進行聯合@val,這會降低性能。

@val有沒有什麼聰明的方法可以在創建聯合之前 使聯合的兩個子查詢按每個過濾器查看?

或者,您可能會建議其他一些方法來實現我的目標,即一種簡單有效的方法來獲取由索引欄位過濾的聯合記錄集?

**編輯:**這是執行計劃(你可以在這裡看到真實的表名):

執行計劃

奇怪的是,活動表實際上使用了正確的索引(加上 RID 查找?)但存檔表正在執行表掃描!

對該問題的評論表明,問題在於 OP 用於開發查詢的測試數據庫具有與生產數據庫完全不同的數據特徵。它的行數要少得多,並且用於過濾的欄位的選擇性不夠。

當列中不同值的數量太少時,索引可能沒有足夠的選擇性。在這種情況下,順序表掃描比索引查找/行查找操作便宜。通常,表掃描會大量使用順序 I/O,這比隨機訪問讀取要快得多。

通常,如果查詢將返回超過百分之幾的行,那麼僅進行表掃描會比索引查找/行查找或大量使用隨機 I/O 的類似操作便宜。

引用自:https://dba.stackexchange.com/questions/16067