我有一个这样的表:
CREATE TABLE
dbo.DiscountBarcodeList
(
ID int NOT NULL IDENTITY
CONSTRAINT PK_DiscountBarcodeList
PRIMARY KEY CLUSTERED
, Discount int NOT NULL
CONSTRAINT FK_DiscountBarcodeList_Discount
FOREIGN KEY REFERENCES dbo.Discount (ID)
, CodeNumber int NOT NULL
, AssignedEntity int NULL
CONSTRAINT FK_DiscountBarcodeList_AssignedEntity
FOREIGN KEY REFERENCES dbo.Entity (ID)
ON DELETE SET NULL
, BarcodeID AS
CONVERT(
char(10)
, CAST(Discount AS binary(2)) + CAST(CodeNumber AS binary(3))
, 2)
, CONSTRAINT UQ_DiscountBarcodeList_DiscountCodeNumber
UNIQUE NONCLUSTERED
(
Discount ASC
, CodeNumber ASC
)
);
该表将保存预先CodeNumber
分配给 s 的 s并根据需要分配给 s。虽然不是在数据库级别,但和的值将分别限制为 2 字节和 3 字节。这些限制与 的唯一约束一起,将有效地使生成的值也唯一。Discount
Entity
Discount
CodeNumber
(Discount, CodeNumber)
BarcodeID
该表的使用方式是,应用程序将传递 a@BarcodeID
来查找 an@Entity
以分配给它。如果查找成功,则该行将Entity
被设置为@Entity
,或者应用程序将收到通知,该行@BarcodeID
已被采用,大致如下:
BEGIN TRANSACTION;
UPDATE
SET
@OldEntity = Entity
, Entity = @Entity
WHERE
BarcodeID = @BarcodeID
;
IF @OldEntity IS NULL
BEGIN
COMMIT TRANSACTION;
... /* report success */
END
ELSE
BEGIN
ROLLBACK TRANSACTION;
... /* report failure */
END;
现在我想做BarcodeID
sargable。因为我知道该列只有唯一值,所以我正在考虑使索引唯一,因为我认为这可以使我的查找更有效。另一方面,我担心必须检查生成的值的唯一性,这在这里是多余的,因为唯一性已经得到保证。
是否有可能以某种方式判断计算列上唯一索引的好处(如果有的话)是否会超过(在这种情况下不必要的)唯一性检查的可能开销?或者至少对于像我这样的场景可以确定这一点吗?或者我只是想太多了?