简析MDAM之Sparse vs Dense

当一个查询语句对索引中的首字段是范围查询或者没有首字段过滤条件时,MDAM需要遍历索引并确定范围内的每一个值。正如前面一篇文章http://blog.csdn.net/post_yuan/article/details/79277974 中的第二张图所描述,MDAM之所以不需要扫描全表,是因为MDAM首先会遍历INDEX,找到满足dimension_3=’2’条件的所有dimension_1和dimension_2可能的值,然后去除无用的数据,达到只扫描需要的数据。这有两种方式可以实现,依据字段是Sparse(稀疏的)类型还是Dense(密集的)类型。

Dense类型表示查询条件某个字段有所有(或几乎所有)种可能的值。假如某个字段有100个唯一的值,查询此字段的条件范围为0~99,那么我们认为此字段为Dense类型。当确定一个字段是Dense类型,MDAM只需要每次通过对之前的值+1来寻找下一个满足条件的值。

Dense举例
表Sales字段为(dept,date,item_class,store,item)
其中索引/KEY字段为(dept,date,item_class,store)
查询SQL如下,

SELECT date, sum(total_sales)
FROM sales
WHERE
date = "06/01/95"
and item_class = 20
and store = 250
GROUP BY dept, date;

上述语句缺失dept条件,其中dept为索引的首字段。一般的关系型数据库对于这种场景几乎没有办法利用上述索引,只能选择全表扫描。MDAM会将此SQL处理成where dept between MIN_VALUE and MAX_VALUE and …。假设dept的值为1~100,MDAM首先查找到dept=1并获取dept=1, date=”06/01/95”, item_class=20, store=250的所有记录(我们称之为ACCESS),
之后使用dept加1,即dept=2来获取所有符合条件的记录,依次类推。对于此场景而言,总共需要执行100次ACCESS。

Sparse类型表示查询条件中某个字段至少10%的值不存在。MDAM对Sparse类型字段和Dense类型字段处理方式不同。对于Sparse类型,MDAM使用探针(probe)的方式去查询下一个符合条件的值。举个例子,某个查询在日期字段上的条件范围为其中不连续的4个日期值,并且日期字段有很多个唯一的值,那么我们认为此字段为Sparse类型。

Sparse举例
表Sales字段为(dept,date,item_class,store,item)
其中索引/KEY为(dept,date,item_class,store)
查询SQL如下,

SELECT date, sum(total_sales)
FROM Sales
WHERE dept = 10
and date between "06/01/95" and "06/30/95"
and item_class = 20
and store = 250
GROUP BY dept, date;

假设date字段在between”06/01/95” and “06/30/95”条件中的值有06/04/95, 06/11/95, 06/18/95, 06/25/95,MDAM首先查找第一个大于等于”06/01/95”的值”06/04/95”并获取所有满足dept=10, date=”06/04/95”, item_class=20, store = 250的记录(我们称之为ACCESS),接着查看第一个大于”06/04/95”的值”06/11/95”并获取所有满足dept=10, date=”06/11/95”, item_class=20, store = 250的记录,以此类推。对于此场景而言,总共需要执行4次probe查找符合条件的date值,然后执行4次ACCESS动作。由于probe的开销相对很小,而且每次ACCESS可以使用索引扫描,这种查询的性能将十分高效。而传统数据库在此场景时在store和item字段的索引将根本无法使用。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据源的港湾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值