我有以下查询。
DataStaging
是一个有 1000 万行的大表。
Product i
一个较小的表有 1000 行。
我们需要使用 找到product_id
并且桌子上ref
有两个,所以必须加入表格两次。ref (ref1,ref2)
Product
UPDATE dbo.DataStaging
SET ProductId = COALESCE(Ref1_Pid, Ref2_Pid, 0)
FROM dbo.DataStaging s
LEFT JOIN ( SELECT id [Ref1_Pid] ,
Ref1
FROM dbo.Product
WHERE isActive = 1
) p1 ON s.[Ref] = p1.Ref1
LEFT JOIN ( SELECT id [Ref2_Pid] ,
Ref2
FROM dbo.Product
WHERE IsActive = 1
) p2 ON s.[Ref] = p1.Ref2
WHERE s.TypeId = 1
AND s.StatusId = 2
这是产品表 PK_Product 上的主键,我可以随意添加 Non_Clustered Index。
(1) 三个索引:NC_index on (IsActive), NC_Index on (Ref1), NC_Index on (Ref2)
(2) 两个复合索引:NC_Index on (IsActive, Ref1), NC_Index on (IsActive, Ref2)
(3) 一个复合索引:NC_Index on (IsActive, Ref1, Ref2)
对于 (1) 它使用主键 PK_Product 扫描表,而不是 NC 索引。
对于 (2),它对每个索引使用 NC_index 扫描。
对于 (3) 它在同一索引上使用 NC_index 扫描,但行大小是 (2) 的两倍
结果,性能 (2) > (3) > (1)
我的问题是,
为什么 (1) 不扫描 NC 索引?
如果我创建像 (2) 或 (3) 这样的索引有什么缺点?
假设上面的查询是最繁重的过程Product
,但是有数百个stored procs
使用不同条件的product
表的select
语句。where
即使上述查询的性能是(2)>(3),(2)仍然比(3)更好吗?
(暂时忽略 dataStaging 上的索引)