【问题标题】:what index can be applied to this condition with high efficiency?什么指标可以高效地应用于这种情况?
【发布时间】:2012-03-28 22:43:04
【问题描述】:


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

给定一个数据集,每一项都有D个维度,可以设置C个值到每个维度。
比如一个数据集THINGS(ID,owner, color, weight)ID是主键
owner 属性可以是alice, jack, zuck;
color 属性可以是red, yellow, green;
weight 属性可以是high, medium, low;
在这个数据集中,D=3,C=3

现在我想多次查询:
“是否有 owner=red 和 color=red 的数据”?
“有没有重量=低的数据”?
“有没有 owner=red 和 color=red 和 weight=high 的数据”?
我只需要“是或否”来回答这个问题。

我最初需要这样做,我的意思是没有数据库。
在PC上,我尝试了Bitmapinverted index来完成要求,但是数据集的大小将是百万,维数为8~18,基数为5~15。结果,效率不够好。

您能给我一些建议以提高效率吗?
提前致谢!

【问题讨论】:

    标签: database performance algorithm indexing


    【解决方案1】:

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

    如果您的条件的其中一个 VALUES(或之前的 INTERSECTION 之一)为 [] 空,您可以立即短路(返回 false)而无需进一步评估。

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

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

    编辑 UNION -> INTERSECTION 很好的捕捉@ElKamina

    【讨论】:

    • 联合?你是说INTERSECTION?
    猜你喜欢
    • 2020-08-07
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 2015-10-26
    • 2020-04-21
    • 2014-06-26
    相关资源
    最近更新 更多