Big*_*ato 5 database algorithm indexing performance
当我试图完成我的工作时,我遇到了这样的问题.
给定数据集,对于每个项目,存在D维度,并且可以将C值设置为每个维度.
例如,数据集事(ID,所有者,颜色,重量),ID是主键
的所有者属性可以是翘,千斤顶,扎克 ;
该颜色属性可以是红色,黄色,绿色 ;
的重量属性可以是高,中,低 ;
在该数据集中,D = 3,C = 3
现在我想做很多次查询,例如:
"有没有所有者=红色和颜色=红色的数据"?
"有没有重量=低的数据"?
"有没有所有者=红色和颜色=红色和重量=高"的数据?
我只需要"是或否"来回答这个问题.
我最初需要这样做,我的意思是没有数据库.
在PC中,我尝试使用Bitmap和倒排索引来完成要求,但数据集的大小将为百万,Dimensionality将为8~18,基数将为5~15.结果,效率不够好.
你能给我任何建议让它更有效吗?
提前致谢!
您可能需要每个维度都有一个排序字典,其中 KEY 是该维度的可能元素,VALUE 是 ID 列表。
OWNER_DICTIONARY = {
Bob: [1,5],
Jim: [2],
Sally: [3,4],
Will: []
}
COLOR_DICTIONARY = {
Blue: [5],
Green: [2],
Red: [],
Yellow: [1,3,4]
}
WEIGHT_DICTIONARY = {
Low: [1,2,4],
High: [3,5]
}
Run Code Online (Sandbox Code Playgroud)
然后,您只需在字典的 VALUES(ID 列表)上使用 INTERSECT 即可。如果交集大小大于 0,则为正匹配。
Owner=Bob AND Weight=High
([1,5] UNION [3,5]) = [5]
Run Code Online (Sandbox Code Playgroud)
如果您的标准的值之一(或之前的交集之一)为 [] 空,您可以立即短路(返回 false),而无需进一步评估。
在数据库术语中,您将在每个字段/列上放置一个非聚集索引。和做
EXISTS(SELECT ID FROM Table WHERE Col1=@Val1 AND Col2=@Val2 AND Col3=@Val3)
Run Code Online (Sandbox Code Playgroud)
编辑联合 -> 交集 很好的捕获@ElKamina