Sql-Server

使用索引替代 UNION

  • February 8, 2018

我在 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 的所有記錄。或者設置一個同步這些資訊的日常工作。

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