Hologres SQL

1.SQL基础

1.1 DDL

创建数据库

CREATE DATABASE db_name [[WITH] OWNER [=] user_name];
  • 创建者自动成为新DB的owner
  • 用户需要有CREATEDB权限(或者superuser)

删除数据库

DROP DATABASE [IF EXISTS] db_name;
  • 只有该数据库的superuser或者该db的owner才能删除该数据库
  • 删除数据库会移除其中包括的所有对象
  • 不能在与目标数据库连接时执行DROP命令,但可以来连接到其他任意数据库

创建数据表

CREATE TABLE [IF EXISTS]
[schema_name.]table_name
([{column_name column_type [column_constraints, [...]]| table_contraints[, ...]
}]);
  • 在创建表时,如果不存在同名表且语义正确,表创建都会返回成功
  • 如果存在同名表:如果比指定IF NOT EXISTS选项,则返回异常;如果指定IF NOT EXISTS 选项,Holo会打印提示信息,跳过表创建步骤,返回成功

删除表

DROP TABLE [IF EXISTS] table_name [, ...];
  • DROP TABLE支持一次DROP多个表
  • 如果指定IF EXISTS,无论表存在与否,都会返回成功
  • 如果不指定IF EXISTS 选项而表不存在,则返回异常:ERROR:table “xxx” does not exist.

修改表
仅支持重命名表(RENAME TABLE)和增加列(ADD CPLUMN)。对于外部表(foreign table)没有限制

-- 重命名表
ALTER TABLE table_name RENAME to new_table_name;-- 增加列
ALTER TABLE IF EXISTS table_name ADD COLUMN new_column_name data_type;

增加注释
Holo支持给表,外表,列等增加注释的功能

-- 给表增加注释
COMMENT ON TABLE table_name IS 'my comments on table table_name';-- 给列增加注释
COMMENT ON COLUMN table_name.col1 IS 'This my first col1';-- 给外部表增加注释
COMMENT ON FOREIGN TABLE foreign_table IS 'comment on my foreign table';

模式(SCHEMA)

  • 一个数据库可以包含多个schema
  • 多个用户使用一个数据库不会互相干扰,也便于管理
  • 每个DB有一个默认的public schema
  • Holo支持create schema、alter schema rename 暂时不支持drop schema
-- 查看当前schema
SELECT current_schema();-- 创建新的schema
CREATE SCHEMA my_schema;-- 跨schema建表
CREATE TABLE my_schema.mytest (name text, id int, age int);-- 原schema下的表将全部转到新schema下
ALTER SCHEMA oldschema rename to newschema;

分区表
PostgreSQL分区表用于将一张大表分成同构的若干张子表,利于加速查询、方便管理

-- 创建分区表
CREATE TABLE [IF NOT EXISTS] [schema_name.]table_name PARTITION OF parent_table FOR VALUES IN (string_literal);-- 分离目标表的指定分区
ALTER TABLE [IF EXISTS] table_name DETACH PARTITION partition_name;-- 删除分区表
DROP TABLE table_name;

外部表
指不存储于Hologres中的表。Hologres与大数据生态无缝打通,可对外部表直接加速查询,也可以将外部表的数据导入到Hologres中进行数据处理
目前Holo只支持MaxCompute中的表作为外部表

-- 新建外部表
CREATE FOREIGN TABLE src_pt_odps(key text)
server odps_server options(project_name 'odps_project', table_name 'test');-- 删除外部表
DROP FOREIGN TABLE [IF EXISTS] table_name [, ...]
[ CASCADE | RESTRICT];-- 查看外部表
SELECT * FROM table_name;

** CREATE CAST 用于定义数据类型之间的转换**

CREATE CAST(source_type AS target_type)WITH INOUT[ AS ASSIGNMENT | AS IMPLICIT]注:
source_type:该转换的源数据类型
targer_type:该转换的目标数据类型示例:创建数据类型之间的转换CREATE CAST (text AS integer) WITH INOUT AS IMPLICIT;

** DROP CAST语句用于删除已定义的数据类型转换

DROP CAST [IF EXISTS] (source_type AS targer_type)示例:
DROP CAST IF EXISTS (text AS timestamptz);
DROP CAST IF EXISTS (text AS integer);

创建视图

CREATE [TEMP | TEMPORARY] VIEW
view_name AS
SELECT column1, column2 ...
FROM table_name
WHERE [condition];-- 创建内部表视图
create view view1 as select * from t1_foreign;-- 创建内部表及外部表的联合视图
create view view2 as select * from t2_holo 
union all
select * from t1_foreign;

删除视图

DROP VIEW <view_name>;

1.2 DML

插入

INSERT INTO table[(column [,...])] VALUES ({expression} [,...]) [, ...] | query在Hologres中,INSERT支持两种形式
1.插入确定的value
INSERT INTO rh_holo2 (cate_id, cate_name) VALUES
(3, 't1'),
(3, 'f1'),
(3, 'trxxue'),
(3, 'x'),
(4, 'sajojsaio');2.插入select的结果
INSERT INTO test2
SELECT * FROM test1;

DELETE:对表指定列的行数据进行删除

DELETE FROM table_name [*]
[ [AS] alias] [WHERE condition]alias:别名,目标表的替代名称
condition:删除的条件用法举例:
DELETE FROM delete_test AS dt WHERE dt.a = 10;
DELETE FROM delete_test AS dt WHERE dt.b is null;
DELETE FROM delete+test AS dt WHERE dt.b = "";

UPDATE:对表指定列的行数据进行更新

UPDATE table [*] [ [AS] alias]
SET column = {expression}
[ FROM from_list] [WHERE condition]alias:别名,目标表的代称
expression:表达式
condition:更新条件举例:
UPDATE update_test set b = b + 10 where a = 'b1';UPDATE update_test set c = 'new_' || a, d = null
where b = 20;UPDATE update_test set (b,c,d) = (1,"test_c","d");

SELECT查询语法

[WITH with_query [, ...]]
SELECT [ALL | DISTINCT [ ON (expression [, ...])]]
* | expression [[AS] output_name] [, ...]
[FROM from_item [, ...]]
[WHERE condition]
[GROUP BY grouping_element [, ...]]
[HAVING condition [, ...]]
[{UNION | INTERSECT | EXCEPT} [ALL] SELECT]
[ORDER BY expression [ASC | DESC | USING operator] [, ...]]
[LIMIT {count | ALL}]DISTINCT:取出重复行,只保留一行
FROM:为SELECT指定一个或更多源表
WHERE:展示condition指定的内容
GROUP BY:按照指定的表达式分组
HAVING:过滤
UNION:SELECT语句所返回的行的并集
INTERSECT:select语句返回的行的交集
EXCEPT:计算位于左SELECT语句的结果中但不在右SELECT语句结果中的行集合
ORDER BY:按照指定的表达式排序
LIMIT:count指定要返回的最大行数示例:
select * from sale_detail where shop_name like 'hang%';
从sale_detail表中查询所有带hang的店铺select region from sale_detail group by region;
从sale_detail表中查询region信息并以region进行分组select * from sale_detail order by region limit 100;
从sale_detail表中查询region信息并以region排序数据100行

UNION并集
求两个数据集的并集。即,将两个数据集合并成一个数据集

未去重:
SELECT * FROM VALUES (1, 2), (1, 2), (3, 4) t(a, b)
UNION ALL
SELECT * FROM VALUES (1, 2), (3, 4) t(a, b);去重:
SELECT * FROM VALUES (1, 2), (1, 2), (3, 4) t(a, b)
UNION
SELECT * FROM VALUES (1, 2), (3, 4) t(a, b);

INTERSECT交集
求两个数据集的交集。即,数据两个数据集均包含的记录

未去重:
SELECT * FROM VALUES (1, 2), (1, 2), (3, 4) t(a, b)
INTERSECT ALL
SELECT * FROM VALUES (1, 2), (1, 2), (7, 8) t(a, b);去重:
SELECT * FROM VALUES (1, 2), (1, 2), (3, 4) t(a, b)
INTERSECT
SELECT * FROM VALUES (1, 2), (1, 2), (7, 8) t(a, b);

EXCEPT补集
求第二个数据集在第一个数据集中的补集。即,输出第一个数据集包含而第二个数据集不包含的记录

未去重:
SELECT * FROM VALUES (1, 2), (1, 2), (3, 4) t(a, b)
EXCEPT ALL
SELECT * FROM VALUES (1, 2), (1, 2), (7, 8) t(a, b);去重:
SELECT * FROM VALUES (1, 2), (1, 2), (3, 4) t(a, b)
EXCEPT
SELECT * FROM VALUES (1, 2), (1, 2), (7, 8) t(a, b);

INSERT ON CONFLICT语句用于在指定列插入某行数据时,如果主键存在重复的行数据,则对该数据执行更新或跳过操作
应用场景:适用于SQL方式导入数据的场景

create table conflict_2(a int not null primary key,b int,c int
);insert into conflict_2 values(1,5,6);insert into conflict_1 select * from conflict_2 on conflict(a) do update set b = excluded.b; //主键相同时,将表conflict_2的列数据更新到conflict_1中insert into conflict_1 values(2,7,8) on conflict(a) do update set b = excluded.b, c = excluded,c
where conflict_1.c = 4; //主键值相同时,将表conflict_2的某一行数据全部插入至表conflict_1中insert into conflict_1 select * from conflict_2 on conflict(a) do nothing; //主键相同时,跳过表conflict_2的数据insert into conflict_1 select * from conflict_2 on conflict do nothing; //do nothing不指定冲突列时,默认冲突列为主键

TRUNCATE语句用于清空目标表
使用限制:

  • Hologres支持Sequence,但目前仅支持CONTINUE IDENTITY,不支持RESTART IDENTITY
  • Hologres支持对普通表、分区父表及分区子表执行TRUNCATE语句
  • Hologres不支持对外部表执行TRUNCATE语句
TRUNCATE [TABLE] name [, ...] [CONTINUE IDENTITY | RESTART IDENTITY]# 默认为CONTINUE IDENTITY

2.SQL高阶

2.1 存储属性设置

  • Hologres目前通过set_table_property procedure来指定表的额外物理存储属性,合理设置table property对于查询的性能影响极大
  • set_table_property的调用需要与create table在同一事务中执行
  • set_table_property对于同一个key不能重复调用
call set_table_property('table_name', 'orientation', '[column | row]');
call set_table_property('table_name', 'clustering_key', '[columnName{: [desc | asc]} [, ...]]');
call set_table_property('table_name', 'segment_key', '[columnName [, ...]]');
call set_table_property('table_name', 'bitmap_columns', '[columnName [, ...]]');
call set_table_property('table_name', 'dictionary_encoding_columns', '[columnName [,...]]');
call set_table_property('table_name', 'time_to_live_in_seconds', '<non_negative_literal>');
call set_table_property('table_name', 'distribution_key', '[columnName [, ...]]');

2.2 存储类型设置

  • Hologres目前支持按行存储和按列存储两种存储类型,通过orientation来指定
  • 按行存储对于高QPS的基于primary key的点查询性能较好,例如where pk = abc,其余场景应该选用按列存
# 按行存
begin;
create table tb1 (a int not null, b text not null, primary key(a));
call set_table_property("tb1", "orientation", "row");
commit;# 按列存
begin;
create table tb1 (a int not null, b text not null, primary key(a));
call set_table_property("tb1", "orientation", "column");
commit;

2.3 聚簇键设置

  • clustering_key 指定一列作为聚簇索引,Hologres在指定的列上将建立聚簇索引。Hologres会在聚簇索引上对数据进行排序,建立聚簇索引能够加速用户在索引列上的range和filter查询
  • 数据类型为float/double的列,不能设置为clustering_key
  • 每个表只能有最多一个聚簇索引
begin;
create table tb1 (a int not null, b text not null);
call set_table_property('tb1', 'clustering_key', 'a');
commit;

2.4 分段键设置

  • segment_key指定一些列作为分段键,当查询条件包含分段列时,查询可以通过segment_key快速找到相应数据对应的存储位置,segment_key要求按照数据输入自增
  • 一般只有时间类型的字段(timestamptz)适合设置为segment_key,其他场景基本不需要设置
  • 只有列存表支持分段键
begin;
create table tb1 (a int not null, ts timestamp not null);
call set_table_property('tb1', 'segment_key', 'ts');
commit;

2.5 比特编码列设置

  • bitmap_columns指定比特编码列,Hologres在这些列上构建比特编码。bitmap可以对segment内部的数据进行快速过滤,所以建议用户把filter条件的数据建成比特编码
  • 默认所有text列都会被隐式地设置到bitmap_columns中
  • 只有列存表支持比特编码列
begin;
create table tb1 (a int not null, b text not null);
call set_table_property('tb1', 'bitmap_columns', 'a');
commit;

2.6 字典编码列设置

  • dictionary_encoding_columns指定字典编码列,Hologres为指定列的值构建字典映射,字典编码可以将字符串的比较转成数字的比较,加速group by查询,建议用户将group by的字段都建成dictionary_encoding_columns
  • 默认所有text列都会被隐式地设置到dictionary_encoding_columns中
  • 不建议将基数高的列建为dictionary_encoding_columns,会导致查询性能变差
  • 只有列存表支持字典编码列
begin;
create table tb1 (a int not null, b text not null);
call set_table_property('tb1', 'dictionary_encoding_columns', 'b');
commit;

2.7 分布键设置

  • Hologres中,数据库表默认为随机分布形式。数据将被随机分配到各个shard上,如果用户制定了分布列,数据将按照指定列,将数据shuffle到各个shard,同样的数据肯定会在同样的shard中,当用户以分布列左过滤条件时,Hologres可以直接筛选出数据相关的shard进行扫描。当用户以分布列做join条件时,Hologres不需要再次将数据shuffle到其他计算节点,直接在本节点join数据即可,可大大提高执行效率。同时如果用户group by的key的时分布列也可以减少一次数据shuffle
  • 有pk的数表,默认时pk,可以指定pk字段的子集,不能随意指定
  • 用户可以用过shard_count来指定表的shard数,如果不指定每个数据库都有一个默认的shard数。一旦用户指定了一个表的shard数,其他的表如果想要和这个表做local join必须指定colcate with这个表
begin;
create table tb1 (a int, b int, c int);
call set_table_property('tb1', 'distribution_key', 'a');
commit;begin;
create table tb2 (a int, b int, c int);
call set_table_property('tb1', 'distribution_key', 'b');
commit;select count(1) from tb1 join tb2 on tb1.a = tb2.b;  -- 将分布列设置为join key

2.8 数据生命周期管理

  • time_to_live_in_seconds 指定了表数据的生存时间,单位为秒,必须非负数字类型
  • 表数据的TTL并不是精确的时间,当超过设置的TTL后,系统会在某一个时间自动删除表数据,所以业务逻辑不能强依赖TTL
begin;
create table tb1 (a int not null, b text not null);
call set_table_property('tb1', 'time_to_live_in_seconds', '3.1415926');
commit;

2.9 性能调优

用过explain查看执行计划
执行analyze,生成统计信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/5713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jmeter压测过程中,ServerAgent响应异常:Cannot send data to network connection

ServerAgent异常信息&#xff1a; Cannot send data to network connection&#xff08;无法将数据发送到网络连接&#xff09; 原因&#xff1a; linux 防火墙 拦截了当前端口 解决方案&#xff1a; Linux 执行以下命令 /sbin/iptables -I INPUT -p tcp --dport 4445 -j ACC…

数学建模入门-如何从0开始,掌握数学建模的基本技能

一、前言 本文主要面向没有了解过数学建模的同学&#xff0c;帮助同学们如何快速地进行数学建模的入门并且尽快地在各类赛事中获奖&#xff0c;或者写出优秀的数学建模论文。 在本文中&#xff0c;我将从什么是数学建模、数学建模的应用领域、数学建模的基本步骤、数学建模的技…

【python】如何包装 numpy 的数组

一、说明 Numpy的数组是强大的对象&#xff0c;通常用作更复杂的对象&#xff08;如pandas或xarray&#xff09;的基本数据结构。话虽如此&#xff0c;您当然也可以在自己的类中使用numpy的强大数组 - 为此&#xff0c;您基本上有2种方法&#xff1a; 子类方法&#xff1a;创建…

【动手学深度学习】--12.深度卷积神经网络AlexNet

文章目录 深度卷积神经网络AlexNet1.AlexNet2.模型设计3.激活函数4.模型实现5.读取数据集6.训练AlexNet 深度卷积神经网络AlexNet 学习视频&#xff1a;深度卷积神经网络 AlexNet【动手学深度学习v2】 官方笔记&#xff1a;深度卷积神经网络&#xff08;AlexNet&#xff09; …

Android 中 app freezer 原理详解(一):R 版本

基于版本&#xff1a;Android R 0. 前言 在之前的两篇博文《Android 中app内存回收优化(一)》和 《Android 中app内存回收优化(二)》中详细剖析了 Android 中 app 内存优化的流程。这个机制的管理通过 CachedAppOptimizer 类管理&#xff0c;为什么叫这个名字&#xff0c;而不…

【Linux | Shell】结构化命令2 - test命令、方括号测试条件、case命令

目录 一、概述二、test 命令2.1 test 命令2.2 方括号测试条件2.3 test 命令和测试条件可以判断的 3 类条件2.3.1 数值比较2.3.2 字符串比较 三、复合条件测试四、if-then 的高级特性五、case 命令 一、概述 上篇文章介绍了 if 语句相关知识。但 if 语句只能执行命令&#xff0c…

Docker 的数据管理、容器互联、镜像创建

目录 一、数据管理 1.数据卷 2. 数据卷容器 二、容器互联&#xff08;使用centos镜像&#xff09; 三、Docker 镜像的创建 1.基于现有镜像创建 1.1首先启动一个镜像&#xff0c;在容器里修改 1.2将修改后的容器提交为新的镜像&#xff0c;需使用该容器的id号创建新镜像 …

JAVA SE -- 第十天

&#xff08;全部来自“韩顺平教育”&#xff09; 一、枚举&#xff08;enumeration&#xff0c;简写enum&#xff09; 枚举是一组常量的集合 1、实现方式 a.自定义类实现枚举 b.使用enum关键字实现枚举 二、自定义类实现枚举 1、注意事项 ①不需要提供setXxx方法&#xff…

HTTP、HTTPS协议详解

文章目录 HTTP是什么报文结构请求头部响应头部 工作原理用户点击一个URL链接后&#xff0c;浏览器和web服务器会执行什么http的版本持久连接和非持久连接无状态与有状态Cookie和Sessionhttp方法&#xff1a;get和post的区别 状态码 HTTPS是什么ssl如何搞到证书nginx中的部署 加…

【从删库到跑路】MySQL数据库的索引(一)——索引的结构(BTree B+Tree Hash),语法等

&#x1f38a;专栏【MySQL】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 &#x1f970;欢迎并且感谢大家指出小吉的问题 文章目录 &#x1f354;概述&#x1f354;索引结构⭐B-Tree多路平衡查找树&#x1f3f3;️‍&a…

【iOS】weak关键字的实现原理

前言 关于什么是weak关键字可以去看看我以前的一篇博客&#xff1a;【OC】 属性关键字 weak原理 1. SideTable SideTable 这个结构体&#xff0c;前辈给它总结了一个很形象的名字叫引用计数和弱引用依赖表&#xff0c;因为它主要用于管理对象的引用计数和 weak 表。在 NSOb…

(笔记)快速排序

快速排序 快速排序是一种常用的排序算法。它的时间复杂度为O(nlogn)&#xff0c;并且在实际应用中表现良好。快速排序的基本思想是通过选择一个基准数&#xff0c;将数组分成两个子数组&#xff0c;比基准数小的放在左边&#xff0c;比基准数大的放在右边&#xff0c;然后对左…

Vite + Vue3 + Ts 【免key、免账号实战本地运行GPT】

&#x1f414; 前期回顾 Vue3 Ts Vite —— 封装庆祝彩屑纷飞 示例_彩色之外的博客-CSDN博客封装 彩屑纷飞 示例https://blog.csdn.net/m0_57904695/article/details/131718019?spm1001.2014.3001.5501 目录 &#x1f30d; 公网 &#x1f6f9; 本地 &#x1fa82; 源码 &…

【前端|CSS系列第4篇】CSS布局之网格布局

前言 最近在做的一个项目前台首页有一个展示词条的功能&#xff0c;每一个词条都以一个固定大小的词条卡片进行展示&#xff0c;要将所有的词条卡片展示出来&#xff0c;大概是下面这种布局 每一行的卡片数目会随着屏幕大小自动变化&#xff0c;并且希望整个卡片区域周围不要…

20230721 Essex UK, Dongbing Gu 公开讲座--机器人前沿

个人主页&#xff1a; https://www.essex.ac.uk/people/GUDON81301/dongbing-gu 机器人领域任务的特点&#xff1a;dull, dirty, dangerous tasks in remote spaces 机器鱼&#xff1a; 实时港口环境监测 机器鱼群探索算法 化学传感器 水面声呐定位系统/SLAM/通信问题 Robotic …

C—数据的储存(下)

文章目录 前言&#x1f31f;一、练习一下&#x1f30f;1.例一&#x1f30f;2.例二&#x1f30f;3.例三&#x1f30f;4.例四 &#x1f31f;二、浮点型在内存中的储存&#x1f30f;1.浮点数&#x1f30f;2.浮点数存储&#x1f4ab;&#xff08;1&#xff09;.二进制浮点数&#x…

QDialog的两种显示方式

QDialog的两种显示方式 模态显示非模态显示 QDialog不能嵌入到其他窗口中显示&#xff08;无论继承与否&#xff09; 模态显示 d->exec(); 阻塞程序的执行 非模态显示 d->show(); 不阻塞程序

OpenCV4图像处理-图像交互式分割-GrabCut

本文将实现一个与人&#xff08;鼠标&#xff09;交互从而分割背景的程序。 GrabCut 1.理论介绍2. 鼠标交互3. GrabCut 1.理论介绍 用户指定前景的大体区域&#xff0c;剩下为背景区域&#xff0c;还可以明确指出某些地方为前景或者背景&#xff0c;GrabCut算法采用分段迭代的…

MySQL主从复制与读写分离

文章目录 一.前言二.主从复制原理1.MySQL的复制类型2.MySQL主从复制的工作过程2.1 MysQL主从复制延迟原因2.2问题解决方法2.3 MySQL 有几种同步方式2.3.1 异步复制2.3.2 同步复制2.3.3 半同步复制2.3.4 增强半同步复制&#xff08;lossless Semi-Sync Replication、无损复制&am…

消息队列 CKafka 跨洋数据同步性能优化

导语 本文主要介绍了 CKafka 在跨洋场景中遇到的一个地域间数据同步延时大的问题&#xff0c;跨地域延时问题比较典型&#xff0c;所以详细记录下来做个总结。 一. 背景 为了满足客户跨地域容灾、冷备的诉求&#xff0c;消息队列 CKafka 通过连接器功能&#xff0c;提供了跨…