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 / 问题 / 1632
Accepted
kacalapy
kacalapy
Asked: 2011-03-09 12:17:23 +0800 CST2011-03-09 12:17:23 +0800 CST 2011-03-09 12:17:23 +0800 CST

显式生成唯一 ID 的标识列或 UDF?

  • 772

我正在辩论是否更好地PRIMARY KEY使用Identity Columns,我们使用显式生成唯一 ID 的 UDF。

  • 我正在为身份列争论。
  • 他声称,我的伙伴正在争论手动生成值
    • 通过将 UDF 放在另一个可以有 UDF 的表上
      • 锁定资源
      • 增加一个 ID 表,其中一个字段ID_Value由1
      • 将此用作全局唯一标识符
    • 或者让表格id+1在插入时执行
    • 在没有识别约束的服务器和/或环境之间移动数据更简单;从一个有数据的数据库移动到另一个类似的数据库,比如说暂存或虚拟数据。对于非生产环境中的测试,我们可能希望将昨天的所有记录拉下来进行测试。

哪种实现更有意义?

sql-server sql-server-2005
  • 8 8 个回答
  • 3166 Views

8 个回答

  • Voted
  1. Best Answer
    gbn
    2011-03-09T12:20:36+08:002011-03-09T12:20:36+08:00

    你的同事是个白痴。

    该解决方案将不可扩展,UDF 不是并发的(与此相同的原因)。以及如何处理多行插入:这需要每行调用一次 UDF

    并且迁移到其他 RDBMS 在现实生活中并不经常发生……您现在最好不要使用 SQL Server,而在 Oracle 上使用序列,希望您不要迁移。

    编辑:

    您的更新声明移动数据用于刷新非生产数据库。

    在这种情况下,刷新时会忽略标识列。你不会为了让非产品加载更容易而牺牲你的实现。或者使用临时表来跟踪标识值的变化。

    或者使用流程:我们每天晚上从生产中更新我们的测试系统,这完全避免了这个问题。(并确保我们的产品备份也可以恢复)

    • 21
  2. mrdenny
    2011-03-09T12:29:24+08:002011-03-09T12:29:24+08:00

    使用标识值。生成自己的序列表和序列值会占用大量开销,并在尝试生成数字时导致大量锁定和阻塞。

    身份存在是有原因的,使用它。

    当 SQL Denali 出现时,它将支持比身份更有效的序列,但您无法自己创建更高效​​的东西。

    至于将记录从一个环境移动到另一个环境,要么在插入时打开 IDENTITY_INSERT,要么选中 SSIS 中的框。

    • 11
  3. Mark Byers
    2011-03-09T12:20:40+08:002011-03-09T12:20:40+08:00

    身份列对我来说听起来不错。我不确定我是否遵循关于为什么难以在服务器之间移动数据的逻辑。

    如果您确实希望每一行都具有全局唯一标识,则可以使用 UUID,但除非您确定全局唯一性是必要的,否则我不会这样做 - 通常不是。使用 UUID 作为 id 会降低性能,增加磁盘空间需求并使调试变得更加困难 - 因为 UUID 的长度很难记住,很难通过电话告诉别人,或者把它写在纸上而不会出错。

    • 5
  4. RacerX
    2011-03-09T12:19:45+08:002011-03-09T12:19:45+08:00

    对于简单的数字 ID,只需使用身份即可,忘记手动生成它们的所有问题。

    您始终可以创建一个使用身份作为 PK 并具有类型列和任何其他信息的“超级表”。当您需要一个新 ID(假设您的意思是跨不同表的唯一 ID)时,只需插入此表并抓取SCOPE_IDENTITY()然后插入您需要的实际表中。

    基本上,您创建一个表:具有标识 PK 的MasterID,当您需要在 Table1 中插入一行时,INSERT INTO MasterIDs使用该行生成的标识,然后使用该值作为 PKSCOPE_IDENTITY()插入Table1 。

    Table1将有一个非身份的 int PK。您将执行相同的过程来插入 Table2 等。让 SQL Server 管理MasterIDs表中的标识值,然后您可以在其他表中使用它。 MasterID可以包含其他表,例如类型(因此您可以知道哪个表、Table1 或 Table2 等使用该标识值。

    • 4
  5. Joe Phillips
    2011-03-09T12:19:18+08:002011-03-09T12:19:18+08:00

    只要您正确使用外键约束(级联、更新等),那么您就可以使用标识字段。在这种情况下,我真的没有看到其他解决方案的优势。

    • 3
  6. Silx
    2011-03-09T12:23:07+08:002011-03-09T12:23:07+08:00

    身份是根据您的情况制作的。您拥有用于服务器/环境数据交换的复制等工具,可以将它们保持在一起。

    • 2
  7. Mark
    2015-09-30T01:37:29+08:002015-09-30T01:37:29+08:00

    我刚刚完成了一项工作,我identity用一个普通int字段替换了一个 SQL Server 列,并自己控制了 Id 分配。

    我已经看到了相当可观的性能提升。与 OP 不同,我没有 UDF 来生成 id。但原理几乎相同:软件的一部分维护了一个 id 池。当它们用完时,它会通过查询数据库获取下一个Low值并将其增加到下一个High来获得另一批。

    这允许我们在将批次提交到数据库之前生成 ID 并关联 ORM 中事务之外的所有实体,并且还可以提交更大的批次而无需额外的往返来获取刚刚插入的身份(身份列需要)。

    在 id 表中,我们有不止一行,如果我们愿意,我们可以使用特定的范围。即用于重用已删除的块和负ID。

    • 1
  8. Hrvoje Batrnek
    2019-02-18T01:32:09+08:002019-02-18T01:32:09+08:00

    我多年来一直在使用身份,并认真考虑用 UNIQUEIDENTIFIER 替换身份号码。如果有人将其设计为紧凑型数据库,则需要更改数据类型是一场噩梦,如果您需要将身份添加到列中,那将是一场噩梦,而且您无法更新身份列。想象一下,你放了一个 int 并且你的数据库增长到超过 20 亿条记录,这又是改变的噩梦(考虑 FK)!改变任何有身份的东西都是一场噩梦,除非你放 bigint,否则对规模不友好!UNIQUEIDENTIFIER vs Identity = 便利性和稳健性 vs 可能显着的性能改进(没有做基准测试)。

    更新:在我看到这个之后,我肯定倾向于 UNIQUEIDENTIFIER。这表明 bigint 身份没有真正的好处,而 UNIQUEIDENTIFIER 有很多好处!不同版本的 SQL Server 可能会产生不同的结果。在所有数据库和系统中拥有一个唯一的 id 就是一种美(健壮性)!随心所欲地移动、复制、转换数据! https://www.mssqltips.com/sqlservertip/5105/sql-server-performance-comparison-int-versus-guid/

    • 0

相关问题

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

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

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

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

  • 从 SQL Server 2008 降级到 2005

Sidebar

Stats

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

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

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

    • 4 个回答
  • Marko Smith

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

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +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
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +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