篩選索引 (filtered indexes)
- 篩選索引是一種索引,它只包含表中的部分資料列。
- 篩選索引可以定義索引的範圍,以便只包含表中的部分資料列。
- 篩選索引可以提高查詢效能,減少索引的大小,並改善索引的維護效率。
以上是 copilot 自已寫的,白話一點就是建立索引時,這個索引不是含蓋全部的資料,只針對符合條件的資料才建立索引。
例如下面範例,依 OrderDate 欄位建立一個索引,但這個索引只對 IsValid=1 的資料做索引,這樣可以減少索引的大小,提高查詢效能。
建立篩選索引
CREATE NONCLUSTERED INDEX [IX_Orders_OrderDate_Isvalid]
ON [dbo].[Orders] ([OrderDate] ASC)
WHERE (IsValid = 1)
唯一篩選索引 (unique filtered indexes)
有時候我們需要限定某個欄位,只有在特定條件時,才需是唯一的,這時候就可以使用唯一篩選索引
。 例如 Order 資料表的 OrderId 欄位,若我們希望,當這個欄位有值的時候,它必須是唯一的,但若是 NULL 時則不限定,則可以這麼做:
CREATE UNIQUE NONCLUSTERED INDEX [IX_Orders_OrderId]
ON [dbo].[Orders] ([OrderId] ASC)
WHERE [OrderId] IS NOT NULL ;
另外,這類問題,也可以透過 Trigger 來處理,在資料新增前,判斷唯一的條件值是否存在,若已經存在,再產生 Exception 即可。
CREATE TRIGGER Check_OrderId ON [dbo].[Orders]
AFTER INSERT,UPDATE
AS
BEGIN
Declare @OrderId varchar(10) =null;
Select @OrderId=OrderId FROM inserted
IF (@OrderId is not null)
BEGIN
IF EXISTS(Select OrderId FROM Orders Where OrderId=@OrderId)
BEGIN
Throw 50001, 'Duplicate OrderId', 1;
END
END
END