在同一个表上的多个连接列的索引的方法?

时间:2014-07-25 04:02:42

标签: sql sql-server sql-server-2008-r2 indexing

我有很多桌子相互连接,而且对于一个特定的桌子我在连接条件下有多列。

例如

select a.av, b.qc
TableA a INNER JOIN TableB b 
ON (a.id = b.id and a.status = '20' and a.flag='false' and a.num in (1,2,4))

该方法应该如何。

1.   CREATE NONCLUSTERED INDEX N_IX_Test
                 ON TableA (id,status,flag,num)
                 INCLUDE(av);

2.   CREATE NONCLUSTERED INDEX N_IX_Test1
                 ON TableB (id)
                 INCLUDE(qc); 

我可以考虑这两种方法,每当我在连接条件下看到同一个表的多个列时,我将其作为复合索引并添加选择列表列以包含它是否正常?

2 个答案:

答案 0 :(得分:0)

如果id是每个表中的唯一键,则通过向索引添加更多字段,连接(实际上有害)没有任何好处。

现在,如果ID不是唯一且分布不均匀并且使用额外的列,那么您正在制作覆盖索引,然后是,您正在制作一个可用于快速选择的索引。但是覆盖索引维护本身是SQL服务器上的额外负载。很难从你的例子中看出这是你所说的。

因此,如果给定ID的ID唯一或至少没有多少重复,我将不愿意添加覆盖索引,除非通过从覆盖索引中选择可以满足大部分查询。

答案 1 :(得分:0)

不同的连接算法需要不同的索引。您的索引方法仅适用于嵌套循环连接,但我想在这种情况下,散列连接可能是更好的选择。但是,有一个技巧可以使索引对嵌套循环和散列连接有用:将非连接谓词放在索引中:

CREATE NONCLUSTERED INDEX N_IX_Test
             ON TableA (status,flag,id,num)
             INCLUDE(av);

num仍然是最后一次,因为它不是一个平等比较。

这只是一个疯狂的猜测,只有在您提供更多信息(如聚簇索引(如果有)以及执行计划)时,才能提供准确的建议。

参考文献: