非主键上的 FK

Dev*_*per 3 sql-server

如果我有一个外键指向另一个不是 PK 的表索引字段,是否有任何性能问题/差异?

就像是

DECLARE @T1 TABLE 
(   
    T1_ID INT IDENTITY PRIMARY KEY,    
    T1_SOMEID INT NOT NULL,    
    OfficeID VARCHAR(3) NOT NULL,   
    Data VARCHAR(200) NOT NULL 
);

DECLARE @T2 TABLE 
(   
    T2_ID INT IDENTITY PRIMARY KEY,    
    T1_SOMEID_FK INT NOT NULL,    
    OfficeID VARCHAR(3) NOT NULL,   
    OtherData VARCHAR(100) NOT NULL 
);
Run Code Online (Sandbox Code Playgroud)

问题:
当我运行如下所示的查询时,性能是否会下降:

SELECT t1.T1_ID, t1.Data, t2.T2_ID, t2.OtherData 
FROM @T1 t1 
    INNER JOIN @T2 
       ON t1.T1_SOMEID = t2.T1_SOMEID_FK 
          AND t1.OfficeID = t2.OfficeID
Run Code Online (Sandbox Code Playgroud)

JNK*_*JNK 5

两件事情:

1 - 您仍然需要有一个UNIQUE约束才能使用字段作为外键。

2 - 在您的示例中,您的性能将下降,因为默认情况下 aPK也是聚集索引。FK 字段上的非聚集索引将加快速度,JOIN但您仍需要支付书签查找的费用,因为其他字段不在索引的叶级。如果您INCLUDE(otherdata)在 NC 索引中,那么它应该可以正常工作(假设这ID是您的聚集索引。

  • +1,但是:在 SQL Server 中,FK 也可以引用唯一索引,它不必是唯一约束 (2认同)
  • 唯一索引可以包含列以避免查找。唯一约束不能,并且实际上会使用唯一索引来强制执行约束。所以在这种情况下,没有唯一约束的唯一索引会更好。 (2认同)