Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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_Indexing_Clustered Index - Fatal编程技术网

Sql 带聚集索引的原始插入顺序

Sql 带聚集索引的原始插入顺序,sql,indexing,clustered-index,Sql,Indexing,Clustered Index,我有一个关于聚集索引的问题 在聚集索引中,叶级节点本身按排序顺序保存数据,对吗 也就是说,在每次插入/更新/删除时,节点都会重新排列以保持排序顺序 那么,如何按照数据插入的顺序从中检索数据呢 假设以下数据按给定顺序插入:1,7,4,5,2,并在此字段上创建聚集索引 因此,数据将以1,2,4,5,7的顺序存储在内部,对吗 因此,这可能有助于更快地查找特定值,但如果用户希望按插入顺序查找前3个值,该怎么办 它们是可以检索的,还是我必须为插入的每一行分配一个增量id,在该行上声明一个非聚集索引,并根据

我有一个关于聚集索引的问题

在聚集索引中,叶级节点本身按排序顺序保存数据,对吗

也就是说,在每次插入/更新/删除时,节点都会重新排列以保持排序顺序

那么,如何按照数据插入的顺序从中检索数据呢

假设以下数据按给定顺序插入:
1,7,4,5,2
,并在此字段上创建聚集索引

因此,数据将以
1,2,4,5,7
的顺序存储在内部,对吗

因此,这可能有助于更快地查找特定值,但如果用户希望按插入顺序查找前3个值,该怎么办


它们是可以检索的,还是我必须为插入的每一行分配一个增量id,在该行上声明一个非聚集索引,并根据对该id字段上的记录进行排序来提供前3条记录的数据?

听起来你想给我一个行上的时间戳。我通常将以下列放在我创建的所有表上(用于审核):


通过这些列,您可以知道是谁创建了行,以及何时、何时、由谁最后修改了行,还可以通过将deleted设置为true来“软删除”行。当然,您在系统中的所有其他查询都必须检查删除的布尔值,以使软删除生效。

听起来您想在行上给我一个时间戳。我通常将以下列放在我创建的所有表上(用于审核):

通过这些列,您可以知道是谁创建了行,以及何时、何时、由谁最后修改了行,还可以通过将deleted设置为true来“软删除”行。当然,系统中的所有其他查询都必须检查删除的布尔值,以使软删除生效。

(基于SQL Server的答案-问题没有100%指定)

在聚集索引中,叶级节点本身按排序顺序保存数据,对吗

这并不完全正确,数据可以以任何顺序存储在叶子上,但页面上的插槽数组实际上是从页面外读取数据的顺序,而不是数据的物理顺序

也就是说,在每次插入/更新/删除时,节点都会重新排列以保持排序顺序

节点(例如,页面被拆分,双链接列表上的前向/后向指针发生更改),但在页面内部,插槽数组仍然是保留顺序的实体,行本身不会被洗牌以匹配插槽数组顺序

那么,如何按照数据插入的顺序从中检索数据呢

通常情况下,不能保证它的顺序是准确的——这往往更多地发生在堆页面上,其中插槽数组更能代表顺序,但同样不能保证

假设以下数据按给定顺序插入:1,7,4,5,2,并在此字段上创建聚集索引。所以数据将以1,2,4,5,7的顺序存储在内部,对吗

否,它将存储在页面上的1,7,4,5,2,但插槽阵列将读取页面上的地址为7,5,4,2,1(它是从页面末尾向后构造的,因此您可以反向读取)

因此,这可能有助于更快地查找特定值,但如果用户希望按插入顺序查找前3个值,该怎么办

在这种情况下是无关紧要的——除了没有关于排序的保证之外,SQL将把整个页面读入内存。如果您想更多地了解这种级别的SQL内部构件,我仍然推荐Kalen Delaneys的SQL内部构件书作为最佳来源之一

如果您想了解有关插入顺序的任何信息,我建议使用某种插入的时间戳(答案基于SQL Server-问题没有100%指定)

在聚集索引中,叶级节点本身按排序顺序保存数据,对吗

这并不完全正确,数据可以以任何顺序存储在叶子上,但页面上的插槽数组实际上是从页面外读取数据的顺序,而不是数据的物理顺序

也就是说,在每次插入/更新/删除时,节点都会重新排列以保持排序顺序

节点(例如,页面被拆分,双链接列表上的前向/后向指针发生更改),但在页面内部,插槽数组仍然是保留顺序的实体,行本身不会被洗牌以匹配插槽数组顺序

那么,如何按照数据插入的顺序从中检索数据呢

通常情况下,不能保证它的顺序是准确的——这往往更多地发生在堆页面上,其中插槽数组更能代表顺序,但同样不能保证

假设以下数据按给定顺序插入:1,7,4,5,2,并在此字段上创建聚集索引。所以数据将以1,2,4,5,7的顺序存储在内部,对吗

否,它将存储在页面上的1,7,4,5,2,但插槽阵列将读取页面上的地址为7,5,4,2,1(它是从页面末尾向后构造的,因此您可以反向读取)

因此,这可能有助于更快地查找特定值,但如果用户希望按插入顺序查找前3个值,该怎么办

在这种情况下是无关紧要的——除了没有关于排序的保证之外,SQL将把整个页面读入内存。如果您想更多地了解这种级别的SQL内部构件,我仍然推荐Kalen Delaneys的SQL内部构件书作为最佳来源之一


如果您想了解有关插入顺序的任何信息,我建议使用某种插入的时间戳,表数据将根据聚集索引的顺序进行排序。 如果要按插入顺序检查前3个值,则每个表上只能有一个聚集索引

使用冒险作品

timecreated
timemodified
createdby
modifiedby
deleted