AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 335663
Accepted
Andriy M
Andriy M
Asked: 2024-02-09 12:59:04 +0800 CST2024-02-09 12:59:04 +0800 CST 2024-02-09 12:59:04 +0800 CST

当贡献列已经是唯一的时,计算列上的唯一索引

  • 772

我有一个这样的表:

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 字节。这些限制与 的唯一约束一起,将有效地使生成的值也唯一。DiscountEntityDiscountCodeNumber(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;

现在我想做BarcodeIDsargable。因为我知道该列只有唯一值,所以我正在考虑使索引唯一,因为我认为这可以使我的查找更有效。另一方面,我担心必须检查生成的值的唯一性,这在这里是多余的,因为唯一性已经得到保证。

是否有可能以某种方式判断计算列上唯一索引的好处(如果有的话)是否会超过(在这种情况下不必要的)唯一性检查的可能开销?或者至少对于像我这样的场景可以确定这一点吗?或者我只是想太多了?

sql-server
  • 1 1 个回答
  • 188 Views

1 个回答

  • Voted
  1. Best Answer
    Paul White
    2024-02-09T13:21:38+08:002024-02-09T13:21:38+08:00

    这是一个只有您才能真正决定的权衡。

    您已经将Split-Sort-Collapse运算符组合添加到任何更新Discount或CodeNumber避免错误的瞬态唯一键违规的计划中。添加唯一索引BarcodeID将添加第二个这样的运算符组合来更新计划,以及一个 Eager Spool 来驱动它们。如果需要的工作表超出服务器的限制,则此类更新也可能会失败并出现错误。这些是主要的缺点。

    从好的方面来说,您可以获得可查找的索引,并可能获得更好的信息供优化器一般使用。您还拥有实际的唯一性保证,而不是稍微模糊的暗示保证。

    就我个人而言,我可能会添加唯一索引并测试工作负载,看看性能影响是否可以忍受。

    相关问答:

    • 具有唯一列的非聚集索引是否总是首先处理过滤该列的所有查询?
    • 更新大小为 5k 的行时出现 8k 行溢出错误
    • 当表上有两个唯一索引且一个索引中的所有列也在另一个索引中时,是否会造成性能损失?
    • 如果复合索引包含主键,我是否应该将其标记为唯一?
    • 7

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve