Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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 主键排序_Sql_Sql Server_Indexing - Fatal编程技术网

Sql 主键排序

Sql 主键排序,sql,sql-server,indexing,Sql,Sql Server,Indexing,表本质上是按主键排序的吗?如果我在BigInt标识列上有一个主键为主键的表,我可以相信查询将始终返回按键排序的数据,还是我需要显式地添加“orderby”。性能差异很大。数据通过聚集索引进行物理存储,聚集索引通常是主键,但不一定是主键 如果没有ORDERBY子句,则不能保证SQL中的数据具有order。当需要数据处于特定顺序时,应始终指定ORDERBY子句。如果表已经按这种方式排序,那么优化器将不会做任何额外的工作,因此将它放在那里没有什么害处 如果没有ORDERBY子句,RDBMS可能会在等待

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

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

如果没有ORDERBY子句,则不能保证SQL中的数据具有order。当需要数据处于特定顺序时,应始终指定ORDERBY子句。如果表已经按这种方式排序,那么优化器将不会做任何额外的工作,因此将它放在那里没有什么害处

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

编辑

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


如果时间列和主键列是按顺序关联的(当且仅当另一个增加或保持不变时,一个增加),则改为按主键排序。如果它们不以这种方式关联,请将聚集索引从主键移动到您排序所依据的任何列。

在SQL Server中:不,通过它是聚集键——默认为主键,但不必相同

主键的主要功能是唯一地标识表中的每一行,但它本身并不意味着任何(物理)排序

不确定其他数据库系统


Marc

这可能是特定于实现的,但默认情况下MySQL似乎是按主键排序的。但是,任何时候,如果您需要保证以某种方式对行进行排序,则应添加ORDER BY。

默认情况下,表不是“聚集的”,即按主键组织。您可以选择这样指定它。因此,默认值是“堆”(没有特定的顺序),您要寻找的选项是“集群”(SQL Server,在Oracle中称为IOT)

  • 一个表只能有一个集群(有意义)
  • 在DDL上使用主键聚集语法
  • Order by PK仍然需要在SELECTS上发布,它被聚集的事实将导致查询运行更快,因为优化器计划将知道它不需要在聚集索引上进行排序
前面的海报是正确的,SQL(及其理论基础)明确地将select定义为无序集/元组


SQL通常试图停留在逻辑领域,而不是对数据的物理组织/位置等进行假设。集群选项允许我们在实际情况下这样做。

几乎每次它都会按表标识进行排序。它确实按聚集索引排序,可能并不总是按标识排序,但我从未见过它在选择*时不按标识id排序。没有指定订单的原因是什么?我不明白为什么它会导致性能上的差异。

没有明确的排序依据,就没有默认的排序顺序。一个非常常见的问题。因此,有一个固定的答案:


您能详细说明为什么“性能差异显著吗?”

您必须按申请订单以保证订单。如果您注意到性能差异,则可能是由于未按排序而未对数据进行排序,否则SQL Server一定表现不好,因为它没有意识到数据已排序。在已经排序的数据上添加
ORDER BY
不应导致性能损失,因为RDBMS应该足够智能,能够实现数据的顺序。

仅当主键也是集群键时,默认情况下,主键也是集群键,但不必是……。第一段应该说“数据是通过聚集索引进行物理存储的……”Welbog说的所有其他内容都适用——仅仅因为它是物理存储的(在每个页面中)按顺序并不意味着您将按顺序取回数据。物理磁盘碎片也可能对此产生影响。@Philip Kelley:更改以反映您更好的措辞。谢谢。我实际上是按主键(即BigInt)排序的。数据已按顺序插入(按日期).主键是聚集索引吗?主键是聚集索引,键是ID(BigInt)字段。数据是时间序列,查询将收回数月的数据。如果没有顺序,存储过程可以在几秒钟内开始返回行。使用顺序,在第一行返回之前最长一分钟。您可以尝试选项(FAST 1),链接将不再工作。可能的重复