基于`IRIS`列存储,我们能做什么

news2024/11/16 15:33:53

文章目录

  • 基于`IRIS`列存储,我们能做什么
    • 简介
    • 使用场景
    • 如何使用列存储
    • 什么情况下使用列储存
      • 统计数据数量`count`
      • 计算字段平均值`avg`
      • 计算字段和`sum`
    • 列存储与行存储区别
    • 总结

基于IRIS列存储,我们能做什么

简介

列存储是一种数据存储方式,与传统的行存储数据库(如关系数据库)不同。在列存储中,数据被存储在列中,而不是行中。

这种存储方式的主要优点在于,它可以更有效地存储和查询结构化数据,特别是需要执行大量聚合查询的数据。列存储数据库通常具有高性能,可以快速处理大量数据,并且适用于分析型数据仓库,时序数据,设备数据等。

列存储数据库通常使用NoSQLNot Only SQL)数据库技术,并且不需要严格的数据模式。因此,它们更加灵活,可以快速适应数据变化,并且适用于处理大量数据。

使用场景

  • 提高查询性能:列存储将同一列的数据存储在一起,减少了需要读取的磁盘块数量,因此在查询时可以更快地检索需要的数据,特别是当查询需要检索一部分列时,列存储可以提供更好的查询性能。
  • 提高压缩比率:列存储可以使用列级别的压缩算法,由于同一列的数据通常具有相似性质,因此可以使用更高效的压缩算法,从而减少存储空间。
  • 支持大规模数据分析:列存储是大规模数据分析的关键技术之一,因为它可以对大量的数据进行快速的分析和计算。通过将同一列的数据存储在一起,可以提供更高效的数据分析和聚合功能。

如何使用列存储

定义列存储需要在持久类中添加参数 STORAGEDEFAULT = "columnar并上类关键字Final

定义User.Person表如下:

Class User.Person Extends %Persistent [ DdlAllowed, Final ]
{

Parameter STORAGEDEFAULT = "columnar";

Property Name As %String [ SqlColumnNumber = 2 ];

Property Number As %Integer [ SqlColumnNumber = 3 ];

Property Price As %Integer [ SqlColumnNumber = 4 ];

Property Amout As %Integer [ SqlColumnNumber = 5 ];


}

编译该类会产生如下所示的存储定义:

Storage Default
{
<Data name="_CDM_Amout">
<Attribute>Amout</Attribute>
<Structure>vector</Structure>
</Data>
<Data name="_CDM_Name">
<Attribute>Name</Attribute>
<Structure>vector</Structure>
</Data>
<Data name="_CDM_Number">
<Attribute>Number</Attribute>
<Structure>vector</Structure>
</Data>
<Data name="_CDM_Price">
<Attribute>Price</Attribute>
<Structure>vector</Structure>
</Data>
<DataLocation>^User.PersonD</DataLocation>
<IdLocation>^User.PersonD</IdLocation>
<IndexLocation>^User.PersonI</IndexLocation>
<StreamLocation>^User.PersonS</StreamLocation>
<Type>%Storage.Persistent</Type>
}

此存储定义看起来与为标准类定义创建的定义略有不同,后者使用传统的基于行的存储布局。虽然Global名称相同,但每个使用列式存储的属性都有一个 <Data> 元素。 (CDM代表列数据映射。) <Data> 标签的名称属性用作 ^User.PersonI Global中的下标,<Attribute> 元素包含属性名称,<Structure> 元素带有值向量表示向量用于以列形式表示属性的值。

User.Person表添加数据,代码如下:

ClassMethod Save(num)
{
 	ts
 	
	for i = 1 : 1 : num {
		
		s obj = ##class(User.Person).%New()
		s obj.Name = "yx" _ $random(100)
		s obj.Number = $random(100)
		s obj.Price = $random(100) 
		s obj.Amout = obj.Number * obj.Price
		s sc = obj.%Save()
		ret:($$$ISERR(sc)) $system.Status.GetErrorText(sc)
		
	}
	
	b
	tc
	
	q $$$OK
}

列存储持久类中每个属性的数据存储在列中,数据并不存储在行中。所以^User.GlobalD中仅包含ID,不包含数据。

USER>w ##class(M.ColumnStorage).Save(1)
1
USER>w ##class(M.ColumnStorage).Save(1)
1
USER>w ##class(M.ColumnStorage).Save(1)
1
USER>zw ^User.PersonD
^User.PersonD=3
^User.PersonD(1)=""
^User.PersonD(2)=""
^User.PersonD(3)=""

数据保存在^User.PersonI索引中,以Json格式保存数据。

  • type - 字段类型。
  • count - 数据数量。
  • vector- 数据值。
  • length - 向量长度。

USER>zw ^User.PersonI
^User.PersonI("$Person",1)=$zwc(412,1,0)/*$bit(2..4)*/
^User.PersonI("_CDM_Amout",1)={"type":"integer", "count":3, "length":4, "vector":[,7533,42,3496]}  ; <VECTOR>
^User.PersonI("_CDM_Name",1)={"type":"string", "count":3, "length":4, "vector":[,"yx80","yx49","yx55"]}  ; <VECTOR>
^User.PersonI("_CDM_Number",1)={"type":"integer", "count":3, "length":4, "vector":[,81,6,76]}  ; <VECTOR>
^User.PersonI("_CDM_Price",1)={"type":"integer", "count":3, "length":4, "vector":[,93,7,46]}  ; <VECTOR>

这里我们注意索引第二个节点,代表当前索引存储数据的序号,当数据length超过64,000时,下标会自动加一。

注:count计数低于length,因为该列包含 NULL 值。

添加10W条数据。

USER>w ##class(M.ColumnStorage).Save(100000)
1

在这里插入图片描述

什么情况下使用列储存

创建User.People表字段与User.Person表相同,但User.People表为行存储,User.Person表为列储存。

Class User.People Extends %Persistent
{

Property Name As %String [ SqlColumnNumber = 2 ];

Property Number As %Integer [ SqlColumnNumber = 3 ];

Property Price As %Integer [ SqlColumnNumber = 4 ];

Property Amout As %Integer [ SqlColumnNumber = 5 ];
}

分别给User.People表与User.Person表添加1000W条数据。

如下示例计算的数据量均为1000W条数据。

统计数据数量count

统计User.People表,数据数量,如图执行时间为1.6561秒。引用Global数量11100322个。

在这里插入图片描述

统计User.Person表,数据数量,如图执行时间为0.0026秒。引用Global数量496个。

在这里插入图片描述

如上可观察到列储存User.Person聚合count效率是行储存User.People636倍。

计算字段平均值avg

计算User.People表,Amount字段平均值,如图执行时间为2.3046秒。引用Global数量11101379个。

在这里插入图片描述

计算User.Person表,Amount字段平均值,如图执行时间为0.0179秒。引用Global数量2447个。

在这里插入图片描述

如上可观察到列储存User.Person聚合avg效率是行储存User.People128倍。

计算字段和sum

计算User.People表,Amount字段所有数据之和,如图执行时间为2.2902秒。引用Global数量88801366个。

在这里插入图片描述

计算User.Person表,Amount字段数据之和,如图执行时间为0.0075秒。引用Global数量1922个。

在这里插入图片描述

如上可观察到列储存User.Person聚合sum效率是行储存User.People305倍。

列存储与行存储区别

列存储行存储
数据存储主数据存储在每列一个Global中。 64,000 个数据元素的序列存储在单独的Global主要数据存储在一个Global中。每行数据都存储在单独的Global下标中。
插入数据速度慢,(因为每个列存储表插入数据时,会打开多个Global去赋值)快。(因为insert时,仅需要打开一个Global,添加$list即可)
使用场景不频繁变动的数据,例如,台帐,日志,病人生命体征数据,就很适合。频繁变动的数据。
数据里要求SQL 表数据量大于100w(数据量100w时效率与行存储效率区别不大)。SQL 表数据量小于100w,则无需考虑列式存储。
单列数据查询列存储查询时,单列所有数据都在一个Global中。查询1000w条数据可能只需174Global行存储查询时,需要将每一列的Global保存到内存中,在根据Global$list再取值。查询1000w条数据。就需要查询1000WGlobal

在这里插入图片描述

总结

  • 选择正确的存储方式可以将查询性能提高一个数量级。

以上是个人对基于列存储的一些理解,由于个人能力有限,欢迎大家提出意见,共同交流。

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

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

相关文章

Win11-RTX4060安装Pytorch-GPU干货避坑指南

文章目录 1、版本要和pytorch官网对应&#xff0c;CUDA11.8及其对应版本的cudnn2、CUDA Toolkit安装出现自动重启3、Python版本4、配置永久国内镜像源5、要在激活的虚拟环境里安装pytorch6、进入python后检查是否gpu配置成功7、在虚拟环境中启动jupyter notebook8、conda中inst…

【Docker】5、Dockerfile 自定义镜像(镜像结构、Dockerfile 语法、把 Java 项目弄成镜像)

目录 零、学习内容一、镜像结构二、Dockerfile四、基于 java:8-alpine 构建自己的 Java 项目镜像 零、学习内容 镜像结构Dockerfile 语法构建 Java 项目 ① 之前使用的镜像都是 DockerHub 官方提供的 ② 开发者需要将自己的微服务制作为镜像 一、镜像结构 镜像是由应用程序及其…

【新星计划-2023】什么是ARP?详解它的“解析过程”与“ARP表”。

一、什么是ARP ARP&#xff08;地址解析协议&#xff09;英文全称“Address Resolution Protocol”&#xff0c;是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机&#xff0c;并接收返回消息&#xff0c;以此确…

ConcurrentHashMap实现原理

1. 哈希表 1.1 介绍 哈希表是一种key-value存储数据的结构&#xff0c;根据key即可查到对应的value。 如果所有的键是整数&#xff0c;我们可用简单的无序数组来表示&#xff0c;键作为数组索引&#xff0c;值即为对应的值 1.2 链式哈希表 链式哈希表本质由一组链表构成。每…

用MacBook实操:docker本地部署mysql+php+nginx坏境

大家好&#xff0c;我拿出我的macbook,带着大家实操用docker部署mysqlphpnginx环境。 之前的小白实操搭建Nginx1.2.0PHP7.0MySQL5.7Thinkphp5项目&#xff0c;看这篇就够了&#xff0c;欢迎阅读。 之前的是服务器上配置环境&#xff0c;现在在mac本地搭建全栈开发环境。 目录…

LiveData详解(实战+源码+粘性事件解决方案)

1. 简介 LiveData 是一种可观察的数据存储器类。与常规的可观察类不同&#xff0c;LiveData 具有生命周期感知能力&#xff0c;意指它遵循其他应用组件&#xff08;如 activity、fragment 或 service&#xff09;的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周…

mysql查询之子查询

0. 概念 SQL语句中嵌套SELECT语句&#xff0c;称为嵌套查询&#xff0c;又叫子查询。 查询可以基于一个表或多个表。子查询可以添加到SELECT、UPDATE和DELETE中&#xff0c;而且可以进行多层嵌套。子查询常用操作符有 ANY(SOME)&#xff0c;ALL、IN、EXISTS。也可以使用比较运…

Codeforces Round 872 (Div. 2) A-C

Start&#xff1a;May/08/2023 20:05UTC8 Length&#xff1a;02:00 这次总该上分了吧 A LuoTianyi and the Palindrome String 1 s, 256 MB x8531 都一样是-1&#xff0c;普通回文是size()-1 #include<bits/stdc.h> using namespace std; #define int long long #def…

架构-软件工程模块-1

概述 这一模块选择题的分值比较多&#xff0c;案例题和论文也有能用上的地方。主要知识点会特殊标注或说明。 软件开发生命周期 软件工程三要素&#xff1a;方法、工具、过程。不会直接考&#xff0c;但可帮助记忆理解。 传统软件生命周期方法学分为&#xff1a;&#xff08;选…

使用sharding-scaling和sharding-proxy做分库分表数据迁移

背景&#xff1a; 现在有一个有一张表被分成了两张表&#xff0c;t_score1 ,t_score2&#xff0c;但后期数据量激增&#xff0c;两张表不能满足业务需求&#xff0c;扩张为2个库每个库2张表&#xff0c;即数据库 ds_0下有t_score1 ,t_score2 &#xff0c;数据库ds1下有t_score1…

浏览器插件的使用

善于使用浏览器插件&#xff0c;能起到高效上网的作用。 Microsoft Edge 是全球广受欢迎的浏览器&#xff0c;浏览器本身具有快速、简单和轻量级的特点。一流的性能系统和访问速度极大提升您的浏览体验。 对于浏览器的用户来说&#xff0c;安装一些实用的插件&#xff0c;能让…

Navicat设置Oracle数据库主键自增1的方法步骤

一、 创建如下表 Oracle数据库不同于Mysql、Sql Server数据库&#xff0c;Oracle数据库主键自增不能在建表时直接设置&#xff0c;而是需要通过序列和触发器进行设置&#xff01; 二、创建序列 1 2 3 4 5 6create sequence SEQ_DEVICEDATAINFO start with 1 …

iOS可视化动态绘制连通图

上篇博客《iOS可视化动态绘制八种排序过程》可视化了一下一些排序的过程&#xff0c;本篇博客就来聊聊图的东西。在之前的博客中详细的讲过图的相关内容&#xff0c;比如《图的物理存储结构与深搜、广搜》。当然之前写的程序是比较抽象的。上篇博客我们以可视化的方式看了一下各…

数据库(Sql server语言)(一)

例题&#xff1a;&#xff08;不介绍创建和插入&#xff09; star表 ●查询每个组合的名称及其成员个数 select g.name,count(*) 成员个数 from star s,stargroup g where s.gid g.gid group by g.name 如果不写where s.gidg,gid会出现成员个数重复 ●查询身高最高的团…

UG NX二次开发(C#)-建模-反向片体(SheetBody)的法向矢量

文章目录 1、前言2、在UG NX中构建一个片体3、在UG NX中查看片体的法向矢量4、采用UFun函数来实现法向反向5、代码实现6、测试效果1、前言 在UG NX中,一张曲面获取其所属的片体(SheetBody)对象,其在构建时有默认的法向矢量,有时处于功能的需求,比如加工时工件的材料去除方…

探秘信息检索:原理、实现与应用

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

(一)如何使用Spring Boot和MyBatis框架实现即时通信系统中的用户注册功能

文章目录 一、引言二、Spring Boot和MyBatis框架介绍三、注册1. 前端界面实现2. 后端数据持久化操作3. 代码示例 四、实现效果四、个人经验分享五、结语 一、引言 本文将介绍基于Spring Boot和MyBatis框架开发的注册功能实现&#xff0c;该功能是基于Linux的即时通信系统的一个…

二挡起步——pythonweb开发Django框架,前端原生+Django后端框架002(附带小案例)

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

ERROR: Could not find a valid gem ‘cocoapods‘ (>= 0) in any repository

Flutter启动的时候报错 需要重新安装cocoapods&#xff0c;那就重装&#xff0c;可是结果装不上 这是需要梯子的&#xff0c;我开了梯子也是一样安装不上 所以需要指定一下你的http代理ip和端口 你可以找一下你梯子的端口&#xff0c;找找代理命令&#xff0c;比如我的如下…

人工智能概述、发展历程及主要分支

人工智能概述 人工智能发展必备三要素&#xff1a; 数据 算法 计算力 &#xff0c;硬件支撑 CPU、GPU、TPU 计算力之CPU、GPU对比&#xff1a; CPU主要适合I\O密集型的任务 GPU主要适合计算密集型任务 什么类型的程序适合在GPU上运行&#xff1f; &#xff08;1&#…