Sql-Server
使用索引替代 UNION
我在 SQL Server 2012 上,我有不同公司的表,每個公司都有自己的客戶:
CompanyA_Customers: ID | Name --------- 11 | Foo 12 | Bar CompanyB_Customers: ID | Name --------- 11 | Baz 12 | Qux
我需要一個表來查詢它們,所以我這樣做了:
CREATE VIEW Customers AS SELECT 'A' AS Company, ID, Name FROM CompanyA_Customers UNION ALL SELECT 'B' AS Company, ID, Name FROM CompanyB_Customers
但我的表現很差,因為據我所知,
UNION
我無法定義任何索引。有沒有更好的性能替代品?
恕我直言(正如狗仔隊在評論中指出的那樣)完成它並獲得更好性能的最簡單方法是通過添加 CompanyID 欄位來使用單個表。
CREATE TABLE Customers ( CompanyID <some_type> REFERENCES Companies (CompanyID), CustomerID <some_type> REFERENCES Customers (CustomerID), Name text, PRIMARY KEY (CompanyID, CustomerID) );
如果您無法修改實際的表模式,則可以使用兩個物化視圖,每個公司一個,並根據您的查詢在 (company_id, id) 或 (id, company_id) 上添加一個聚集索引。
我在**這裡設置了一個小提琴**
select company_id, id, name from ( select company_id, id, name from dbo.vcustA union all select company_id, id, name from dbo.vcustB ) x where id = 2;
使用UNION的兩個物化視圖的執行計劃:
但實際上,這比創建一個包含兩個表的所有記錄的新表還要糟糕。我建議不要使用兩個物化視圖,而是創建一個新表,並使用觸發器添加/更新/刪除客戶 A 和客戶 B 的所有記錄。或者設置一個同步這些資訊的日常工作。