仅使用一列索引表是否有意义?

时间:2017-08-16 21:32:56

标签: sql tsql indexing sql-server-2012

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

谢谢!

2 个答案:

答案 0 :(得分:2)

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

这实际上是一种常见做法。我使用以下逻辑创建排除表并不罕见:

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

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

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

答案 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,但优化者可能会选择将整个表加载到哈希值中,所以再次,索引它并不一定有帮助

感觉可能还有另一种方法可以完成你需要的完全抛弃这个单列表的方法