【问题标题】:SQL Server, is this correct index usage?SQL Server,这是正确的索引用法吗?
【发布时间】:2011-04-20 15:06:26
【问题描述】:

我正在尝试掌握索引。给定表格:

Books
------
ID (PK)
Title
CategoryID (FK)
AuthorID (FK)

在我的 ASP.net 页面中,我的网页将按作者或按类别获取书籍,如果我想缩短检索时间,是否可以在 CategoryID Asc, AuthorID asc 上创建索引?

我理解正确了吗?如果我如上所述使用多个列,那是称为 clustered index 还是其他?

【问题讨论】:

  • Clustered Index 是表格的物理排序依据;由多个列组成的索引称为复合索引索引

标签: asp.net sql-server linq performance indexing


【解决方案1】:

您应该创建两个索引,一个用于CategoryID,一个用于AuthorID。如果您寻找一个另一个,则不需要将两者放在同一个索引中;如果您总是同时查询两者(例如类别和作者),您将需要它。

聚集索引控制数据的物理顺序。通常,如果您有一个标识列,将其用作聚集索引(默认情况下主键是)就可以了。

【讨论】:

  • 感谢您的回答!在我的 SQL 探查器中,我有一个在 CPU 上运行 17 毫秒的查询,我没有更改任何数据,而是通过我的表放置索引(我认为是正确的方式!)然后当我重新运行此查询时,探查器现在说CPU 上 0 毫秒。这是添加索引应该针对的那种好处吗?
  • @Tom Gullen 是的,添加索引应该可以提高读取性能。但是它们会在维护索引时产生很小的开销,因此写入性能会下降。但是,在大多数 Web 应用程序中,读取性能比写入性能重要得多。
  • @Tom Gullen 不,链接列表可能要求您每次都扫描整个列表。使用树,一种流行的树是en.wikipedia.org/wiki/B%2B_tree,它实际上是叶节点中的链表。这允许快速范围查询。
【解决方案2】:

聚集索引意味着数据按照索引指定的顺序存储在表和磁盘(等)上。这样做的结果是,只能存在一个聚集索引。

索引CategoryID Asc, AuthorID asc 将使特定类别的查找速度更快,并且查找具有特定作者的特定类别将是理想的。但它并不适合单独查找作者,因为您必须为每个类别查找作者。在这种情况下,两个单独的索引会更好。

【讨论】:

    【解决方案3】:

    适当的索引取决于查询的作用。如果您有一个针对类别和作者的查询,那么您可能会使用包含两个字段的索引,否则您可能会更多地使用两个单独的索引。

    聚集索引是决定表中记录的存储顺序的索引,与它所包含的字段数无关。您应该已经在主键上有一个聚集索引,因此您不能为该表创建另一个聚集索引。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-03
      • 1970-01-01
      相关资源
      最近更新 更多