Sql 当Guid是聚集索引时,按Guid搜索表是否更快?

Sql 当Guid是聚集索引时,按Guid搜索表是否更快?,sql,guid,clustered-index,Sql,Guid,Clustered Index,如果我要按Guid查询一个表(不考虑Guid的碎片问题),将Guid作为聚集索引而不是非聚集索引或根本没有索引会更快吗 这个问题是从只读的角度提出的。我只是好奇在搜索特定Guid的行之间是否会有速度的提高,在有/没有索引或有/没有聚集索引的情况下,搜索是否会更快完成 或者,我对下一个问题的答案相当肯定,但现在将int标识符应用于上一个问题。如果表是按该int聚集的,搜索会更快吗?(这不是由表中的其他项目聚集的?) 我知道在这个话题上还有很多其他问题,但我还没有找到我想要的具体答案:

如果我要按Guid查询一个表(不考虑Guid的碎片问题),将Guid作为聚集索引而不是非聚集索引或根本没有索引会更快吗

这个问题是从只读的角度提出的。我只是好奇在搜索特定Guid的行之间是否会有速度的提高,在有/没有索引或有/没有聚集索引的情况下,搜索是否会更快完成

或者,我对下一个问题的答案相当肯定,但现在将int标识符应用于上一个问题。如果表是按该int聚集的,搜索会更快吗?(这不是由表中的其他项目聚集的?)




我知道在这个话题上还有很多其他问题,但我还没有找到我想要的具体答案:





谢谢你的帮助

使用整数聚集索引查询表肯定比使用GUID索引更快。原因是数据类型的大小

如果您已经决定使用Guid作为键,那么可能会使用newSequentialId()而不是NewId()生成这些Guid,因为这将减少Guid索引中碎片化的影响,因为id始终在增加,并且进行页面分割的机会也会减少


补充我的观点,将其作为聚集索引是一个自然的选择,除非您有聚集索引的潜在候选对象,即如果您使用此guid不是出于关键目的。如果它是一个相对较小的表,您可以选择不使用索引,否则最好使用索引。

使用整数聚集索引查询表肯定会比使用GUID索引更快。原因是数据类型的大小

如果您已经决定使用Guid作为键,那么可能会使用newSequentialId()而不是NewId()生成这些Guid,因为这将减少Guid索引中碎片化的影响,因为id始终在增加,并且进行页面分割的机会也会减少


补充我的观点,将其作为聚集索引是一个自然的选择,除非您有聚集索引的潜在候选对象,即如果您使用此guid不是出于关键目的。如果它是一个相对较小的表,您可以选择不使用索引,否则最好使用索引。

假设使用MS SQL Server。这可能适用于也可能不适用于其他RDBMS:

如果您有一个聚集索引,那么它将是最快的,尽管如果您搜索的是一行,那么它与非聚集索引之间的差异可以忽略不计。使用非聚集索引时,服务器需要首先在索引中找到正确的值,然后从表存储中获取完整记录。表存储是聚集索引,因此通过聚集索引进行搜索可以消除这一步骤(称为书签查找),但这一步骤对于单行几乎是不可察觉的

当聚集索引位于按范围选择的列上(例如,事务日期和您希望查找上个月的所有事务)时,聚集索引往往为读取提供更大的优势。在这种情况下,服务器可以找到起始点,并在一次快速、连续的扫描中读取数据


在INT上使用非聚集索引(所有其他条件都相同)将比使用GUID稍微快一些,因为索引本身将更小(因为INT比GUID小得多),这意味着服务器必须遍历更少的页面才能找到它希望获得的值。对于聚集索引,如果行大小与GUID和INT之间的差异已经很大,我认为您不会看到太大的差异,但是我没有对此进行任何测试。

假设使用MS SQL Server。这可能适用于也可能不适用于其他RDBMS:

如果您有一个聚集索引,那么它将是最快的,尽管如果您搜索的是一行,那么它与非聚集索引之间的差异可以忽略不计。使用非聚集索引时,服务器需要首先在索引中找到正确的值,然后从表存储中获取完整记录。表存储是聚集索引,因此通过聚集索引进行搜索可以消除这一步骤(称为书签查找),但这一步骤对于单行几乎是不可察觉的

当聚集索引位于按范围选择的列上(例如,事务日期和您希望查找上个月的所有事务)时,聚集索引往往为读取提供更大的优势。在这种情况下,服务器可以找到起始点,并在一次快速、连续的扫描中读取数据


在INT上使用非聚集索引(所有其他条件都相同)将比使用GUID稍微快一些,因为索引本身将更小(因为INT比GUID小得多),这意味着服务器必须遍历更少的页面才能找到它希望获得的值。对于聚集索引,如果行大小与GUID和INT之间的差异已经很大,我认为您不会看到太大的差异,但是我没有对此进行任何测试。

就像Tom已经提到的那样,在聚集索引上搜索单个元素的速度会更快。这是因为聚集索引是数据本身,在找到索引项后不需要查找

聚集索引的主要优点是能够提取数据的“范围”(如“上周”或“按日期排序的订单历史”)。由于GUID倾向于均匀分布在表上,因此在这里您将无法获得此好处。此外,每个表只能有一个聚集索引,因此请仔细挑选

如果您对一个特定的范围最常查询表,则将其视为群集I。