当前位置: 首页 > 面试题库 >

主键排序

公德明
2023-03-14
问题内容

表是由其主键本质上排序的吗?如果我有一个在BigInt标识列上具有主键的表,我可以相信查询将始终返回按键排序的数据,还是我明确需要添加“ ORDER
BY”。性能差异很大。


问题答案:

数据通过聚簇索引进行物理存储,聚簇索引通常是主键,但不一定是主键。

如果没有ORDER BY子句,则不能保证SQL中的数据具有顺序。当您需要按特定顺序排列数据时,应始终指定ORDER
BY子句。如果表已经按照这种方式排序,那么优化器将不会做任何额外的工作,因此在其中放置表不会有任何危害。

如果没有ORDER
BY子句,则RDBMS在等待从磁盘读入记录时可能会返回与您的查询匹配的缓存页面。在这种情况下,即使表上有索引,数据也可能不会以索引的顺序出现。(请注意,这只是一个示例-
我不知道,甚至不认为现实世界中的RDBMS会做到这一点,但这对于SQL实现来说是可以接受的。)

编辑

如果排序时对性能的影响与不排序时对性能的影响有关,则可能是在没有索引(聚集或其他)的一列(或一组列)上进行排序。鉴于这是一个时间序列,您可能基于时间进行排序,但是聚簇索引位于主要bigint上。SQL
Server不知道两者的增长方式相同,因此必须采取一切措施。

如果时间列和主键列是按顺序关联的(当且仅当另一个增加或保持相同时,一个才会增加),请改为按主键进行排序。如果它们不是这种关系,则将聚簇索引从主键移至要作为排序依据的任何列。



 类似资料:
  • 问题内容: 某些SQL Server允许使用通用语句,例如。我认为这不适用于MySQL,是否有任何这样的解决方法可以跨多个表进行自动选择,还是需要使用查询查询来确定主键? 我一直在解决的方法是在运行查询之前调用。有更有效的方法吗?在选择过程中,MySQL可以确定表的主键吗? 更新: 正如Gordon所指出的那样,通常在MySQL或SQL中没有官方的方式来执行此操作。SAP具有自定义功能。有一些解决

  • 我有一个带有主键和排序键的表;因为这是一个复合键,所以我有多个主键与不同的排序键映射。 如何获取与特定主键关联的所有排序键? 我尝试使用“Get”操作,但这似乎也需要排序键(尽管我正在寻找这些键)。我还研究了“BatchGet”操作,但这是针对多个不同的键,而不是针对具有多个不同排序键的单个主键。 我也尝试过“查询”,但没有成功,但我对这一点了解较少,所以这可能就是解决方案——是这样吗?我还知道,

  • 我有一个带有自动增量主键列和datetime列的表。我想返回按创建日期排序的行。 我按日期或主键订购有关系吗?我想这是一个更快的by主键,而不是日期格式或时间戳。新记录将具有更大的主键。然而,每个人都按日期字段排序。

  • 问题内容: 我有一个带有自动递增主键的MySQL表。我删除了表中间的一些行。例如,现在在ID列中有类似的内容:12、13、14、19、20。我删除了15、16、17和18行。 我想重新分配/重置/重新排序主键,以便保持连续性,即将19设为15,将20设为16,依此类推。 我该怎么做? 问题答案: 您可以删除主键列并重新创建它。然后应按顺序重新分配所有ID。 但是,在大多数情况下,这可能不是一个好主

  • 我正在使用Node。js和DynamoDB JavaScript SDK开发。 我有一个表,它使用“ID”作为分区键(散列键),使用“time”作为排序键(范围键)。我想从多分区密钥中获取最新的N个数据。 我可以使用Query从分区键获取最新的N个数据。 但我不知道如何从多分区密钥中获取最新的N个数据。如果我想从10个分区键获取数据,我应该查询10次吗?

  • 键被作为每个实体实例主要唯一标识。当使用的是关系数据库时,键被映射为主键这个概念。你还可以将唯一标识配置为非主键(详见 替代键(备用关键字))。 惯例 按照惯例,名为 Id 或者 <当前类型名称>Id 的属性都将被配置为实体的键。 class Car { public string Id { get; set; } public string Make { get; set; }