代码之家  ›  专栏  ›  技术社区  ›  Onur Yıldırım

在自定义SQL表上设置索引列

  •  1
  • Onur Yıldırım  · 技术社区  · 14 年前

    我读过有关主索引、唯一索引、聚集索引等的内容,但我需要通过一个例子来理解它。

    下面的图像是从SQL Server Web管理面板捕获的自动生成的aspnet_用户表。

    Auto-generated ASP.NET Users Table http://eggshelf.com/capture.jpg

    以这个为模型,我将创建一个名为companies的自定义表,比如字段是:id、name、shortname、address、city、country。ID、名称和短名称字段的值不能重复。

    为这个表创建索引的方法是什么?哪一个应该是集群还是非集群?索引是否低于逻辑?

    Index          Columns         Primary    Unique    Clustered    ign.Dup.Keys   Unique Key
    ------------------------------------------------------------------------------------------
    PK_ID          ID              True       True      False        False          False
    Comp_Index     Name,ShortName  False      True      True         False          False
    

    当做。。

    3 回复  |  直到 14 年前
        1
  •  1
  •   John Sansom    14 年前

    通过阅读 Brad's Sure Guide to Indexes

    通常,在没有执行任何查询分析的情况下,您的起点是:

    • 主键列可以很好地替代聚集索引(通常取决于使用的数据类型和键宽度)。
    • 应该在外键列上创建非聚集索引。
    • 应该根据查询在sarg列上创建非聚集索引。

    然后看看这些 generic index tips .

        2
  •  2
  •   Oded    14 年前

    索引不是关于表结构,而是关于访问模式。

    你需要看看你 查询 表中的数据并相应地创建索引。

    经验法则是考虑在 WHERE 条款。

    this 关于这个主题的博客文章。

    更新

    只能在表上定义单个聚集索引。这通常在表的标识字段上完成,正如您在示例中所做的那样。

    其他索引将是非聚集索引。

    对于另一个(非聚集的)索引-如果只希望查询包含 在哪里? 子句和 ORDER BY 将有一个主排序 Name (与主排序相反 ShortName )原因是,这是存储索引的方式-首先 名字 然后 短名称 .

    但是,您将使用 短名称 作为主排序或不作为主排序 名字 在哪里? 子句,最好有两个索引,每个索引一个。

        3
  •  1
  •   StuartLC    14 年前

    ODED是正确的——索引(集群索引和非索引)都是关于性能的,需要对查询类型有深入的了解。

    例如,如果短名称和名称都是独立查询的,那么您可能需要为短名称和名称分别设置非聚集索引。 如果需要强制唯一性,请使用唯一索引(或向shortname和name添加唯一约束)。ID已经是唯一的,因为它是pk。

    如果您更了解如何提取公司表中的数据(例如,如果一次提取城市中的所有公司是常见的做法,则可以在城市中集群),则还可以更改集群索引(从其默认ID更改)。