本节书摘来自异步社区出版社《NoSQL权威指南》一书中的第2章,第2.3节,作者:【美】Joe Celko(乔•塞科) ,更多章节内容可以访问云栖社区“异步社区”公众号查看。
2.3 查询优化
有些列式数据库使用基于行的优化器,抵消了列式存储很多的优势。它们在具体化“行”之前在查询执行时使用基于行的优化器进行优化处理(只组装查询的列,实际上是做选择和投影)。基于列的优化可以将选择和投影分为单独的操作,这是MapReduce算法的一个版本(这些算法稍后会加以解释)。
目标是在查找实际的数据值前,获取尽可能多的行数。如果你能并行地收集列会更好。很显然,因为列中的数据已经完成,映射将首先开始。但选择操作需要尽快执行。
请注意,我刚才提到来自一个域的列。大多数实际数据库中完成的联结是等值联结,这意味着在不同表中的列都是来自同一个域,并且匹配相同的值。特别是,PRIMARY KEY及其引用FOREIGN KEY都必须在同一个域中。PRIMARY KEY列包含表的唯一值,而FOREIGN KEY可能是一对多的。
我们可以在列描述符中添加表的名字,使之成为域描述符:{table_name, start_position, end_position, data_value}。该载体可以是相当紧凑的,一个模式很少有200多万张可以用简单的整数进行建模的表。这种结构使某些连接操作转换为单域结构扫描。索引可以定位域描述符中的每个表的开始,并行访问相关的表。