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

对列的索引进行聚簇索引保证根据该列返回已排序的行[重复]

狄凯
2023-03-14
问题内容

这个问题已经在这里有了答案

SELECT查询是否总是以相同顺序返回行?具有聚集索引的表
(1个答案)

6年前关闭。

对于这个有争议的问题,我无法得到明确的答案。 MSDN文档中提到

聚类

  • 聚集索引根据它们的键值对数据行进行 排序 并将其存储在表或视图中。这些是索引定义中包括的列。只能有一个每个表的聚集索引,因为数据行本身可以 进行排序 在只有一个订单。

  • 表中的数据行唯一 排序 顺序存储的时间是表包含聚簇索引时。当表具有聚簇索引时,该表称为聚簇表。如果表没有聚集索引,则其数据行将存储在称为堆的无序结构中。

虽然我看到了大多数答案

  • SELECT查询是否总是以相同顺序返回行?具有聚集索引的表
  • http://sqlwithmanoj.com/2013/06/02/clustered-index-do-not-guarantee-physically-ordering-or-sorting-of-rows/

回答是否定的。

它是什么 ?


问题答案:

只是要清楚。大概是在谈论一个简单的查询,例如:

select *
from table t;

首先,如果表上的所有数据都放在一个页面上,并且表上没有其他索引,那么我很难想象这样一种情况,即结果集不是由主键排序的。但是,这是因为我认为最合理的查询计划将需要全表扫描,而不是因为SQL或SQL
Server中有任何记录或其他要求。没有显式的order by,结果集中的排序是查询计划的结果。

这成为问题的核心。当您谈论结果集的顺序时,您实际上是在谈论查询计划。而且,假设按主键排序实际上意味着您假设查询使用全表扫描。具有讽刺意味的是,人们在没有真正理解“为什么”的情况下做出了假设。此外,人们倾向于从小例子中概括(好的,这是人类智能基础的一部分)。不幸的是,他们一致地看到,对小表进行简单查询的结果集始终按主键顺序排列,并普遍适用于较大的表。在此示例中,归纳步骤不正确。

有什么可以改变的呢?临时而言,我认为如果满足以下条件,则全表扫描将按主键顺序返回数据:

  • 单线程服务器。
  • 单个文件文件组
  • 没有竞争指标
  • 没有表分区

我并不是说这总是对的。在这种情况下,这样的查询从表的开头开始使用全表扫描似乎很合理。

即使在一张小桌子上,您也会得到惊喜。考虑:

select NonPrimaryKeyColumn
from table

查询计划可能会决定使用索引table(NonPrimaryKeyColumn)而不是进行全表扫描。结果不会由主键排序(除非偶然)。我显示此示例是因为索引可以用于多种用途,而不仅仅是过滤order bywhere筛选。

如果您使用数据库的多线程实例,并且表的大小合理,则可以快速了解结果,而无需进行order by明确的排序。

最后,SQL Server有一个非常聪明的优化器。我认为order by在查询中不愿使用,因为用户认为它会自动进行排序。SQL
Server努力寻找最佳查询执行计划。如果它认识到order by由于计划的其余部分而多余,那么order by它将不会导致排序。

并且,当然,您想保证结果的顺序,这是您order by最外层查询所需要的。甚至像这样的查询:

select *
from (select top 100 t.* from t order by col1) t

不保证结果在最终结果集中排序。您确实需要执行以下操作:

select *
from (select top 100 t.* from t order by col1) t
order by col1;

以保证结果按特定顺序排列。这种行为 记录在这里。



 类似资料:
  • 问题内容: 对于这个有争议的问题,我无法得到明确的答案。 MSDN文档中提到 聚类 聚集索引根据它们的键值对数据行进行 排序 并将其存储在表或视图中。这些是索引定义中包括的列。只能有一个每个表的聚集索引,因为数据行本身可以 进行排序 在只有一个订单。 表中的数据行唯一 按排序 顺序存储的时间是表包含聚簇索引时。当表具有聚簇索引时,该表称为聚簇表。如果表没有聚集索引,则其数据行将存储在称为堆的无序结

  • 我有一个这种格式的数据框 我希望使用数据帧操作获得基于行的特定值的所有(索引、列)对。所有(索引、列、行值)对都是唯一的。 我研究了这个问题:pythonic方法获取索引,column for value==1 虽然这个问题和我的问题完全一样,但这个问题的答案有点模糊,我无法根据这些答案得到我想要的。 我也看过类似的: a) 从数据框中选择特定索引、列对 b) Python:获取与特定值匹配的行的

  • 主要内容:一、索引的种类及常用术语,二、聚簇索引,三、InnoDB索引的数据结构,四、源码,五、总结一、索引的种类及常用术语 索引种类有很多种,象前面提到的聚集索引和非聚集索引(聚集和聚簇等同),还有多个条目生成的联合索引,非聚集索引又可以叫做二级索引,辅助索引(其它还有什么普通索引,唯一索引,全文索引都可以通过看具体的上下文场景来明白怎么回事),还有一些数据库默认在主键上建立主键索引,一般来说,一个数据库只有一个聚集索引,一个主键索引。 本篇主要分析取簇索引,一般来说,索引的深度不会超过4层,

  • 目前,我有一个名为的,看起来像这样,其中几何体表示一个点(纬度、经度)。 给定另一个点(lat,long),我想找到从这个数据框到那个特定点的最近点。我用距离函数计算了最近的点 现在我有一个系列,看起来像这样 我怎样才能得到一个Geodataframe的副本,它按相同的顺序排序,如下所示?谢谢

  • 本文向大家介绍详解MySQL 聚簇索引与非聚簇索引,包括了详解MySQL 聚簇索引与非聚簇索引的使用技巧和注意事项,需要的朋友参考一下 1、聚集索引 表数据按照索引的顺序来存储的,也就是说索引项的顺序与表中记录的物理顺序一致。对于聚集索引,叶子结点即存储了真实的数据行,不再有另外单独的数据页。 在一张表上最多只能创建一个聚集索引,因为真实数据的物理顺序只能有一种。 从物理文件也可以看出 InnoD

  • 问题内容: 我需要对列表进行排序,然后返回带有列表中已排序项目索引的列表。例如,如果我要排序的列表是,则需要返回。 这个问题以字节为单位发布,但我认为我会在这里重新发布。 http://bytes.com/topic/python/answers/44513-sorting-list-then-return-index- sorted-item 我的具体需求是根据对象的属性对对象列表进行排序。然后