代码之家  ›  专栏  ›  技术社区  ›  GateKiller

多索引与多列索引

  •  532
  • GateKiller  · 技术社区  · 16 年前

    我刚刚在SQLServer2005中向一个表添加了一个索引,这让我开始思考。创建一个索引和定义多个列与为每列创建一个索引有什么区别?

    为什么一个应该使用另一个呢?

    例如

    Create NonClustered Index IX_IndexName On TableName
    (Column1 Asc, Column2 Asc, Column3 Asc)
    

    对战

    Create NonClustered Index IX_IndexName1 On TableName
    (Column1 Asc)
    
    Create NonClustered Index IX_IndexName2 On TableName
    (Column2 Asc)
    
    Create NonClustered Index IX_IndexName3 On TableName
    (Column3 Asc)
    
    5 回复  |  直到 6 年前
        1
  •  262
  •   Community Mr_and_Mrs_D    7 年前

    我同意 Cade Roux .

    这篇文章应该让你走上正确的道路:

    需要注意的一点是,聚集索引应该有一个唯一的键(我建议使用标识列)作为第一列。 基本上,它可以帮助您在索引末尾插入数据,而不会导致大量磁盘IO和页面拆分。

    其次,如果您正在数据上创建其他索引,并且这些索引的构造非常巧妙,那么它们将被重用。

    例如,假设您在三列中搜索一个表

    州、县、邮编。

    • 有时只按州搜索。
    • 有时你会按州和县搜索。
    • 您经常按州、县、邮政编码搜索。

    然后是州、县、邮政编码的索引。将在所有三个搜索中使用。

    如果只使用zip进行大量搜索,则不会使用上面的索引(无论如何,SQL Server也不会使用),因为zip是该索引的第三部分,查询优化程序不会认为该索引有帮助。

    然后您可以单独在zip上创建一个索引,该索引将在此实例中使用。

    我想你要找的答案是,这取决于你经常使用的查询的where子句,以及你的group by。

    这篇文章会有很大帮助。-)

        2
  •  67
  •   Cade Roux    11 年前

    对。我建议你退房 Kimberly Tripp's articles on indexing .

    如果一个索引是“覆盖的”,那么除了索引之外就不需要使用任何东西。在SQL Server 2005中,还可以向索引中添加其他列,这些列不是键的一部分,可以消除对行其余部分的访问。

    如果有多个索引,那么每一列上的索引可能意味着只有一个索引被使用——您必须参考执行计划,以了解不同索引方案的效果。

    您还可以使用优化向导来帮助确定哪些索引可以使给定的查询或工作负荷运行得最好。

        3
  •  35
  •   MobyDX    16 年前

    多列索引可用于查询引用 全部的 专栏:

    SELECT *
    FROM TableName
    WHERE Column1=1 AND Column2=2 AND Column3=3
    

    这可以使用多列索引直接查找。另一方面,最多只能使用一个单列索引(它必须查找所有列1=1的记录,然后检查每个记录中的列2和列3)。

        4
  •  17
  •   ConcernedOfTunbridgeWells    16 年前

    其中一个似乎被忽略的项目是星型转换。 Index Intersection 运算符通过在事实表上完成任何I/O之前计算每个谓词所命中的行集来解析谓词。在星型模式中,您将为每个单独的维度键建立索引,查询优化程序可以通过索引交叉计算来解析要选择哪些行。各个列上的索引为实现这一点提供了最佳的灵活性。

        5
  •  7
  •   Bob Probst    16 年前

    如果您的查询经常使用一组相对静态的列,那么创建一个包含所有列的覆盖索引将显著提高性能。

    通过在索引中放入多个列,优化器将只需要在索引中没有列的情况下直接访问表。我经常在数据仓库中使用这些。缺点是这样做会花费大量的开销,特别是在数据非常不稳定的情况下。

    在单列上创建索引对于OLTP系统中常见的查找操作很有用。

    您应该问问自己,为什么要索引这些列,以及如何使用它们。运行一些查询计划并查看何时访问它们。指数调整和科学一样是本能。