Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 server 索引性能,群集与非群集_Sql Server_Database_Optimization_Indexing - Fatal编程技术网

Sql server 索引性能,群集与非群集

Sql server 索引性能,群集与非群集,sql-server,database,optimization,indexing,Sql Server,Database,Optimization,Indexing,如果一个表只需要一个索引,那么集群似乎是一种常用的方法。它的速度更快,因为它不必通过键引用回数据,也不像非聚集索引那样占用磁盘空间 我的问题是,对于多个索引,一起删除聚集索引是否更好?这背后的逻辑是,如果非聚集索引具有聚集索引,则它们不再直接引用实际数据行,而是引用聚集索引。因此,使用聚集索引作为代理似乎会对性能造成重大影响。如果您认为表上需要不止一个索引,那么最好不要使用聚集索引。如果表具有适当的聚集索引,则删除它没有任何好处。 如果您有多个索引,请为群集选择最佳候选索引。 通常是您的PK。

如果一个表只需要一个索引,那么集群似乎是一种常用的方法。它的速度更快,因为它不必通过键引用回数据,也不像非聚集索引那样占用磁盘空间


我的问题是,对于多个索引,一起删除聚集索引是否更好?这背后的逻辑是,如果非聚集索引具有聚集索引,则它们不再直接引用实际数据行,而是引用聚集索引。因此,使用聚集索引作为代理似乎会对性能造成重大影响。如果您认为表上需要不止一个索引,那么最好不要使用聚集索引。

如果表具有适当的聚集索引,则删除它没有任何好处。
如果您有多个索引,请为群集选择最佳候选索引。
通常是您的PK。
默认情况下,当您创建PK时,它是群集的。
PK是集群应用程序的最佳候选,除非您有特定的理由不使用它

我不同意你的断言

“如果您有带聚集索引的非聚集索引,则它们不会 返回到实际的数据行,但返回到聚集索引 相反,似乎会有一场重要的演出 击中。”

如果聚集索引在数据中,那么引用聚集索引就是引用数据。数据由聚集索引进行物理组织。显著的性能影响在哪里

除了少数例外,每个表都应该定义一个聚集索引

如果其中一个例外是另一个索引,那么它将被调用。
另一个非聚集索引不是没有聚集索引的原因

非聚集索引行中的行定位器是指向行的指针或行的聚集索引键,如下所述:

  • 如果表是一个堆,这意味着它没有集群 索引时,行定位器是指向该行的指针。指针已生成 从上的文件标识符(ID)、页码和行号 这一页。整个指针称为行ID(RID)
  • 如果表具有聚集索引,或索引位于索引上 视图中,行定位器是该行的聚集索引键。如果 聚集索引不是唯一索引,SQL Server会生成任何重复索引 通过添加称为 唯一化者。此四字节值对用户不可见。只是 在需要时添加,以使群集密钥在中唯一使用 非聚集索引。SQL Server通过搜索来检索数据行 使用存储在叶中的聚集索引键的聚集索引 非聚集索引的行

即使有PK,他们也可以选择使用RID。为什么你认为聚集索引比较慢

您正在使用哪个数据库?MySQL还是SQL Server?SQL Server。是的,我同意。如果您只需要1个索引,那么它应该是一个聚集索引。但出于分析目的,表通常有许多索引,因此(n-1)必须是非聚集的。如果存在聚集索引,并且发生了非聚集索引扫描,则它是对聚集索引的引用,而不是RID的非聚集结果。因此,我的问题是,如果一个表上有多个索引,是否最好省略聚集索引,这样搜索就不必每次进行非聚集搜索时都遍历聚集索引,这样可以节省时间签出覆盖索引。因此,不是直接回答您的问题,而是覆盖索引包含附加字段,可以提供信息,而无需从表中读取行。当然会受到存储损失。使用逻辑rid而不是物理rid会影响性能。另外,如果将基表存储为堆,则意味着根本没有索引可以使用它,而无需对其执行查找(很快就会变得昂贵)或复制NCI本身中的数据。这意味着它存储了两次,需要维护两次。@最后一段-聚集的应该总是比非聚集的快,因为聚集的不必引用回数据。但我的印象是,如果已经有一个聚集的、非聚集的结果,则必须遍历整个聚集索引B树,才能得到相应的行号。这有意义吗?因此,与通常直接引用行号不同,为了获得行号,它必须在非聚集行之后遍历聚集行。这就是性能受欢迎的原因。@user3739391不是我不明白。如果RID更快,他们就会使用它。你有什么证据证明RID更快?您知道RID的结构(在SQL中)吗?多个索引是常见的。如果在多索引场景中没有聚集索引更好,那么您会发现该建议又大又粗。RID并不总是更快,但对于表上已经存在的聚集索引,它应该更快,因为它可以只使用RID来标识记录,而不必运行整个聚集索引来查找记录。这是合乎逻辑的。事实证明,它确实提高了性能20-30%,正如我所想。@user3739391我并没有放弃我的聚集索引,但这很有趣。