Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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 IBM Db2中的聚集索引和非聚集索引_Sql_Indexing_Db2_Primary Key - Fatal编程技术网

Sql IBM Db2中的聚集索引和非聚集索引

Sql IBM Db2中的聚集索引和非聚集索引,sql,indexing,db2,primary-key,Sql,Indexing,Db2,Primary Key,我很少与聚集索引和非聚集索引混淆。 MySQL和DB2在集群索引方面有什么区别吗?在DB2中,表上的任何单个索引都可以指定为表的集群索引。该索引是一个普通的b-树索引,与任何其他索引(物理上)没有区别,只是它被确定为聚类索引。索引有一系列索引键,每个索引键都有一个RID(行ID)列表,该列表指向与索引键匹配的每一行的数据的物理位置 如果重新组织表(使用REORG table实用程序),DB2将以与集群索引相同的物理顺序物理地排列表的数据(与索引的数据分开)。当新行插入到表中时,DB2将尝试保持物

我很少与聚集索引和非聚集索引混淆。
MySQLDB2在集群索引方面有什么区别吗?

在DB2中,表上的任何单个索引都可以指定为表的集群索引。该索引是一个普通的b-树索引,与任何其他索引(物理上)没有区别,只是它被确定为聚类索引。索引有一系列索引键,每个索引键都有一个RID(行ID)列表,该列表指向与索引键匹配的每一行的数据的物理位置

如果重新组织表(使用
REORG table
实用程序),DB2将以与集群索引相同的物理顺序物理地排列表的数据(与索引的数据分开)。当新行插入到表中时,DB2将尝试保持物理集群顺序(您可以通过为表的
PCTFREE
属性选择适当的值来帮助它),但随着时间的推移,集群比率可能会降低,您可能需要重新组织表

与MySQL相比,使用InnoDB,表的数据存储在主键索引的结构中。因此,与DB2不同,DB2的索引有键列,然后是RID列表,主键索引存储整行——没有单独的存储对象保存表的数据。这就是为什么它被称为聚集索引而不是聚集索引。这大大增加了物理索引的大小,使其更难确保在内存中保持高速缓存

InnoDB中的二级索引存储行的索引键和主键列(而不是RID)——如果主键由许多列组成,这可能效率低下

使用主键(或任何唯一键)进行“集群”是荒谬的。聚类的整个要点是维护相关数据的局部性。InnoDB并不是这里唯一的一个——Microsoft SQL Server也可以做到这一点

以事务表为例。此表的主键可以是
事务\u id
。对于InnoDB,这是聚集索引。但是,一个事务ID与下一个事务ID相关的可能性非常低

account\u id
将精确地成为更好的集群键,因为它不是唯一的。如果我要查找某个特定
帐户\u id
的所有事务,那么将所有这些行放在一个物理页面上非常有意义,并将大大减少查找所有这些行所需的I/O量

如果表的数据作为主键结构的一部分存储(即在
transaction\u id
上),那么您很可能会在索引中读取中的所有页面,以查找单个帐户的所有事务

您可能会争辩说,将所有数据作为主键的一部分存储是一种性能优势(即,1个i/O来获取任何特定的行),但这也意味着缓存索引变得更加困难,因为它会更大。“内存中”可能是必要的,但如果您需要与数据库大小一样多的RAM来维持性能,那么它只在一定程度上有用


在DB2中,表上的任何单个索引都可以指定为表的集群索引。该索引是一个普通的b-树索引,与任何其他索引(物理上)没有区别,只是它被确定为聚类索引。索引有一系列索引键,每个索引键都有一个RID(行ID)列表,该列表指向与索引键匹配的每一行的数据的物理位置

如果重新组织表(使用
REORG table
实用程序),DB2将以与集群索引相同的物理顺序物理地排列表的数据(与索引的数据分开)。当新行插入到表中时,DB2将尝试保持物理集群顺序(您可以通过为表的
PCTFREE
属性选择适当的值来帮助它),但随着时间的推移,集群比率可能会降低,您可能需要重新组织表

与MySQL相比,使用InnoDB,表的数据存储在主键索引的结构中。因此,与DB2不同,DB2的索引有键列,然后是RID列表,主键索引存储整行——没有单独的存储对象保存表的数据。这就是为什么它被称为聚集索引而不是聚集索引。这大大增加了物理索引的大小,使其更难确保在内存中保持高速缓存

InnoDB中的二级索引存储行的索引键和主键列(而不是RID)——如果主键由许多列组成,这可能效率低下

使用主键(或任何唯一键)进行“集群”是荒谬的。聚类的整个要点是维护相关数据的局部性。InnoDB并不是这里唯一的一个——Microsoft SQL Server也可以做到这一点

以事务表为例。此表的主键可以是
事务\u id
。对于InnoDB,这是聚集索引。但是,一个事务ID与下一个事务ID相关的可能性非常低

account\u id
将精确地成为更好的集群键,因为它不是唯一的。如果我要查找某个特定
帐户\u id
的所有事务,那么将所有这些行放在一个物理页面上非常有意义,并将大大减少查找所有这些行所需的I/O量

如果表的数据作为主键结构的一部分存储(i