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