【问题标题】:Does it make sense to index a table with just one column?只用一列索引表是否有意义?
【发布时间】:2018-01-25 04:10:47
【问题描述】:

我想知道索引一个只包含一列的表是否有意义?该表将填充 100 或 1000 条记录,并将用于 JOIN 到另一个(更大的表)以过滤其记录。

谢谢!

【问题讨论】:

    标签: sql tsql indexing sql-server-2012


    【解决方案1】:

    是和不是。显式索引可能没有意义。但是,通常会将单列定义为 primary key(假设它从不是 NULL 并且是唯一的)。

    这实际上是一种常见的做法。创建排除表对我来说并不少见,其逻辑如下:

    from . . . 
    where not exists (select 1 from exclusion_table et where et.id = ?.id)
    

    主键索引可以加快这样的查询。

    在您的情况下,如果较大的表在用于连接的 id 上具有索引,则可能没有区别。但是,您可以为优化器提供选择使用哪个索引的选项。

    【讨论】:

    • 我不同意。当您想要搜索时,索引是有意义的。当您使用 WHERE 子句或将此表连接到其他表时使用搜索。
    • 谢谢大家的回复和解释!我未能提供我的场景的详细信息,这是一个传递到存储过程的 ID 列表——然后我从传入的表值参数将它们加载到临时表中。我在询问是否要为该临时表编制索引。
    • @SQL_Guy 。 . .我会在列上创建带有主键的临时表。它不应该损害结果查询,并且可能会显着提升。
    • 我进行了一些实验,假设过滤后的表比传入的值列表大得多,索引在这种情况下似乎没有什么不同。总是先扫描较小的列表(表扫描或索引扫描),然后对较大的表执行索引查找,这是人们所期望的。可能还有其他情况,索引会是有益的,所以我猜结论是:测试您的特定情况。谢谢大家!
    • 底线(我希望每个人都能同意)- 拥有该索引没有缺点。它当然不会损害任何查询。如果它有帮助 - 很好,如果没有 - 没有害处。 (在 1000 行的 1 列上创建索引的时间应该是微不足道的)
    【解决方案2】:

    我的投票是,它在您的场景中可能没有真正意义。你是说这个单列的表将被连接到另一个表来过滤另一个表中的记录,那么为什么不直接删除这个表,索引另一个表中的另一个列,然后过滤呢?

    本质上,你为什么要写作:

    SELECT * FROM manycols M INNER JOIN singlecol s ON m.id = s.id WHERE s.id = 123
    

    那是什么时候:

    SELECT * FROM manycols m WHERE m.id = 123
    

    假设参数是 manycols 有一百万行,而 singlecol 有一千行。你想要一千个匹配的行,为了利益需要对许多列进行索引。

    假设参数是你想要除 singlecol 之外的所有行;你可以索引 singlecol 但优化器可能会选择将整个表加载到散列中,所以再一次,索引它不一定有帮助

    感觉可能还有另一种方法可以完全放弃这个单列表

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 2019-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-28
      • 2011-08-18
      相关资源
      最近更新 更多