表格存储 SQL 查询多元索引
简介: 多元索引是表格存储产品中一个重要的功能,多元索引使用倒排索引技术为表格存储提供了非主键列上的快速检索功能,另外也提供了统计聚合功能。表格存储近期开放了SQL查询功能,SQL引擎默认从原始表格中读取数据,非主键列上的查询需要扫描全表。
作者 | 政豪
来源 | 阿里技术公众号
多元索引是表格存储产品中一个重要的功能,多元索引使用倒排索引技术为表格存储提供了非主键列上的快速检索功能,另外也提供了统计聚合功能。表格存储近期开放了SQL查询功能,SQL引擎默认从原始表格中读取数据,非主键列上的查询需要扫描全表。开启了多元索引之后,如果一个查询的过滤条件或者统计聚合可以下推至多元索引执行,那么SQL引擎将部分查询计划转换为多元索引请求,将从多元索引中获取数据,提高查询效率。
一 多元索引SQL算子支持
1 前提条件
在使用SQL查询多元索引之前,首先需要在表格上创建多元索引。如果多元索引包含SQL语句中涉及的数据列,则SQL引擎会通过多元索引读取数据并下推多元索引支持的算子。例如有一张表exampletable有a, b, c, d四列,多元索引中包含了b, c, d三列,只有当SQL语句中只涉及b, c, d中的数据列时,才会从多元索引读取数据。
SELECT a, b, c, d FROM exampletable; /* 多元索引不包含a,b,c,d,扫描全表读取数据,不支持算子下推 */
SELECT b, c, d FROM exampletable; /* 多元索引包含b,c,d,通过多元索引读取数据,支持算子下推 */

2 支持下推的算子
二 多元索引SQL查询实战
为了直观地展示SQL查询多元索引功能,下文将以某自行车租赁商的订单表为例,使用多元索引上的SQL功能完成一些简单的查询分析任务。某自行车租赁商的订单表如下:
整张表格名为trips,每一笔租车订单都有唯一的订单号作为主键,订单中记录了租车时长、开始日期、结束日期、开始站点、结束站点等信息。表格中包含120万行数据,在没有开启多元索引的情况下对表格行数进行统计,查询会因为超出扫描配额限制而终止。
同样地,如果以非主键列作为查询条件进行查询,也会因为涉及全表扫描超过扫描配额而被终止。
为了能够根据非主键列的值进行查询以及统计聚合,需要创建覆盖全部数据列的多元索引。对于数据量比较大的表格,需要较长的时间等待多元索引同步完成。
1 过滤条件下推
在开启多元索引之后,即可在非主键列上进行条件查询。例如,下图查询起点编号31208到起点编号31209的租车订单,借助多元索引,SQL引擎能够在500毫秒之内查询到全表中满足条件的140行记录。
多元索引支持多个条件的组合,例如查询2010年10月1日当天,站点31208的订单。由于外国10月1日不放假,那天的订单数量并不是很多。
2 统计聚合下推
除了非主键列查询,多元索引还提供了强大的统计聚合能力。在未创建多元索引的时候无法统计行数,但是有了多元索引,能在500毫秒左右查询到行数、站点数、平均租车时长等信息。
同样地,分组统计聚合也可以快速获取结果,例如列出每个站点总订单数目。
过滤条件和统计聚合可以一起使用,例如查询2010年10月1日当天每个站点订单数目。
3 TopN下推
SQL中包含ORDER BY和LIMIT的语句成为TopN查询,多元索引支持快速查询TopN,图中的查询展示了最近的10条数据。
本文为阿里云原创内容,未经允许不得转载。
表格存储 SQL 查询多元索引的更多相关文章
- 只需一步,DLA开启TableStore多元索引查询加速!
一.背景介绍 Data Lake Analytics(简称DLA)在构建第一天就是支持直接关联分析Table Store(简称OTS)里的数据,实现存储计算分离架构,满足用户基于SQL接口分析Tabl ...
- 索引 使用use index优化sql查询
好博客:MySQL http://webnoties.blog.163.com/blog/#m=0&t=1&c=fks_08407108108708107008508508609508 ...
- sql查询调优之where条件排序字段以及limit使用索引的奥秘
奇怪的慢sql 我们先来看2条sql 第一条: select * from acct_trans_log WHERE acct_id = 1000000000009000757 order b ...
- T-SQL查询进阶--理解SQL Server中索引的概念,原理以及其他
简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,SQL Server仍然可以实现应有的功能.但索引可以在大多数情况下大大提升查询性能,在OLAP中尤其明显.要完全理解索 ...
- SQL存储原理及聚集索引、非聚集索引、唯一索引、主键约束的关系(补)
索引类型 1. 唯一索引:唯一索引不允许两行具有相同的索引值 2. 主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型.主键索引要求主键中的 ...
- T-SQL查询进阶--理解SQL Server中索引的概念,原理
简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,sql server仍然可以实现应有的功能,但索引可以在大多数情况下提升查询性能,在OLAP(On line Trans ...
- 【转】同一个SQL查询语句,为什么使用到的索引不同?
问: 同一个SQL查询语句,只是修改where条件中的一个值,为什么使用到的索引情况也会不同?谢谢! 1) explain执行结果,如下图: 2) 表中的数据如下图: 3) 表结构如下图: 4) 创建 ...
- sql查询未走索引问题分析之查询数据量过大
前因: 客户咨询,有一个业务sql(代表经常被执行且重要),全表扫描在系统占用资源很高(通过ash报告查询得到信息) 思路: 1.找到sql_text,sql_id 2.查看执行计划 3.查询sql涉 ...
- sql server 表变量存储临时查询数据
对于使用sql server 编写存储过程或者类似的sql 查询的时候我们使用表变量进行临时数据的存储,可以方便我们进行下来的数据处理 表变量的使用类似如下: declare @userinfo ta ...
- MySQL 基本语法(1.表字段操作,2表记录管理 3.运算符管理4.SQL查询 5.约束6.索引
.表字段的操作 .语法:alter table 表名 执行动作; .添加字段(add) .添加到末尾 alter table 表名 add 字段名 数据类型; .添加到第一列 alter table ...
随机推荐
- .NET Emit 入门教程:第一部分:Emit 介绍
前言: Emit 是开发者在掌握反射的使用后,进阶需要的知识,它能显著的改善因反射带来的性能影响. 目前能搜到的 Emit 的相关文章,都是一篇系列,通常推荐对照着反绎后的 IL 编写 Emit 代码 ...
- rust结构体包含另一个结构体引用时,serde序列化问题
代码如下 use serde::{Deserialize, Serialize}; #[derive(Serialize, Deserialize)] struct Person { id: Stri ...
- 【K8S】如何进入kubernetes的一个pod
如何进入kubernetes的一个pod呢,其实和进入docker的一个容器相似: 进入docker容器 : docker exec -ti <your-container-name> / ...
- KingbaseES V8R6集群运维案例之---sys_monitor.sh start启动动态库错误
案例说明: 在KingbaseES V8R6集群部署了postgis后,执行sys_monitor.sh start启动集群时,出现动态库错误,如下图所示: 适用版本: KingbaseES V8R6 ...
- arch xfce启用自动挂载usb设备,自动访问usb设备,自动连接usb设备
1.安装gvfs sudo pacman -S gvfs GVFS(Gnome Virtual File System)是一个用于 GNOME 桌面环境的虚拟文件系统,它提供了一种统一的方式来访问和管 ...
- 【已解决】Android学习---注册和登录功能模块合并报错以及解决办法
问题① 我在另外一个项目里写了一个注册和登录功能的几个文件,当我想把这些代码和另一个文件合起来的时候就出现了问题. 首先不可以直接把另外一个项目的某个文件直接复制过来, 最好的办法是重新新建一个相同名 ...
- 记打包的2个错误-项目BotBattle
目录 记打包项目的 2 个错误 0.概述 1.spring-boot-maven-plugin 版本 1.1 问题 1.2 添加版本号 2.总项目 2.1 问题 2.2 核验主类 2.3backend ...
- 深入了解 Java 方法和参数的使用方法
Java 方法 简介 方法是一块仅在调用时运行的代码.您可以将数据(称为参数)传递到方法中.方法用于执行特定的操作,它们也被称为函数. 使用方法的原因 重用代码:定义一次代码,多次使用. 提高代码的结 ...
- Python 函数:定义、调用、参数、递归和 Lambda 函数详解
函数是一段代码块,只有在调用时才会运行.您可以将数据(称为参数)传递给函数. 函数可以返回数据作为结果. 创建函数 在Python中,使用def关键字定义函数: 示例 def my_function( ...
- Qt线程简单使用二:QObject~创建任务类
需求: 点击QPushButton按钮,QLabel中的数字,不断累加,一直到999. 做法: 创建任务类,用来完成任务,创建子线程,将任务类放到子线程中,点击QPushButton后,先发送 ...