对于Sql表演,几个等于或一个之间

时间:2016-06-20 16:35:38

标签: sql sql-server performance

对于一个新的开发,我将有一个大的SQL表(~100M行)。 将使用4个字段来查询数据。

用一个或几个等于查询一个连接字段是否更好?

例如:

MainTable

PkId | Label | FkId1 | FkId2 | FkId3 | FkId4
1    | test  | 1     | 4     | 3     | 1

Fk表中的数据是静态的,例如:

FkTable1

Id | Value
1  | a
2  | b
3  | c 

要查询数据,经典的sql查询是:

select Label, FkId1, FkId2, FkId3, FkId4 
from MainTable
where FkId1=1 and FkId2=2 and FkId3 in(2, 3)

优化性能的想法是在插入之前添加一个字段“UniqueId”计算后端:

UniqueId = FkId1*1000000 + FkId2*10000 + FkId3*100 + FkId4
PkId | Label | FkId1 | FkId2 | FkId3 | FkId4 | UniqueId
1    | test  | 1     | 4     | 3     | 1     | 1040301
select Label, FkId1, FkId2, FkId3, FkId4 
from MainTable
where UniqueId between 1020200 and 1040000

此外,使用UniqueId字段,仅此字段的索引就足够了。

您怎么看?

由于

2 个答案:

答案 0 :(得分:3)

对于此查询:

select Label, FkId1, FkId2, FkId3, FkId4 
from MainTable
where FkId1 = 1 and FkId2 = 2 and FkId3 in (2, 3)

最佳索引位于MainTable(FkID1, FkId2, FkId3)。如果需要覆盖索引,也可以将LabelFkId4添加到索引(因此索引可以处理整个查询而不引用原始数据页)。

您提供的示例不需要计算字段。

答案 1 :(得分:0)

由于你将拥有100M行,从一开始就考虑优化对我来说是明智的。 但是,您建议的解决方案不会以这种方式工作:

  1. 上面的公式是相同系数10000的两倍。您必须使用不同的因素,即10的不同幂。

  2. 您的选择示例包含" IN"条款((2,3)中的FkId3)。只有通过这种方式查询其中一个FK时,这才有效。这个fk应该是计算UniqueId的公式中没有因子的那个(即给出UniqueId的最低有效数字)。

  3. 现在看到戈登回答,我同意他的意见,即使用综合指数对你来说可能已经足够了(尽管你的解决方案可能稍好一些)。但是,组合索引也有类似的问题:使用IN子句查询的FK字段应该是索引中的最后一个字段。