AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 5704
Accepted
RPK
RPK
Asked: 2011-09-14 07:40:05 +0800 CST2011-09-14 07:40:05 +0800 CST 2011-09-14 07:40:05 +0800 CST

为什么在少数列上启用聚集索引属性而不在其他列上启用?

  • 772

听说只能有一个聚集索引?我可能是错的,但我确定我在某个地方读到过。

在我的 SQL Server 2005 表之一中,我有以下列:

SerialNum -------- BigInt -------- 主键

区-------- nvarchar(50)

SchemeType ------ nvarchar(50)

当我使用 SQL Server Management Studio 在设计模式下打开表时,我注意到为District启用了Clustered Index属性,而为SchemeType禁用了它。

如果只能有一个聚集索引,那么当SerialNum已经定义为主键时,为什么 District 会启用此属性?

如果可以有更多聚集索引,那么如何为SchemeType列启用此属性?

sql-server database-design
  • 4 4 个回答
  • 2253 Views

4 个回答

  • Voted
  1. Best Answer
    Aaron Bertrand
    2011-09-14T07:57:01+08:002011-09-14T07:57:01+08:00

    主键和聚集索引是两个不同的东西,尽管它们经常结合使用。您的桌子以这种方式结束的几个潜在原因:

    (a) 它可以使用非聚集主键创建PRIMARY KEY NONCLUSTERED,然后添加聚集索引。

    (b) 可能已经添加了聚集索引,然后添加了主键(在这种情况下,它不能被聚集,因为已经有聚集索引)。

    其中任何一个都可能是故意的设计决策、事故、事后的变化等。

    忽略 Management Studio 设计视图中的属性。聚集索引是表,但它由指定的列定义。其他列在技术上仍然是聚集索引的一部分,它们只是不是索引中的键列。称“启用/禁用”具有误导性。

    • 6
  2. Marian
    2011-09-14T07:46:07+08:002011-09-14T07:46:07+08:00

    聚集索引只能有一个,因为聚集索引就是表数据本身。这是一种基于集群键组织表数据的方法。它类似于 Oracle 的索引组织表 (IOT)。非聚集索引是独立的数据结构。聚集索引是将数据本身组织为 b 树。

    默认情况下,SQL Server 将主键作为聚集索引(如果还没有的话)。似乎在您的情况下,主键被创建为“非聚集索引”,列区被创建为“聚集索引”。

    • 3
  3. StanleyJohns
    2011-09-14T15:28:28+08:002011-09-14T15:28:28+08:00

    每个表只能有一个聚集索引。主键不是聚集索引。要回答您的问题:

    如果只能有一个聚集索引,那么当 SerialNum 已经定义为主键时,为什么 District 会启用此属性?这是因为聚集索引是在 District 上创建的。只有这将显示为启用,其余的将显示为禁用。

    如果可以有更多聚集索引,那么如何为 SchemeType 列启用此属性?一张表上不能有多个聚集索引。您必须删除 District 上的聚集索引并为 SchemeType 重新创建一个。如果您仍然想在 District 上保留聚集索引,那么您可以使用的一个技巧是创建一个索引视图,然后在视图上为 SchemeType 创建一个聚集索引。为此,您可能需要企业版。

    • 1
  4. GregW
    2011-09-16T10:03:52+08:002011-09-16T10:03:52+08:00
    • 在 MySQL 中,我从您使用的其他帖子中看到,主键和聚集索引始终相同。
    • 在 SQL Server 中,它们可以不同。
    • 在 SQL Server 中,只能有一个聚集索引。聚集索引将确保根据该索引对表进行物理排序。
    • 当然,除了一个聚集索引之外,您还可以有许多非聚集索引,通常您的某些表上会有一个聚集索引和一个或几个非聚集索引。
    • 通常在 SQL Server 中,主键具有聚集索引(我认为这是默认设置),但可以使用聚集索引配置另一列(或多列)。
    • 甚至可以在该聚集索引中有两个或更多列。你没有说 SerialNum 列是否也是聚集的,但是如果你看到两者都是聚集的,那么你有一个跨越两列的单个索引,并且会有一个聚集顺序整数属性,它将按照这些顺序排列列确定物理表布局(例如,“首先按地区排序,在地区内,按 SerialNum 排序”)。请注意,向此聚集索引添加更多列将倾向于降低而不是提高性能,除非物理排序与针对该表的主要查询案例完全匹配,足以克服确保物理排序带来的减少的 INSERT 性能损失。
    • 在您的系统中,如果 District 是集群的(但 SerialNum 不是),如果针对该表的查询更频繁地加入“District”或过滤“District”而不是“SerialNum”,那么这可能是一个好的设计。(我在像 SerialNum 之类的东西是一个自动递增的代理键的情况下看到过这种事情,在您的数据模型的其他地方并没有太多使用,并且如果最终用户/应用程序/报告有 joins/where/groupby/带有 District 的 orderby 子句,但很少或从不反对 SerialNum。)
    • 0

相关问题

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 在数据仓库中实现多对多关系有哪些方法?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve