我有一个这样的sql表:
Prop1 Prop2 Prop3 Prop4 Priority Value
A NULL B C 12 22
NULL NULL M F 20 1
...
Prop1
,Prop2
,Prop3
,Prop4
可以为NULL或某些字符串值。我按Prop1
,Prop2
,Prop3
,Prop4
筛选行。在SQL中,过滤将是:
select top 1 * from items where
(Prop1 is null OR Prop1 = @Prop1)
and (Prop2 is null OR Prop2 = @Prop2)
and (Prop3 is null OR Prop3 = @Prop3)
and (Prop4 is null OR Prop4 = @Prop4)
order by Priority desc
为减少IO成本并加快筛选速度,我在应用程序启动时将整个表加载到内存中。所以我想在应用程序的内存中进行相同的过滤。进行相同过滤的唯一想法是通过键{Prop1, Prop2, Prop3, Prop4}
将所有项放入字典,然后根据过滤器结构生成键列表:
输入过滤器
{ Prop1 = A, Prop2 = B, Prop3 = C, Prop4 = D }
生成的空值过滤器
- with one null
{ Prop1 = NULL, Prop2 = B, Prop3 = C, Prop4 = D }
{ Prop1 = A, Prop2 = NULL, Prop3 = C, Prop4 = D }
{ Prop1 = A, Prop2 = B, Prop3 = NULL, Prop4 = D }
{ Prop1 = A, Prop2 = B, Prop3 = C, Prop4 = NULL }
- with two nulls
{ Prop1 = NULL, Prop2 = NULL, Prop3 = C, Prop4 = D }
{ Prop1 = NULL, Prop2 = B, Prop3 = NULL, Prop4 = D }
....
{ Prop1 = NULL, Prop2 = NULL, Prop3 = NULL, Prop4 = NULL }
然后找到这些键的值,按优先级排序并获得第一个。但是,对于每个过滤器操作,我需要在字典中进行16
查找。而且如果我们另外有Prop5
,则需要为每个过滤器操作进行32
查找。是否有针对此类情况的索引策略?