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
    • 最新
    • 标签
主页 / server / 问题 / 37251
Accepted
RateControl
RateControl
Asked: 2009-07-08 10:47:05 +0800 CST2009-07-08 10:47:05 +0800 CST 2009-07-08 10:47:05 +0800 CST

聚集索引与非聚集索引?

  • 772

我负责一个较小的 DB 300+ 百兆 100'ish 表,大约有 45 个用户在整个工作日内点击它。主要是读取,但有相当数量的更新和插入。我一直在放慢学习数据库结构的速度,以便从中获得一些性能。我听说查看索引是一个很好的起点。所述数据库的表的所有大多数索引都是集群的,其中一些是非集群的。

集群与非集群相比有速度优势吗?我有一个维护计划(是的,我知道),在差异备份之前每晚重新组织和重建索引,现在这是否足够好,直到我更好地掌握索引的形成和利用?

是否有(一个或多个)脚本可以帮助我查看各种索引的“性能”?我把自己弄进了多大的蠕虫罐头?

sql-server sql-server-2005 performance indexes
  • 2 2 个回答
  • 5697 Views

2 个回答

  • Voted
  1. Best Answer
    splattne
    2009-07-08T11:12:08+08:002009-07-08T11:12:08+08:00

    聚集索引确定表中数据的物理顺序,并且对于经常搜索值范围的列特别有效。当索引值唯一时,它们对于查找特定行也很有效。

    通常(有例外),聚集索引应该位于单调增加的列上 - 例如标识列,或值增加的其他列 - 并且是唯一的。在许多情况下,主键是聚集索引的理想列(但不要将聚集索引放在唯一标识符/GUID 列上。)

    从这篇MSDN 文章:

    在创建聚集索引之前,了解您的数据将如何被访问。考虑将聚集索引用于:

    • 包含大量不同值的列。
    • 使用 BETWEEN、>、>=、< 和 <= 等运算符返回一系列值的查询。
    • 按顺序访问的列。
    • 返回大型结果集的查询。
    • 经常被涉及 join 或 GROUP BY 子句的查询访问的列;通常这些是外键列。在 ORDER BY 或 GROUP BY 子句中指定的列上的索引消除了 SQL Server 对数据进行排序的需要,因为这些行已经排序。这提高了查询性能。
    • 需要非常快速的单行查找的 OLTP 类型应用程序,通常通过主键进行。在主键上创建聚集索引。

    聚集索引不是一个好的选择:

    • 频繁更改的列:这会导致整行移动(因为 SQL Server 必须保持行的数据值按物理顺序排列)。在数据往往不稳定的大容量事务处理系统中,这是一个重要的考虑因素。
    • 宽键:来自聚集索引的键值被所有非聚集索引用作查找键,因此存储在每个非聚集索引叶条目中。

    SQLServerpedia.com 有一些很好的索引调整文章/教程:索引相关的 DMV 查询和使用正确的索引以获得最佳性能。

    • 8
  2. Garrett
    2009-07-08T14:29:50+08:002009-07-08T14:29:50+08:00

    我读过使用代理键并在该列上使用聚集索引是非常好的做法。通常,这将是一个将自动递增 (IDENTITY) 的 int 列,或者是一个 uniqueidentifier(使其成为顺序 GUID以避免以后出现性能问题!)。

    这样做时,您的查询将对跨表的这些代理键执行 JOIN,从而为您提供性能和可伸缩性。

    至于其他(非聚集)索引,该选择取决于您的客户如何使用您的应用程序。太多的索引对插入/更新来说意味着灾难。索引不足会减慢读取速度。您需要在两者之间找到平衡。与搜索结合使用的列是索引的逻辑候选,包括复合(多列)索引(在这种情况下请注意列顺序)。

    如果您想变得花哨,请拥有一个单独的 OLAP 数据库来报告历史数据。

    • 5

相关问题

  • IIS 优化

  • Vanilla Powershell 是否足以成为 Windows 和 DB 服务器管理员的语言?

  • 在 SQL Server 中,何时应将 PRIMARY Data FileGroup 拆分为辅助数据文件?

  • 如何从 SQL Server 2008 中的备份中排除索引

Sidebar

Stats

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

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve