什么指数可以高效率地应用于这种情况?

时间:2012-03-12 14:12:42

标签: database performance algorithm indexing


我试图完成工作时遇到了这样的问题。

给定数据集,对于每个项目,都有 D 维度,并且可以设置 C 值每个维度。
例如,数据集 THINGS(ID,所有者,颜色,重量) ID 是主键
所有者属性可以是 alice,jack,zuck ;
颜色属性可以是红色,黄色,绿色;
weight 属性可以高,中,低;
在该数据集中,D = 3,C = 3

现在我想做很多次查询,例如:
“有没有所有者=红色和颜色=红色的数据”? “有没有重量=低的数据”? “有没有所有者=红色,颜色=红色,重量=高”的数据? 我只需要“是或否”来回答此问题。

我原本需要这样做,我的意思是没有数据库 在PC中,我尝试位图反向索引来完成要求,但数据集的大小将为百万,维度将为8~18,基数将为5〜15。结果,效率不够好。

你可以给我任何建议,使它更有效率吗? 提前谢谢!

1 个答案:

答案 0 :(得分:2)

您可能希望每个维度都有一个排序字典,其中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]
}

然后,您可以简单地在词典的VALUES(ID列表)上使用INTERSECT。如果交叉点大小大于0,则表示您具有正匹配。

Owner=Bob AND Weight=High

([1,5] UNION [3,5]) = [5]

如果您的标准(或之前的一个INTERSECTIONs)之一的值为[]为空,则可以立即短路(返回false),而无需进一步评估。

在数据库术语中,您将在每个字段/列上放置一个非聚集索引。并且正在做

EXISTS(SELECT ID FROM Table WHERE Col1=@Val1 AND Col2=@Val2 AND Col3=@Val3)

编辑 UNION - > INTERSECTION好抓@ElKamina