Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.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 提高集群索引GUID主键的性能_Sql_Primary Key_Performance_Guid_Clustered Index - Fatal编程技术网

Sql 提高集群索引GUID主键的性能

Sql 提高集群索引GUID主键的性能,sql,primary-key,performance,guid,clustered-index,Sql,Primary Key,Performance,Guid,Clustered Index,我有一个包含大量行(10K+)的表,它的主键是GUID。主键是集群的。此表上的查询性能非常低。请提供有效的建议。您可以尝试顺序GUID,这将使索引更有效。信息。GUID上的聚集索引不是一个好的设计。GUID的本质是随机的,而聚集索引按键对记录进行物理排序。这两件事完全不一致。对于每次插入,SQL都必须对磁盘上的记录重新排序!从此索引中删除群集 当您对数据有一个“自然”顺序时,就需要使用集群:插入的时间、帐号等。对于时间字段,集群几乎是免费的。对于帐号,它可能是免费的或便宜的(当按顺序分配帐号时)

我有一个包含大量行(10K+)的表,它的主键是GUID。主键是集群的。此表上的查询性能非常低。请提供有效的建议。

您可以尝试顺序GUID,这将使索引更有效。信息。

GUID上的聚集索引不是一个好的设计。GUID的本质是随机的,而聚集索引按键对记录进行物理排序。这两件事完全不一致。对于每次插入,SQL都必须对磁盘上的记录重新排序!从此索引中删除群集

当您对数据有一个“自然”顺序时,就需要使用集群:插入的时间、帐号等。对于时间字段,集群几乎是免费的。对于帐号,它可能是免费的或便宜的(当按顺序分配帐号时)


虽然GUID问题可能有技术上的解决方法,但最好的办法是了解何时使用群集。

您需要使用newsequentialid()来代替,请参见此处

请避免为长字符串列创建群集索引。GUID将有36个字符。即使创建了聚集索引,也会降低查询性能。为了更好地实践,请使用整数标识列

您需要分析您的查询。我们只能猜测为什么您的查询在没有查看执行计划的情况下执行得很糟糕(您可以从SQL Server或Oracle轻松地获得执行计划)

考虑到GUID是128位的值(如果原始存储),GUID会将数据和索引块的密度减少50%(对于主键索引),因此请确保GUID是适当的


但这可能不是问题所在,因此请查看查询计划。可能还有其他几个问题。

使用GUID作为主键没有问题。只要确保当您实际将GUID设置为主键时,然后将它自动创建的索引设置为非聚集类型。很多人忘记(或不知道)在SQL Server中执行此操作


切勿对GUID使用聚集索引。这将导致围绕磁盘上的GUID进行物理排序,这显然是毫无意义的(正如其他人已经指出的)

我已经读了很多关于newsequentialid()的书,但它似乎是一个SQL函数,如果GUID是从代码(C#)生成的,谁能告诉我该怎么做-1这个答案与索引的物理集群有什么关系?问这个问题的人已经说他/她有10K+行,他/她可能不想去更改所有的键。Guid是16个字节,而不是36个字符。Kimberly Tripp在她的网站上通过以下链接很好地讨论了大型表的这个问题:。@Josip:我不是指Guid的大小。36字符是GUID的长度。是否从不在GUID上使用聚集索引?这是一个大胆的声明。你确定没有反例吗?如果你知道一个,请说出一个:-)。我看不出有什么理由要围绕GUID进行物理排序。@iInfraser以及围绕磁盘上的GUID进行物理排序将如何提高您的选择速度?每个GUID都应该是“在空间和时间上”解压的,因此与任何其他GUID都不相关。(这假设您没有使用顺序GUID,许多人可能会争辩说,首先不是真正的GUID)。@nashwan您忘记了,如果不在uniqueidentifier PK上使用聚集索引,则会在有关选择、更新和删除操作的某些查询中添加键/RID查找。这并不像你说的那么清楚。当然,我不会在一开始就选择这种设计,但是如果您正在查看现有的设计,那么更改它并不简单。插入性能不是唯一的因素。刺耳的音调+1。这个问题没有太多的灰色地带。不要这样做。可能的重复使其不群集!(如果必须保留为GUID)