改成这样:
(SystemID, IsHidden, EntityID)
. 拥有
IsHidden
之后
这个
EntityID
会让它变得毫无用处
已经是唯一的了。搜索作为示例提供的条件(
WHERE SystemID=@SystemID AND IsHidden=0
IsHidden=0
分布在整个范围内。移动此列
之前
允许更有效的范围扫描。
实体标识符
默认情况下效率低下(
WHERE EntityID=@EntityID
). 您可以通过在
但这只能解决部分问题。大部分问题都将由与其他表的联接引起,如在以下条件下联接的详细信息表:
FROM Master JOIN Detail ON Master.EntityID = Detail.ParentEntityID
随着这些查询变得越来越复杂,候选行的范围也越来越大,在
实体标识符
/
ParentEntityID
the tipping point
基本上被忽略了。如果可能,确保
全部的
这些联接改为指定聚集索引键:
FROM Master JOIN Detail
ON Master.SystemID = Detail.SystemID
AND Master.IsHidden = Detail.IsHidden
AND Master.EntityID = Detail.ParentEntityID
问题是大多数建模工具(如EF或Linq)都倾向于通过逻辑主键(即
实体标识符
)与物理群集密钥相反。