【发布时间】:2018-01-25 04:10:47
【问题描述】:
我想知道索引一个只包含一列的表是否有意义?该表将填充 100 或 1000 条记录,并将用于 JOIN 到另一个(更大的表)以过滤其记录。
谢谢!
【问题讨论】:
标签: sql tsql indexing sql-server-2012
我想知道索引一个只包含一列的表是否有意义?该表将填充 100 或 1000 条记录,并将用于 JOIN 到另一个(更大的表)以过滤其记录。
谢谢!
【问题讨论】:
标签: sql tsql indexing sql-server-2012
是和不是。显式索引可能没有意义。但是,通常会将单列定义为 primary key(假设它从不是 NULL 并且是唯一的)。
这实际上是一种常见的做法。创建排除表对我来说并不少见,其逻辑如下:
from . . .
where not exists (select 1 from exclusion_table et where et.id = ?.id)
主键索引可以加快这样的查询。
在您的情况下,如果较大的表在用于连接的 id 上具有索引,则可能没有区别。但是,您可以为优化器提供选择使用哪个索引的选项。
【讨论】:
我的投票是,它在您的场景中可能没有真正意义。你是说这个单列的表将被连接到另一个表来过滤另一个表中的记录,那么为什么不直接删除这个表,索引另一个表中的另一个列,然后过滤呢?
本质上,你为什么要写作:
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 但优化器可能会选择将整个表加载到散列中,所以再一次,索引它不一定有帮助
感觉可能还有另一种方法可以完全放弃这个单列表
【讨论】: