Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在主键/集群索引中使用guid_Sql Server_Uniqueidentifier_Sql Server Performance - Fatal编程技术网

Sql server 在主键/集群索引中使用guid

Sql server 在主键/集群索引中使用guid,sql-server,uniqueidentifier,sql-server-performance,Sql Server,Uniqueidentifier,Sql Server Performance,我对SQL server性能相当精通,但我始终不得不驳斥这样一种观点,即应该将GUID用作Clusterd主键的默认类型 假设该表每天的插入量相当低(5000+/-行/天),我们会遇到什么样的性能问题?页面拆分将如何影响搜索性能?我应该多久重新编制一次索引(或进行碎片整理)?我应该将填充因子设置为什么(100、90、80等) 如果我每天插入1000000行呢 对于所有这些问题,我深表歉意,但我希望得到一些备份,因为我没有使用guid作为PKs的默认设置。但是,我完全愿意让StackOverflo

我对SQL server性能相当精通,但我始终不得不驳斥这样一种观点,即应该将GUID用作Clusterd主键的默认类型

假设该表每天的插入量相当低(5000+/-行/天),我们会遇到什么样的性能问题?页面拆分将如何影响搜索性能?我应该多久重新编制一次索引(或进行碎片整理)?我应该将填充因子设置为什么(100、90、80等)

如果我每天插入1000000行呢


对于所有这些问题,我深表歉意,但我希望得到一些备份,因为我没有使用guid作为PKs的默认设置。但是,我完全愿意让StackOverflow用户群的过度使用知识改变我的想法。

使用GUID作为主键的缺点:

  • 没有有意义的排序,意味着索引不能像处理整数那样提高性能
  • GUID的大小为16字节,而整数为2、4或8字节
  • 人类很难记住,所以不能作为参考id
优点:

  • 允许显示在网页查询字符串或应用程序中时危险性较小的不可猜测主键
  • 在不提供自动增量或标识数据类型的数据库中很有用
  • 当您需要跨平台或环境在两个完全不同的数据源之间连接数据时,此功能非常有用

我认为是否使用guid的决定非常简单,但可能我不知道其他问题

由于每天的插入量如此之低,我怀疑页面分割是否应该是一个重要因素。真正的问题是5000如何与现有行数进行比较,因为这将是决定适当的初始填充因子以消除拆分所需的主要信息

也就是说,我个人不太喜欢GUIDs。我知道它们在某些情况下可以很好地发挥作用,但在许多情况下,它们只是[在效率、易用性和…]方面的“阻碍”]

我发现以下问题有助于缩小决定是否应使用GUID的范围

  • PK是否会被共享/发布?(也就是说,它是否会在SQL内部使用之外使用,应用程序是否会以某种持久性的方式需要这些密钥 用户不知怎的看到了这些密钥
  • PK是否可以用于帮助合并不同的数据源
  • 该表是否有一个由数据中的列组成的主关键字(可能是复合关键字)?该关键字的大小是多少
  • 主键是如何排序的?如果是复合的,前几列是否有选择性

如果你在做任何类型的卷,guid作为PK bad是非常糟糕的,除非你使用它,因为你描述的确切原因:

在guid和整数之间显示:

插入完成后,当我运行DBCC SHOWCONTIG时,Test1导致了大量的页面分裂,扫描密度约为12%。Test2表的扫描密度约为98%

然而,如果你的音量很低,那就没那么重要了


如果您确实需要一个全局唯一的ID,但容量很大(并且不能使用顺序ID),只需将guid放在索引列中。

使用guid(除非它是顺序guid)因为聚集索引将破坏插入性能。由于物理表布局是根据聚集索引对齐的,因此使用具有随机顺序的guid将导致严重的表碎片。如果要将guid用作PK/聚集索引,则它必须是使用newsequentialid()的顺序guidsql server中的函数。这将保证生成的GUID按顺序排序并防止碎片化。

可能是?的一个副本,非常相似,但我正在寻找一些细节-一些可用于未来awnser搜索者的细节。当数据集或部分数据集可能需要从m来自不同的来源。在以前的一家公司:我们经营儿童保育网络服务,许多都在不同数据库中的公司正在合并并收购另一家。首席开发人员已经决定为PK开发GUI,这使得公司的合并非常简单。然而,在未能通过基准测试b之后,该公司倒闭了y LoadRunner(索引扫描/搜索时100%CPU)。性能糟糕…@NTDLS,是的,我通常不会将非聚集索引设置为GUID,但创建另一列作为GUID,并在其上使用聚集索引,在该场景下是可以的。抱歉,请反转“聚集”、“非聚集”在我之前的演讲中。这个播客包含了一个关于非顺序guid作为主键的问题的很好的对话。为重新出现这个问题道歉,但是上面的链接被破坏了。
                 Average                    Average
                 Fragmentation  Fragment    Fragment   Page     Average 
Type             in Percent     Count       Size       Count    Space Used

id               4.35           7           16.43      115      99.89
newidguid        98.77          162         1          162      70.90 
newsequentualid  4.35           7           16.43      115      99.89