首页 文章 精选 留言 我的

精选列表

搜索[数据仓库],共2763篇文章
优秀的个人博客,低调大师

数据仓库的未来 MariaDB ColumnStore

MariaDB ColumnStore 简介 Part1:写在最前 MariaDB ColumnStore is the future of data warehousing. ColumnStore allows us to store more data and analyze it faster. Everyday, Pinger’s mobile applications process millions of text messages and phone calls. We also process more than 1.5 billion rows of logs per day. Analytic scalability and performance is critical to our business. MariaDB’s ColumnStore manages massive amounts of data and will scale with Pinger as we grow. ----from mariadb.com Part2:大牛如何说 MariaDB ColumnStore是在MariaDB 10.1基础上移植了InfiniDB4.6.2构建的大规模并行,高性能,压缩,分布式开源列式存储引擎,类似收费产品Infobright。它设计用于大数据离线分析,用来抗衡Hadoop。你可以使用标准SQL语句进行查询,支持目前流行的sqlyog/navicat客户端工具连接,对业务方使用没有任何的不便,并且你不需要创建任何索引,不需要修改业务方的复杂SQL(自身就支持复杂的关联查询、聚合、存储过程和用户定义的函数),你唯一要做的就是把数据导入到ColumnStore里,就没你事了。这对一家没有Hadoop工程师的公司来说,MariaDB ColumnStore会是一个更好的替代产品。 -----from 贺春旸 Part3:环境简介 192.168.1.248 HE1 um1 192.168.1.249 HE2 um2 192.168.1.250 HE3 pm1 192.168.1.251 HE4 pm2 Column Store架构概述 Part1:写在最前 MariaDB ColumnStore是一种专为分布式大规模并行处理(MPP)设计的列式存储引擎。它由三个组件组成,协同工作。 在官方给出的架构图中,我们可以看到分为三个组件构成:UM、PM、数据存储层。 用户模块(UM): 用户模块管理和控制终端用户查询的操作,它维护每个查询的状态,向一个或多个性能模块发出请求以代为执行SQL查询工作,最后,用户模块汇集来自各个参与的性能模块的所有查询结果,以形成返回给用户的完整的查询结果集。 性能模块(PM): 性能模块负责存储,检索和管理数据,处理对查询操作的块请求,并将其传递回用户模块以完成查询请求。性能模块将获取的数据缓存在其内存中计算。MPP是通过允许用户配置尽可能多的性能模块,以实现更高的处理能力。 存储: MariaDB ColumnStore对于存储系统极为灵活。当在内部运行时,它可以使用本地存储或共享存储(例如SAN)来存储数据。在Amazon EC2环境中,它可以使用临时或弹性块存储(EBS)卷。当无共享部署需要数据冗余时,它被构建为与GlusterFS和Apache Hadoop分布式文件系统(HDFS)集成。 一句话总结:用户模块(UM)将客户端发出的SQL请求进行分配,分配到后端性能模块(PM),PM进行数据查询分析,将处理的结果返回给UM,UM再把PM分析的结果进行聚合,最后返回给客户端最终的查询结果。 Column Store性能对比 Percona专业MySQL服务提供商性能测试InfiniDB比其他OLAP优势明显。 Column Store安装 Part1:打通互信 [root@HE1~]#ssh-keygen [root@HE1~]#ssh-copy-id'-p22root@192.168.1.248' [root@HE1~]#ssh-copy-id'-p22root@192.168.1.249' [root@HE1~]#ssh-copy-id'-p22root@192.168.1.250' [root@HE1~]#ssh-copy-id'-p22root@192.168.1.251' [root@HE1~]#sshHE1 [root@HE1~]#sshHE2 [root@HE1~]#sshHE3 [root@HE1~]#sshHE4 [root@HE1~]#cat/etc/hosts 192.168.1.248HE1 192.168.1.249HE2 192.168.1.250HE3 192.168.1.251HE4 在HE1,HE2,HE3,HE4每台机器上执行上述命令,打通ssh互信。 Part2:关闭防火墙 [root@HE1 ~]# /etc/init.d/iptables status iptables: Firewall is not running. [root@HE1 ~]# chkconfig iptables off [root@HE1 ~]# chkconfig --list | grep iptables iptables 0:off1:off2:off3:off4:off5:off6:off Part3:关闭文件系统访问时间和修改磁盘调度策略 [root@HE1~]#cat/etc/fstab # #/etc/fstab #CreatedbyanacondaonSatMar509:35:402016 # #Accessiblefilesystems,byreference,aremaintainedunder'/dev/disk' #Seemanpagesfstab(5),findfs(8),mount(8)and/orblkid(8)formoreinfo # UUID=397d50ba-22b0-4d50-9e29-89e3b92d2d07/ext4defaults,noatime,barrier=011 [root@HE1~]#echo"deadline">/sys/block/sda/queue/scheduler Part4:关闭numa [root@HE1~]#cat/etc/grub.conf #grub.confgeneratedbyanaconda # #Notethatyoudonothavetorerungrubaftermakingchangestothisfile #NOTICE:Youhavea/bootpartition.Thismeansthat #allkernelandinitrdpathsarerelativeto/boot/,eg. #root(hd0,0) #kernel/vmlinuz-versionroroot=/dev/sda2 #initrd/initrd-[generic-]version.img #boot=/dev/sda default=1 timeout=5 splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz hiddenmenu titleCentOS(2.6.32-573.18.1.el6.x86_64.debug) root(hd0,0) kernel/vmlinuz-2.6.32-573.18.1.el6.x86_64.debugroroot=UUID=397d50ba-22b0-4d50-9e29-89e3b92d2d07rd_NO_LUKSrd_NO_LVMLANG=en_US.UTF-8rd_NO_MDSYSFONT=latarcyrheb-sun16crashkernel=autoKEYBOARDTYPE=pcKEYTABLE=usrd_NO_DMrhgbquietnuma=off initrd/initramfs-2.6.32-573.18.1.el6.x86_64.debug.img titleCentOS(2.6.32-431.el6.x86_64) root(hd0,0) kernel/vmlinuz-2.6.32-431.el6.x86_64roroot=UUID=397d50ba-22b0-4d50-9e29-89e3b92d2d07rd_NO_LUKSrd_NO_LVMLANG=en_US.UTF-8rd_NO_MDSYSFONT=latarcyrheb-sun16crashkernel=autoKEYBOARDTYPE=pcKEYTABLE=usrd_NO_DMrhgbquietnuma=off initrd/initramfs-2.6.32-431.el6.x86_64.img Part5:安装jemalloc内存管理 [root@HE1 ~]# yum install jemalloc-* [root@HE1 ~]# reboot 在HE1,HE2,HE3,HE4每台机器上执行上述命令 Part6:安装boost软件包 [root@HE1 ~]# yum -y install boost* [root@HE1 ~]# yum -y groupinstall "Development Tools" [root@HE1 ~]# yum -y install cmake [root@HE1 ~]# tar xvf boost_1_55_0.tar.gz [root@HE1 ~]# cd boost_1_55_0 [root@HE1 boost_1_55_0]# ./bootstrap.sh --with-libraries=atomic,date_time,exception,filesystem,iostreams,locale,program_options,regex,signals,system,test,thread,timer,log --prefix=/usr [root@HE1 boost_1_55_0]# ./b2 install Part6:安装perl依赖包 [root@HE1 ~]# yum -y install expect perl perl-DBI openssl zlib perl-DBD-MySQL Part7:安装Mariadb ColumStore [root@HE1 ~]# tar xvf mariadb-columnstore-1.0.6-1-centos6.x86_64.bin.tar.gz -C /usr/local Part8:配置Mariadb ColumStore [root@HE1 ~]# /usr/local/mariadb/columnstore/bin/postConfigure 至此,MariaDB ColumnStore安装并配置完成 Column Store单点故障测试 Part1:关闭HE2 当前HE2为primary um mcsadmin>getSystemStatus getsystemstatusMonDec2615:56:472016 Systemcolumnstore-1 SystemandModulestatuses ComponentStatusLastStatusChange -------------------------------------------------------------- SystemBUSY_INITMonDec2615:56:382016 Moduleum1AUTO_DISABLED/DEGRADEDMonDec2615:56:402016 Moduleum2ACTIVEMonDec2615:54:212016 Modulepm1ACTIVEMonDec2602:03:272016 Modulepm2ACTIVEMonDec2602:03:412016 ActiveParentOAMPerformanceModuleis'pm1' PrimaryFront-EndMariaDBColumnstoreModuleis'um2' MariaDBColumnstoreReplicationFeatureisenabled [root@HE2~]#reboot 在当前primary um重启后,可以看到primary um已经自动切换至um1 mcsadmin>getSystemStatus getsystemstatusMonDec2615:58:192016 Systemcolumnstore-1 SystemandModulestatuses ComponentStatusLastStatusChange -------------------------------------------------------------- SystemBUSY_INITMonDec2615:58:102016 Moduleum1ACTIVEMonDec2615:57:172016 Moduleum2AUTO_DISABLED/DEGRADEDMonDec2615:58:112016 Modulepm1ACTIVEMonDec2602:03:272016 Modulepm2ACTIVEMonDec2602:03:412016 ActiveParentOAMPerformanceModuleis'pm1' PrimaryFront-EndMariaDBColumnstoreModuleis'um1' MariaDBColumnstoreReplicationFeatureisenabled Part2:检查状态 在原primary um (HE2)中进入数据库查看,现在已经是um1的从库 [root@HE2~]#mcsmysql WelcometotheMariaDBmonitor.Commandsendwith;or\g. YourMariaDBconnectionidis10 Serverversion:10.1.19-MariaDBColumnstore1.0.6-1 Copyright(c)2000,2016,Oracle,MariaDBCorporationAbandothers. Type'help;'or'\h'forhelp.Type'\c'toclearthecurrentinputstatement. MariaDB[(none)]>showslavestatus\G ***************************1.row*************************** Slave_IO_State:Waitingformastertosendevent Master_Host:192.168.1.248 Master_User:idbrep Master_Port:3306 Connect_Retry:60 Master_Log_File:mysql-bin.000013 Read_Master_Log_Pos:1879 Relay_Log_File:relay-bin.000002 Relay_Log_Pos:537 Relay_Master_Log_File:mysql-bin.000013 Slave_IO_Running:Yes Slave_SQL_Running:Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno:0 Last_Error: Skip_Counter:0 Exec_Master_Log_Pos:1879 Relay_Log_Space:829 Until_Condition:None Until_Log_File: Until_Log_Pos:0 Master_SSL_Allowed:No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master:0 Master_SSL_Verify_Server_Cert:No Last_IO_Errno:0 Last_IO_Error: Last_SQL_Errno:0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id:1 Master_SSL_Crl: Master_SSL_Crlpath: Using_Gtid:No Gtid_IO_Pos: Replicate_Do_Domain_Ids: Replicate_Ignore_Domain_Ids: Parallel_Mode:conservative 1rowinset(0.00sec) MariaDB[(none)]> Column Store测试 Part1:主键和索引 MariaDB[helei]>createtablehelei_innodb( ->idint(10)unsignedNOTNULLAUTO_INCREMENT, ->c1int(10)NOTNULLDEFAULT'0', ->c2int(10)unsignedDEFAULTNULL, ->c5int(10)unsignedNOTNULLDEFAULT'0', ->c3timestampNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP, ->c4varchar(200)NOTNULLDEFAULT'', ->PRIMARYKEY(id), ->KEYidx_c1(c1), ->KEYidx_c2(c2) ->)ENGINE=InnoDB; QueryOK,0rowsaffected(0.03sec) MariaDB[helei]>createtablehelei_cs( ->idint(10)unsignedNOTNULLAUTO_INCREMENT, ->c1int(10)NOTNULLDEFAULT'0', ->c2int(10)unsignedDEFAULTNULL, ->c5int(10)unsignedNOTNULLDEFAULT'0', ->c3timestampNOTNULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP, ->c4varchar(200)NOTNULLDEFAULT'', ->PRIMARYKEY(id), ->KEYidx_c1(c1), ->KEYidx_c2(c2) ->)ENGINE=Columnstore; ERROR1069(42000):Toomanykeysspecified;max0keysallowed 这里可以看出,columnstore存储引擎不支持主键也不需要索引 MariaDB[helei]>createtablehelei_cs( ->idint(10)unsignedNOTNULL, ->c1varchar(200)NOTNULLDEFAULT'' ->)ENGINE=Columnstore; QueryOK,0rowsaffected(0.34sec) MariaDB[helei]>insertintohelei_csvalues(1,'1'); QueryOK,1rowaffected(0.60sec) MariaDB[helei]>insertintohelei_csvalues(2,'2'); QueryOK,1rowaffected(0.08sec) MariaDB[helei]>insertintohelei_csvalues(3,'3'); QueryOK,1rowaffected(0.17sec) 这里可以看出columnstore的插入速度较慢 Warning:警告 columnstore不支持主键、索引、timestamp、collate用法、char\varchar类型的sum/average用法。 Part2:效率测试 1G内存虚拟机MariaDB ColumnStore 2.82s,线上生产库8G的innodb_buffer_pool_size该条慢查询耗时17.894s。 BUG发现 如果pm2的机器挂掉了,按照原本的想法,应该pm1可以继续工作,但无法进行查询,会报错: ERROR 1815 (HY000): Internal error: st: 10000 TupleBPS::sendPrimitiveMessages() caught an exception: IDB-2034: At least one DBRoot required for that query is offline. 这应该是一个BUG,因为pm是负责拉取数据到内存中进行计算的,数据本文中的实验应该都存放在um机器下。我们来查一下现在表中的数据: MariaDB[erp_test]>showtables; +--------------------+ |Tables_in_erp_test| +--------------------+ |erp_bjlikp| |erp_bjlips| |erp_likp| |erp_lips| |erp_mara| +--------------------+ 5rowsinset(0.00sec) MariaDB[erp_test]>selectcount(*)fromerp_bjlikp; +----------+ |count(*)| +----------+ |0| +----------+ 1rowinset(1.15sec) MariaDB[erp_test]>selectcount(*)fromerp_bjlips; +----------+ |count(*)| +----------+ |0| +----------+ 1rowinset(1.15sec) MariaDB[erp_test]>selectcount(*)fromerp_lips; +----------+ |count(*)| +----------+ |0| +----------+ 1rowinset(1.14sec) MariaDB[erp_test]>selectcount(*)fromerp_mara; +----------+ |count(*)| +----------+ |0| +----------+ 1rowinset(1.15sec) 会发现所有的表行数都变为0了 ProcessMonitorpm2AUTO_OFFLINETueDec2722:23:502016 ProcessManagerpm2AUTO_OFFLINETueDec2722:23:502016 DBRMControllerNodepm2AUTO_OFFLINETueDec2722:23:502016 ServerMonitorpm2AUTO_OFFLINETueDec2722:23:502016 DBRMWorkerNodepm2AUTO_OFFLINETueDec2722:23:502016 DecomSvrpm2AUTO_OFFLINETueDec2722:23:502016 PrimProcpm2AUTO_OFFLINETueDec2722:23:502016 WriteEngineServerpm2AUTO_OFFLINETueDec2722:23:502016 MariaDB[erp_test]>selectcount(*)fromerp_lips; +----------+ |count(*)| +----------+ |3147299| +----------+ 1rowinset(0.37sec) MariaDB[erp_test]>selectcount(*)fromerp_mara; +----------+ |count(*)| +----------+ |4361| +----------+ 1rowinset(0.08sec) MariaDB[erp_test]>selectcount(*)fromerp_bjlips; +----------+ |count(*)| +----------+ |2762244| +----------+ 1rowinset(0.13sec) MariaDB[erp_test]>selectcount(*)fromerp_bjlikp; +----------+ |count(*)| +----------+ |19032| +----------+ 1rowinset(0.09sec) MariaDB[erp_test]>selectcount(*)fromerp_likp; +----------+ |count(*)| +----------+ |169002| +----------+ 1rowinset(0.08sec) pm2机器启动后,发现又恢复正常 这应该是软件的一个bug,应该会在1.0.7GA版本修复。 感谢贺春旸老师指点,本人在测试环境中得以验证该BUG ——总结—— 大家可以用生产的复杂SQL跑一跑,来体验一下。由于笔者的水平有限,编写时间也很仓促,文中难免会出现一些错误或者不准确的地方,不妥之处恳请读者批评指正。

优秀的个人博客,低调大师

解密数据仓库LLVM技术神奇之处

摘要:广义上讲就是指LLVM本身,它是一套用于开发编译前端与后端的工具套件,狭义上讲LLVM就是指整个编译套件的优化器及后端,而CLANG可以认为是C/C++的前端。 本文分享自华为云社区《GaussDB(DWS) 性能黑科技之LLVM技术解密》,作者:清道夫。 1.LLVM是什么? LLVM这个名字最早源于底层虚拟机(Low Level VirTual Machine)的首字母缩写,但随着LLVM项目的演进,底层虚拟机的含义已经不再适用于LLVM。现在谈到LLVM,广义上讲就是指LLVM本身,它是一套用于开发编译前端与后端的工具套件,狭义上讲LLVM就是指整个编译套件的优化器及后端,而CLANG可以认为是C/C++的前端。 2.LLVM的优势? 传统编译器最常见的三阶段设计: 前端:解析源代码生成抽象语法树 优化器:根据优化规则对代码进行改善,相当于规则重写,例如消除冗余计算等 后端:将代码映射到目标指令集上,包括指令选择、寄存器分配和指令调度等。 GCC是一个完整的可执行文件,没有为其他语言的开发者提供代码重用的接口,灵活性不足。 LLVM也采用经典的三段式设计,但与传统编译器最大的不同就是针对不同语言都提供了同样一种中间表示IR以及模块化的后端(MCJIT模块可以支持JIT编译)。 3.DWS为什么要使用LLVM? 为具体的查询生成定制化的机器码代替通用的函数实现,并尽可能的将数据存储在CPU的寄存器中: (1)解决条件逻辑冗余的问题,需要用到JIT(jiust-in-time)编译技术,LLVM天然支持JIT技术。 (2)减少大量虚函数调用 (3)改善数据调用,将数据尽可能的从内存加载到cache上 (4)发挥通用硬件平台的扩展指令集功能,例如SSE4.2 一个简单的例子,可以参照下面的优化前伪代码片段: (1)首先是优化前的代码片段(a): 可以看到,在物化tuple的过程中,需要根据不同的列属性判断其偏移量,并调用相应的解析函数。 (2)借助LLVM使用JIT编译技术后,可以生成如下优化后的伪代码片段(b): 其中偏移量已经被提前计算出来,且无需判断列属性既可以调用对应的解析函数。减少了偏移量的重复计算及类型的重复判断。 优化前的代码(a): void MaterializeTuple(char *tuple) { for (int i = 0; i < num_slots; ++i) { char *slot = tuple + offset[i]; switch(types[i]) { case BOOLEAN: *slot = ParseBoolean(); break; case INT: *slot = ParseInt(); break; case FLOAT:... case STRING:... // etc. } } } 优化后的代码(b): void MaterializeTuple(char *tuple) { *(tuple + 0) = ParseInt(); *(tuple + 4) = ParseBoolean(); *(tuple + 5) = ParseInt(); } 4.如何使用LLVM 在DWS中,涉及LLVM的GUC参数有两个: (1)enable_codegen:总开关,用于控制是否开启codegen,默认为on (2)codegen_cost_threshold:使用处理行数控制是否开启codegen,默认门槛值为10000。 目前DWS中并非是通过计划代价去控制是否开启codegen,而是通过处理行数来控制的。此处10000是通过实验验证得出的优化值,不建议将此门槛值设置的过低,因为代码执行过程中的即时编译是有代价的。 简单示例: test=# create table llvm_test(a int,b int)with(orientation=column); NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'a' as the distribution column by default. HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column. CREATE TABLE test=# insert into llvm_test values(generate_series(1,10),generate_series(1,10)); INSERT 0 10 test=# show enable_codegen; enable_codegen ---------------- on (1 row) test=# show codegen_cost_threshold; codegen_cost_threshold ------------------------ 10000 (1 row) test=# set codegen_cost_threshold=0; --为了简化,将门槛值设置为0 SET test=# set enable_fast_query_shipping=off; --关闭FQS,便于打印DN执行信息 SET test=# explain performance select * from llvm_test where b<10; --简单表达式会使用codegen Datanode Information (identified by plan id) --------------------------------------------------------------------------------------------------------------------- 1 --Row Adapter (actual time=14.929..15.393 rows=9 loops=1) (CPU: ex c/r=5783, ex row=9, ex cyc=52048, inc cyc=46174324) 2 --Vector Streaming (type: GATHER) (actual time=14.920..15.372 rows=9 loops=1) (Buffers: 0) (CPU: ex c/r=5124697, ex row=9, ex cyc=46122276, inc cyc=46122276) 3 --CStore Scan on public.llvm_test LLVM Optimized datanode1 (actual time=0.094..0.141 rows=9 loops=1) (filter time=0.002) (RoughCheck CU: CUNone: 1, CUSome: 9) datanode1 (Buffers: shared hit=26 dirtied=1) datanode1 (CPU: ex c/r=41430, ex row=10, ex cyc=414306, inc cyc=414306) 此处仅截取部分执行信息,在Datanode Information中的扫描算子中有LLVM Optimized信息,代表已经使用了JIT编译。 如果想查看LLVM JIT编译的时间耗时,可以借助GUC参数analysis_options进行设置后,执行对应查询语句,在User Define Profiling中就可以看到LLVM的编译时间。 test=# set analysis_options='on(LLVM_COMPILE)'; SET test=# explain performance select * from llvm_test where b<10; 此处仍使用之前用例的设置,不再赘述。 User Define Profiling ---------------------------------------------------------------- Plan Node id: 2 Track name: coordinator get datanode connection coordinator1: (time=0.015 total_calls=1 loops=1) Plan Node id: 3 Track name: load CU description datanode1 (time=0.061 total_calls=10 loops=1) Plan Node id: 3 Track name: min/max check datanode1 (time=0.008 total_calls=10 loops=1) Plan Node id: 3 Track name: fill vector batch datanode1 (time=0.032 total_calls=9 loops=1) Plan Node id: 3 Track name: apply projection and filter datanode1 (time=0.005 total_calls=9 loops=1) Plan Node id: 3 Track name: LLVM Compilation datanode1 (time=11.024 total_calls=1 loops=1) Plan Node id: 3 Track name: fill later vector batch datanode1 (time=0.000 total_calls=9 loops=1) 其中LLVM Compilation即为LLVM的即时编译的时间代价。此处编译的时间代价通常会与SQL执行流程的复杂程度成正比关系,在实际的调优实践中可以结合此数据对处理数据行数的门槛值做进一步的调整。 5.LLVM适用场景 目前LLVM仅支持DN上且是列存向量化执行路径的查询作业,其支持的表达式及算子如下: 支持LLVM的表达式 Case…when… 表达式 In表达式 Bool表达式 (And/Or/Not) BooleanTest表达式 (IS_NOT_KNOWN/IS_UNKNOWN/IS_TRUE/IS_NOT_TRUE/IS_FALSE/IS_NOT_FALSE) NullTest表达式 (IS_NOT_NULL/IS_NULL) Operator表达式 Function表达式 (lpad, substring, btrim, rtrim, length) Nullif表达式 表达式计算支持的数据类型包括bool, tinyint, smallint, int, bigint, float4, float8, numeric, date, time, timetz, timestamp, timestamptz, interval, bpchar, varchar, text, oid。 仅当表达式出现在向量化执行引擎中Scan节点的filter、Hash Join节点中的complicate hash condition、hash join filter、hash join target, Nested Loop节点中的filter、join filter, Merge Join节点的merge join filter, merge join target, Group节点中的filter表达式时,才会考虑是否使用LLVM动态编译优化。 支持LLVM的算子: Join :HashJoin/SonicHashJoin Agg :HashAgg Sort 其中HashJoin算子仅支持Hash Inner Join,对应的hash cond仅支持int4、bigint、bpchar类型的比较;HashAgg算子仅支持针对bigint、numeric类型的sum及avg操作,且group by语句仅支持int4、bigint、bpchar,text,varchar,timestamp类型操作,同时支持count(*)聚集操作。Sort算子仅支持对int4,bigint,numeric,bpchar,text,varchar数据类型的比较操作。除此之外,无法使用LLVM动态编译优化,具体可通过explain performance工具进行显示(如上用例所示)。 想了解GuassDB(DWS)更多信息,欢迎微信搜索“GaussDB DWS”关注微信公众号,和您分享最新最全的PB级数仓黑科技,后台还可获取众多学习资料哦~ 点击关注,第一时间了解华为云新鲜技术~

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

用户登录
用户注册