• [维护宝典] 访问记录0次的表
    【问题描述】一个表的访问,只有seq_scan和idx_scan(视图pg_stat_user_tables) ?如果这两种scan都是0, 说明这个表从创建后就没有被访问  ?    有什么办法能够找到数据库内从来没有被访问过的表,需要清理这些没用的表【解决方案】      1.、访问的可以参考这个(对应视图pg_stat_user_tables),但前提是seq_scan中必须有出现顺序扫描才算,idx_scan中必须有索引扫描才算,但是这个访问数量比实际访问数量要少,因为可能还有除了顺序扫描和索引扫描的其它访问,目前能参考的就这两个数据,没其它的了,有这两个数据,就说明有顺序扫描或索引扫描方式访问了       2.、813版本有个global_table_stat 可以看,目前811这个版本,就之前发的这个视图pg_stat_user_tables,是查,增删改的话看pg_stat_all_tables视图,里面有last_data_changed时间字段,只要数据变动就会记录时间,可以两个视图结合起来看,pg_stat_all_tables视图还有个问题,就是CN或集群重启了信息就不见了,所以可以运行一段时间再看里面的信息。目前还是只有这两个视图可以看;还有个办法就是开审计,但这个代价估计有点大,审计量可能会很大,主要是存储空间膨胀会很验证,因为select语句全部都被记录
  • [维护宝典] 数据库(pg_database_size)和数据库下的表(pg_total_relation_size)大小统计不一致
    【问题背景】在对数据库和数据库下所有表做统计时,FIM页面显示的数据库大小和pg_database_size大小都是50T,所有表的大小是35T,相差了15T,需确认差的15T差在哪【排查过程】1、对空间管控没有做限制,客户统计所有表的sql事实上没有统计全,对于information_schema.tables上是有权限判断的,已发送sql重新做统计现场做完analyze后,目前pg_database_size查出来为22T,表查出来13T,索引查出来24T,查看前台为22T查询语句:a、数据库大小语句:select pg_size_pretty(pg_database_size('postgres'));b、数据库下所有表大小语句:SELECTtable_name,pg_size_pretty(table_size) AS table_size,pg_size_pretty(indexes_size) AS indexes_size,pg_size_pretty(total_size) AS total_sizeFROM (SELECTtable_name,pg_table_size(table_name) AS table_size,pg_indexes_size(table_name) AS indexes_size,pg_total_relation_size(table_name) AS total_sizeFROM (SELECT ('"'table_schema'"."'table_name'"') AS table_nameFROM information_schema.tables) AS all_tablesORDER BY total_size DESC) AS pretty_sizes ;2、select pg_size_pretty(sum(pg_relation_size(relid))) from pg_stat_user_indexes where schemaname in (select nspname from pg_namespace);查询脏页率都达到了90%以上,所处版本查出来信息不准,需要重置表的统计信息再进行脏页率查询,步骤:a、select pg_stat_reset_single_table_counters('schemaname.table'::regclass::oid); -->重置表的统计信息b、analyze tablename-->重新收集表的统计信息c、Select * from pgxc_get_stat_dirty_tables(0,0);-->查询表的脏页率3、现场统计sql有误,重新提供sql进行统计数据库大小:select pg_size_pretty(pg_database_size('postgres'));表空间大小:SELECT sum(pg_total_relation_size_ext('"'table_schema'"."'table_name'"'))/1024/1024/1024 AS size FROM information_schema.tables;索引大小:select pg_size_pretty(sum(pg_relation_size(relid))) from pg_stat_user_indexes where schemaname in (select nspname from pg_namespace);分别查库大小,表大小,索引大小分别查完之后,表大小和索引大小之和大于库的size,主要是索引查出来比库大,统计有问题,怀疑数据膨胀,查询后正常4、用pgxc_get_residualfiles这个函数查出来的结果有残留,统计残留大小,结果只有几k,可忽略不计5、通过pg_tables查询表大小,进行统计,还是有差SELECT sum(pg_total_relation_size(schemaname '.' tablename)) from pg_tables ;6、通过ll列出了base下文件清单,统计表大小的清单求relfilenode,数量比较大,对比一些大表和小表,都对的上7、了解到,之前只对个别表做了analyze,后续对整个业务库做analyze,再查询对比下,做完analyze后,数据库使用空间查出来的和所有表大小差还是没有变化,库为30T左右,表总大小15T8、现场确认了相关信息,收集了所查库的表定义结构信息,后续在家里环境复现此问题,测试后,测试反馈主线版本试了下没有问题,不过开了vacuum,得切到现网版本试下,收集了行存和列存占比数量,在现网环境复现列存:select 'column count:'count(1) as point from pg_class where relkind = 'r' and oid > 16384 and reloptions::text like '%column%';行存:select 'row count:'count(1) as point from pg_class where relkind = 'r' and oid > 16384 and reloptions::text not like '%column%' and reloptions::text not like '%internal_mask%';测试完成,未复现,测完结果正常,还需要回归客户环境排查9、版本给了新的排查方法,排查残留,排查流程如下:a、查询数据库oid,找寻对应数据库的base实例文件select oid from pg_database where datname='postgres';b、base实例目录下面relfilenode导出llgrep -v 'bcm'grep -v 'fsm'grep -v '_C' >> base.txtcp base.txt /data1/c、连接dn,将对应表的relfilenode导出copy (select relfilenode from pg_class ) to '/data1/1.txt';copy (select relfilenode from pg_partition ) to '/data1/2.txt';将1.txt 2.txt整合为一份cat 1.txt 2.txt >>relfilenode.txtd、连接数据库create table relfilenode (b varchar);copy relfilenode from '/data/relfilenode.txt';create table base (b varchar);copy base from '/data1/base.txt';--过滤base下面类似88966.1这种文件delete base where b like '%.%';--查看多余文件select * from base where b not in (select * from relfilenode);排查后,未得到结果10、重新提供排查残留方法,排查语句如下图,排查后发现主有76888文件残留,通过残留工具扫描出来也是,已确认相差部分为残留文件,table求和+残留 基本等于 database size提供残留清理工具,待扫描主备残留后,提供处理方案,清掉残留文件【问题根因】大量残留文件导致统计不一致
  • [问题求助] FlinkSQL任务hive同步不生效。hive没有生成,数据也写不进去。日志也不报错
    CREATE TABLE t_source (id STRING,name STRING,age INT,create_time STRING,par STRING) WITH ('connector' = 'kafka','topic' = 'hudiTest','scan.startup.mode' = 'earliest-offset','properties.bootstrap.servers' = '************','properties.group.id' = 'group01','value.format' = 'json','value.json.fail-on-missing-field' = 'true','value.fields-include' = 'ALL');CREATE TABLE t_hdm(id VARCHAR(20),name VARCHAR(30),age INT,create_time VARCHAR(30),par VARCHAR(20)) PARTITIONED BY (par) WITH ('connector' = 'hudi','path' = 'hdfs://hacluster/tmp/hudi_table_0713_finish','hoodie.datasource.write.table.name' = 'hudi_sync_hive_sink','hoodie.datasource.write.recordkey.field' = 'id','table.type' = 'COPY_ON_WRITE','write.precombine.field' = 'age','write.tasks' = '1','compaction.tasks' = '1','write.rate.limit' = '2000','compaction.async.enabled' = 'true','compaction.trigger.strategy' = 'num_commits','compaction.delta_commits' = '5','hive_sync.enable' = 'true','hive_sync.mode' = 'hms','hive_sync.metastore.uris' = '******','hive_sync.jdbc_url' = '*****','hive_sync.table' = 'hudi_sync_hive_sink','hive_sync.database' = 'default','hive_sync.username' = '******','hive_sync.password' = '******','hive_sync.skip_ro_suffix' = 'true');insert intot_hdmselectid,name,age,create_time,parfromt_source;这条任务hive同步不生效。hive没有生成,数据也写不进去。日志也不报错
  • [技术干货] 深入解析ShardingSphere,开启为数据库提供强劲引擎的全新时代!
    7 月 8 日,由中国信息通信研究院(以下简称中国信通院)、中国通信标准化协会指导,中国通信标准化协会大数据技术标准推进委员会主办的“ 2022 可信数据库峰会”在京召开。SphereEx创始人兼CEO 张亮受邀参会,并于现场进行了《数据库增强引擎 ShardingSphere 实践》的主题演讲。会上,张亮重点强调了未来 ShardingSphere将在Database Plus 理念的指导下,针对不同的场景需求,为数据库全域带来最大限度的复用数据库原生存算能力,为广大用户提供基于数据库上层生态相关的全局扩展、叠加计算等方面的性能。在当前普遍追求技术可信的大背景下,围绕理念、性能与场景这三方面,张亮全面介绍了 ShardingSphere 在数据底座层面的可信能力。理念可信:ShardingSphere 的设计哲学 DatabasePlus Database Plus 是一种分布式数据库系统的设计理念,旨在碎片化的异构数据库上层构建生态,在最大限度的复用数据库原生存算能力的前提下,进一步提供面向全局的扩展和叠加计算能力。使应用和数据库间的交互面向 Database Plus 构建的标准,从而屏蔽数据库碎片化对上层业务带来的差异化影响。其中,『连接、增强、可插拔』是定义 Database Plus 核心价值的三个关键词。1.连接:打造数据库上层标准相对于提供一个全新的标准,Database Plus更倾向于提供一个可以适配于各种数据库 SQL方言和访问协议的中间层,用于便捷地连接碎片化的数据库。通过提供开放的接口用于对接各种数据库,因此在使用体验上与数据库并无二致,同时支持任意的开发语言和数据库访问客户端。此外,Database Plus 能够最大限度支持 SQL 方言间的相互转换,打通了连接异构数据库之间相互访问的通道。目前 ShardingSphere 已支持 MySQL、PostgreSQL、openGauss等数据库协议,以及 MySQL、PostgreSQL、openGauss、SQLServer、Oracle和所有支持SQL92标准的SQL方言。连接层抽象的顶层接口可供其他数据库开放对接,包括:数据库协议、SQL解析和数据库访问等。2.增强:数据库计算增强引擎分布式和云原生时代的到来,将数据库原有的计算和存储能力全部打散,并植入分布式和云原生级别的全新能力,会不可避免出现“重复造轮”。但 Database Plus既重视传统数据库的实践经验,又适配于新一代分布式数据库的设计理念。无论是集中式还是分布式的数据库,Database Plus都能复用数据库的存储和原生计算能力,并在其基础之上提供全局化的能力增强,主要体现在:分布式、数据控制、流量控制三个方面。Database Plus 将支持的数据库种类和增强功能相叠加,以排列组合的方式提供给用户使用。ShardingSphere将功能增强划层面划分为内核层和可选功能层。其中内核层包含查询优化器、分布式事务、执行引擎、权限引擎等与数据库内核强相关的功能,以及调度引擎、分布式治理等与分布式强相关的功能;可选功能层的功能模块由开源社区沉淀而形成,除最具代表性的数据分片和读写分离之外,高可用、弹性伸缩、数据加密、影子库等功能模块也都在逐步的完善之中。3.可插拔:构建数据库功能生态连接和增强的可插拔化,既是Database Plus通用层维持小而美的基石,也是扩展生态无限化的有效保障。通过可插拔体系,Database Plus 将能够真正构建面向数据库的功能生态,将异构数据库的全局能力统一纳管。它不仅面向集中式数据库的分布式化,也同时面向分布式数据库的竖井功能一体化。ShardingSphere 的可插拔架构更像是一个平台,并不会关注具体某一个功能或数据库,而是将所有的功能和连接都插件化,能够在 ShardingSphere生态中实现快速融合与脱离。目前,从最初的 MySQL+数据分片为核心的架构模型,到如今的微内核+可插拔架构,ShardingSphere已进行了彻底的改造。从提供连接的数据库种类和增强功能到内核能力,ShardingSphere已全部面向可插拔。ShardingSphere 的架构核心到外围,由微内核、可插拔接口、插件实现的三层模型组成,层次之间单项依赖,微内核对插件功能完全无需感知,插件之间也无需相互依赖。对于一个拥有200+模块的大型项目来说,架构的解耦和隔离,是社区开放协作,并且将错误影响范围降低至最小的有效保障。性能可信:使用ShardingSphere的核心优势 目前数据库市场碎片化程度日益加重,不同数据库在各领域细分场景下得以充分展现自身优势的同时,也为企业带来了较为复杂的选型问题。而ShardingSphere凭借强劲且可信度较高的性能,天然支持多数据库用户生态,能够为用户有效控制选型及迁移成本。一方面,ShardingSphere能够做到让企业级用户在不变更数据库底层配置的基础上,实现数据库上层的增量加强服务。另一方面,如果用户想要变更数据库底层环境及相关配置,使用ShardingSphere也可以实现无感知的“无缝迁移”。1.ShardingSphere 的极致性能根据上图,可以看到非常明显的差异。毫无疑问,ShardingSphere-JDBC 的性能最为突出。当然,ShardingSphere 作为一款为底层数据库提供增量服务的平台,与底层数据库对接后双方的『适配』情况也关系到在真实生产环境中的性能。而自身高度灵活的可扩展性以及强兼容性,使得 ShardingSphere 具备了面向多种底层数据库的强大兼容能力。此前在ShardingSphere与openGauss的合作中,双方使用16台服务器在超过1小时的测试中,得到了超过1000万tpmC的结果,在极大提升数据库性能极限的同时,ShardingSphere更是满足了 openGauss在海量数据场景下关于可用性以及运维成本等多方面的诉求。Apache ShardingSphere凭借本身强大的兼容性,向下支持多种数据存储引擎,使其可以存在于各类数据库之上,形成一套特有的数据库上层服务生态。而这种能力,恰好能够与国产老牌数据库之间产生明显的互补作用。Apache ShardingSphere愿意同国产数据库共同成长,充分利用现有国产数据库的计算与存储能力,通过插件化方式增强自身核心能力,共同构建健壮的国产数字化基础设施。2.ShardingSphere的易用性在使用层面,用户操作ShardingSphere和操作数据库是没有任何区别的。当然ShardingSphere提供了很多额外的能力,包括数据分片、数据加密、流量治理、读写分离等等。但这些能力在原生数据库上并不具备,因此用户无法通过操作标准SQL来实现这些能力。在考虑到这些后,ShardingSphere提供了DistSQL能力,凭借其『动态生效、无需重启』的特性,开发者和运维人员可以通过 DistSQL来操作管理ShardingSphere,不需要增加更多的学习成本,为ShardingSphere生态带来了强大的动态管理能力。通过DistSQL,用户可以实现在线创建逻辑库、动态配置规则、实时调整存储资源、即时切换事物类型、随时开关SQL日志、预览 SQL路由结果等能力,极大提升了产品的易用性。3.ShardingSphere 的可插拔内核架构上图为 ShardingSphere 微内核架构的组合,可以分成大致的三层。中心部分是微内核,设置了ShardingSphere核心流程,由计算下推引擎和联邦查询组成。计算下推引擎主要负责SQL改写。联邦查询帮助ShardingSphere提升了SQL兼容能力,实现了跨库关联查询及跨库子查询的能力。紫色部分是ShardingSphere所定义的可插拔接口,当开发者想提供新的基于ShardingSphere的能力时,无论是对接新的数据库还是开发多租户的功能,都可以通过可插拔接口直接将该功能植入到 ShardingSphere体系中。最外侧绿色部分是开发者基于ShardingSphere所实现的具体内容,包括根据自身业务场景和商业诉求进行适配后所实现的具体能力,这部分并不强迫进行开源。此外这部分的能力也能够以系统级别植入到公司自己的ShardingSphere内核层面,进而实现完全自主可控的数据库平台。场景可信:ShardingSphere适用场景 此外,针对不同的用户需求ShardingSphere能够在多元化的应用场景下实现完美适配。前面提到,ShardingSphere能够复用数据库的存储和原生计算能力,并在其基础之上提供全局化的能力增强,主要体现在分布式、数据控制、流量控制三个方面。1.分布式数据库为解决原有方案的技术瓶颈,降低更换架构带来的复杂性风险,在不更换原有架构前提下,ShardingSphere能够实现数据库同步、管理多个异构数据库集群、线性提升数据存储容量及并发吞吐。进而为用户提供基于数据分片,分布式事务、弹性伸缩的分布式数据库解决方案,使用户的数据库兼具单机交易型数据库稳定性和分布式数据库的扩展能力。2.面向数据控制用户可以通过ShardingSphere对数据本身实现控制,如数据加解密、SQL审计等。此外为防止数据泄露,用户可以使用 ShardingSphere 在基于产品的数据加密和数据脱敏功能之上升级为数据安全解决方案,进而能够在不改动原有代码的前提下,为企业提供跨平台、异构环境的数据安全解决方案。3.面向流量控制基于本身内核的SQL解析能力以及可插拔平台架构,ShardingSphere能够实现压测数据与生产数据的隔离,帮助应用自动路由,同时支持全链路压测,进而帮助用户实现在生产环境下获得较为准确地反应系统真实容量水平和性能的测试结果。作为数据库相关领域的强劲引擎,ShardingSphere 将以其极致性能处理、高易用、可插拔内核架构的核心特点,切实帮助各企业级用户解决其业务场景中的痛点问题,从而充分释放数据潜能,加速自身业务增长。来源:大数据技术标准推进委员会
  • [技术干货] 开源SPL强化MangoDB计算-转载
    MongoDB是NoSQL数据库的典型代表,支持文档结构的存储方式数据存储和使用更为便捷,数据存取效率也很高,但计算能力较弱,实际使用中涉及MongoDB的计算尤其是复杂计算会很麻烦,这就需要具备强计算能力的数据处理引擎与其配合。开源集算器SPL是一款专业结构化数据计算引擎,拥有丰富的计算类库和完备、不依赖数据库的计算能力。SPL提供了独立的过程计算语法,尤其擅长复杂计算,可以增强MongoDB的计算能力,完成分组汇总、关联计算、子查询等通通不在话下。常规查询MongoDB不容易搞定的连接JOIN运算,用SPL很容易搞定:A    B1    =mongo_open("mongodb://127.0.0.1:27017/raqdb")    /连接MongDB2    =mongo_shell(A1,"c1.find()").fetch()    /获取数据3    =mongo_shell(A1,"c2.find()").fetch()    4    =A2.join(user1:user2,A3:user1:user2,output)    /关联计算5    >A1.close()    /关闭连接 单表多次参与运算,复用计算结果:A    B1    =mongo_open("mongodb://127.0.0.1:27017/raqdb")    2    =mongo_shell(A1,“course.find(,{_id:0})”).fetch()    /获取数据3    =A2.group(Sno).((avg   = ~.avg(Grade), ~.select(Grade>avg))).conj()    /计算成绩大于平均值4    >A1.close()     IN计算:A    B1    =mongo_open("mongodb://localhost:27017/test")    2    =mongo_shell(A1,"orders.find(,{_id:0})")    /获取数据3    =mongo_shell(A1,"employee.find({STATE:'California'},{_id:0})").fetch()    /过滤employee数据4    =A3.(EID).sort()    /取出EID并排序5    =A2.select(A4.pos@b(SELLERID)).fetch()    /二分法查找6    >A1.close()     外键对象化,外键指针不仅方便,效率也高:A    B1    =mongo_open("mongodb://localhost:27017/local")    2    =mongo_shell(A1,"Progress.find({},   {_id:0})").fetch()    /获取Progress数据3    =A2.groups(courseid;   count(userId):popularityCount)    /按课程分组计数4    =mongo_shell(A1,"Course.find(,{title:1})").fetch()    /获取Course数据5    =A3.switch(courseid,A4:_id)    /外键连接6    =A5.new(popularityCount,courseid.title)    /创建结果集7    =A1.close()     APPLY算法的简单实现:A    B1    =mongo_open("mongodb://127.0.0.1:27017/raqdb")    2    =mongo_shell(A1,"users.find()").fetch()    /获取users数据3    =mongo_shell(A1,"workouts.find()").fetch()    /获取workouts数据4    =A2.conj(A3.select(A2.workouts.pos(_id)).derive(A2.name))    /查询_id 值workouts 序列的记录5    >A1.close()     集合运算,合并交差:A    B1    =mongo_open("mongodb://127.0.0.1:27017/raqdb")    2    =mongo_shell(A1,"emp1.find()").fetch()    3    =mongo_shell(A1,"emp2.find()").fetch()    4    =[A2,A3].conj()    /多序列合集5    =[A2,A3].merge@ou()    /全行对比求并集6    =[A2,A3].merge@ou(_id,   NAME)    /键值对比求并集7    =[A2,A3].merge@oi()    /全行对比求交集8    =[A2,A3].merge@oi(_id,   NAME)    /键值对比求交集9    =[A2,A3].merge@od()    /全行对比求差集10    =[A2,A3].merge@od(_id,   NAME)    /键值对比求差集11    >A1.close()     在序列中查找成员序号:A    B1    =mongo_open("mongodb://localhost:27017/local)    2    =mongo_shell(A1,"users.find({name:'jim'},{name:1,friends:1,_id:0})")   .fetch()    3    =A2.friends.pos("luke")    /从friends序列中获取成员序号4    =A1.close()     多成员集合的交集:A    B1    [Chemical,   Biology, Math]    /课程2    =mongo_open("mongodb://127.0.0.1:27017/raqdb")    3    =mongo_shell(A2,"student.find()").fetch()    /获取student数据4    =A3.select(Lesson^A1!=[])    /查询选修至少一门的记录5    =A4.new(_id,   Name, ~.Lesson^A1:Lession)    /计算出结果6    >A2.close()    复杂计算TOPN运算:A    B    1    =mongo_open("mongodb://127.0.0.1:27017/test")        2    =mongo_shell(A1,"last3.find(,{_id:0};{variable:1})")    /获取last3数据,并按variable排序    3    for A2;variable    =A3.top(3;-timestamp)    /选出timestamp最晚的3个4        =@|B3    /将选出文档追加到B4中5    =B4.minp(~.timestamp)         /选出timstamp最早的文档    6    >mongo_close(A1)         嵌套结构的聚合:A1    =mongo_open("mongodb://127.0.0.1:27017/raqdb")2    =mongo_shell(A1,"computer.find()").fetch()3    =A2.new(_id:ID,income.array().sum():INCOME,output.array().sum():OUTPUT)4    >A1.close() 合并多属性子文档:A    B    C1    =mongo_open("mongodb://localhost:27017/local")        2    =mongo_shell(A1,"c1.find(,{_id:0};{name:1})")        3    =create(_id,   readUsers)        /创建结果序表4    for   A2;name    =A4.conj(acls.read.users|acls.append.users|acls.edit.users|acls.fullControl.users).id()    /取出所有users字段5        >A3.insert(0,   A4.name, B4)    /插入本组数据6    =A1.close()         嵌套List子文档的查询A    B1    =mongo_open("mongodb://localhost:27017/local")    2    =mongo_shell(A1,"Cbettwen.find(,{_id:0})").fetch()    3    =A2.conj((t=~.objList.data.dataList,   t.select((s=float(~.split@c1()(1)), s>6154   && s<=6155))))    /找到符合条件的字符串4    =A1.close()     交叉汇总:A1    =mongo_open("mongodb://localhost:27017/local")2    =mongo_shell(A1,"student.find()").fetch()3    =A2.group(school)4    =A3.new(school:school,~.align@a(5,sub1).(~.len()):sub1,~.align@a(5,sub2).(~.len()):sub2)5    =A4.new(school,sub1(5):sub1-5,sub1(4):sub1-4,sub1(3):sub1-3,sub1(2):sub1-2,sub1(1):sub1-1,sub2(5):sub2-5,sub2(4):sub2-4,sub2(3):sub2-3,sub2(2):sub2-2,sub2(1):sub2-1)6    =A1.close() 分段分组A    B1    [3000,5000,7500,10000,15000]    /Sales分段区间2    =mongo_open("mongodb://127.0.0.1:27017/raqdb")    3    =mongo_shell(A2,"sales.find()").fetch()    4    =A3.groups(A1.pseg(~.SALES):Segment;count(1):   number)    /根据 SALES 区间分组统计员工数5    >A2.close()     分类分组A    B1    =mongo_open("mongodb://127.0.0.1:27017/raqdb")    2    =mongo_shell(A1,"books.find()")    3    =A2.groups(addr,book;count(book):   Count)    /分组计数4    =A3.groups(addr;sum(Count):Total)    /分组统计5    =A3.join(addr,A4:addr,Total)    /关联计算6    >A1.close()     数据写入导出成CSV:A    B1    =mongo_open("mongodb://localhost:27017/raqdb")    2    =mongo_shell(A1,"carInfo.find(,{_id:0})")    3    =A2.conj((t=~,cars.car.new(t.id:id,   t.cars.name, ~:car)))    /对car字段进行拆分成行4    =file("D:\\data.csv").export@tc(A3)    /导出生成csv文件5    >A1.close()     更新数据库(MongoDB到MySQL):A    B1    =mongo_open("mongodb://localhost:27017/raqdb")    /连接MongDB2    =mongo_shell(A1,"course.find(,{_id:0})").fetch()    3    =connect("myDB1")    /连接mysql4    =A3.query@x("select   * from course2").keys(Sno, Cno)    5    >A3.update(A2:A4,   course2, Sno, Cno, Grade; Sno,Cno)    /向mysql更新数据6    >A1.close()     更新数据库(MySQL到MongoDB):A    B1    =connect("mysql")    /连接mysql2    =A1.query@x("select   * from course2")    /获取表course2数据3    =mongo_open("mongodb://localhost:27017/raqdb")    /连接MongDB4    =mongo_insert(A3,   "course",A2)    /将MySQL表course2导入MongoDB集合course5    >A3.close()     混合计算借助SPL还很容易实现MongoDB与其他数据源进行混合计算:A    B1    =mongo_open("mongodb://localhost:27017/test")    /连接MongDB2    =mongo_shell(A1,"emp.find({'$and':[{'Birthday':{'$gte':'"+string(begin)+"'}},{'Birthday':{'$lte':'"+string(end)+"'}}]},{_id:0})").fetch()    /查询某时间段的记录3    =A1.close()    /关闭MongoDB4    =myDB1.query("select   * from cities")    /获取mysql中表cities数据5    =A2.switch(CityID,A4:   CityID)    /外键关联6    =A5.new(EID,Dept,CityID.CityName:CityName,Name,Gender)    /创建结果集7    return   A6    /返回SQL支持SPL除了原生语法,还提供了相当于SQL92标准的SQL支持,可以使用SQL查询MongoDB了,比如前面的关联计算:A1    =mongo_open("mongodb://127.0.0.1:27017/test")2    =mongo_shell(A1,"c1.find()").fetch()3    =mongo_shell@x(A1,"c2.find()").fetch()4    $select s.* from {A2} as s left join {A3}   as r on s.user1=r.user1 and s.user2=r.user2 where r.income>0.3应用集成不仅如此,SPL提供了标准JDBC/ODBC等应用程序接口,集成调用很方便。如JDBC的使用:…Class.forName("com.esproc.jdbc.InternalDriver");Connection conn = DriverManager.getConnection("jdbc:esproc:local://");PrepareStatement st=con.prepareStatement("call splScript(?)"); // splScript为spl脚本文件名st.setObject(1,"California");st.execute();ResultSet rs = st.getResultSet();…有了这些功能,增强MongoDB的计算能力可不是说说而已,要不要下载试试?————————————————版权声明:本文为CSDN博主「石臻臻的杂货铺」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/u010634066/article/details/125854301
  • [技术干货] 红外热像仪是怎么测量体温的?红外技术怎么这么强大!
    不同于过去夹在腋下的水银体温计,现在的测体温方式似乎更“高级”了,你只要从它面前走过,它就能告诉你你的体温是多少,大家是不是好奇他们是怎么获得我们的体温的呢?下面我就给大家简单地科普一下。首先,我们要了解一个概念,就是任何温度超过0K(-273.15℃)的物体都会发出热辐射,也被称为电磁波,当温度越高,热辐射也是越强的。也就是说,只要是在这个地球上存在的物体,都会发出热辐射,红外测温就是基于这个原理,红外测温仪就是通过获得我们人体发出的热辐射,再依据热辐射的强弱来显示我们的体温的,它的具体测温流程为:红外测温仪将铺捉到的被测物体的红外辐射通过光学系统,送到它的红外探测器上,探测器将热辐射转换为电压信号,电压信号再经过读出电路的处理就可以转换为温度进行输出了。从红外测温仪的工作原理和工作方式来看,它具有测量速度快,非接触等突出优势,这些优势使得红外测温仪在疫情防控中发挥着巨大的作用。
  • [其他] EI企业智能2022年7月高热贴合集
    ## EI企业智能2022年7月高热贴合集 以下是EI企业智能板块在2022年7月份的高热贴的合集,虽然今年的三伏天已热的突破历史,但本月AI开发平台ModelArts、数仓GaussDB(DWS)板块的热度更高。 另外板块名称有一些小小的修改,比如 **ModelArts** 改为了 `AI开发平台ModelArts` **HiLens** 改为了 `华为HiLens & ModelBox` 新名称新气象啊~ ## 数仓GaussDB(DWS) GaussDB 8.0.0.1版本 巡检工具806,互信中提到的sshTool.sh文件从哪里获取?https://bbs.huaweicloud.com/forum/thread-193193-1-1.html autovacuum如何配置可以实现定时全库全表analyse?https://bbs.huaweicloud.com/forum/thread-193348-1-1.html 【DWS】【sql】pg_stat_user_functions 为什么没有数据:https://bbs.huaweicloud.com/forum/thread-193726-1-1.html dws中sql在执行Streaming(type: REDISTRIBUTE)之前先进行HashAggregate是否能提升性能:https://bbs.huaweicloud.com/forum/thread-193978-1-1.html 【GaussDB 8.1.1】【Oracle的months_between函数迁移】Oracle函数迁移效率不行:https://bbs.huaweicloud.com/forum/thread-193925-1-1.html gaussdb如果查询所有表名及主键字段名称?或者如何查询单表的主键字段名称:https://bbs.huaweicloud.com/forum/thread-193958-1-1.html 如何通过sql实现全表的分析:https://bbs.huaweicloud.com/forum/thread-194033-1-1.html 修改autovacuum参数时报错:https://bbs.huaweicloud.com/forum/thread-193927-1-1.html MRS的Flink连接DWS,运行12小时报错:https://bbs.huaweicloud.com/forum/thread-194438-1-1.html dws执行计划中的actual time代表什么:https://bbs.huaweicloud.com/forum/thread-194574-1-1.html 为何 DWS to_date(xxx,'yyyymmdd')关联比 cast(xxx as date) 关联效率慢:https://bbs.huaweicloud.com/forum/thread-194316-1-1.html 【数仓GaussDB(DWS)】【bytea类型】使用postgresql.jar驱动包解析出错:https://bbs.huaweicloud.com/forum/thread-195190-1-1.html 【华为云DWS】【ODBC】PHP ODBC连接公有云上的DWS数据库怎么操作啊:https://bbs.huaweicloud.com/forum/thread-195440-1-1.html 【GaussDB】【bytea类型】column "bytes_" is of type bytea but expressio:https://bbs.huaweicloud.com/forum/thread-195501-1-1.html GaussDB(DWS)存储过程exception捕捉others异常后,记录日志的语句不会提交:https://bbs.huaweicloud.com/forum/thread-195599-1-1.html ## AI开发平台ModelArts 【CodeLab】开发环境有点老,有计划更新吗:https://bbs.huaweicloud.com/forum/thread-192975-1-1.html 2022华为开发者大赛 · 崇本英才·智汇吴江· 无人车挑战赛 判分失败 scoring job failed:https://bbs.huaweicloud.com/forum/thread-193791-1-1.html 【沈阳昇腾创新中心+openlab训练回归模型警告问题】(NPU使用问题):https://bbs.huaweicloud.com/forum/thread-193768-1-1.html 用yolov5模型训练,上传数据集应该遵循哪种格式,是否需要添加验证集?https://bbs.huaweicloud.com/forum/thread-193706-1-1.html ModelArts支持视频流分析吗? https://bbs.huaweicloud.com/forum/thread-193943-1-1.html modelarts训练作业时,从obs下载文件,下载速率是多少?https://bbs.huaweicloud.com/forum/thread-193705-1-1.html 【Codelab】请问下Codelab里打开的notebook,是否可能SSH接入:https://bbs.huaweicloud.com/forum/thread-194854-1-1.html 【ModelArts】【Notebook】VScode不能用SSH连接ModelArts Notebook:https://bbs.huaweicloud.com/forum/thread-194556-1-1.html ModelArts训练开发故障“临终遗言“:https://bbs.huaweicloud.com/forum/thread-194442-1-1.html 【在线服务】【404】在线服务部署后预测失败是什么原因呀:https://bbs.huaweicloud.com/forum/thread-194910-1-1.html 【数据集】【分割】请教一下这个数据集的annotation怎么看?https://bbs.huaweicloud.com/forum/thread-194873-1-1.html 【ModelArts产品】【模型训练功能】用coco2014数据集训练yolov3-darknet53模型报错:https://bbs.huaweicloud.com/forum/thread-194920-1-1.html 金融情绪分析FinBERT 无法正常跑通(调小batch):https://bbs.huaweicloud.com/forum/thread-195281-1-1.html 【ModelArts产品】【模型训练功能】tacotron2训练报错,缺少unidecode模组:https://bbs.huaweicloud.com/forum/thread-195327-1-1.html notebook的资费是不是涨了:https://bbs.huaweicloud.com/forum/thread-195442-1-1.html ## 华为HiLens & ModelBox 用hilens studio创建技能时,再导入OM文件时,一直在报导入模型失败:https://bbs.huaweicloud.com/forum/thread-194172-1-1.html hilens 技能开发页面导入自己模型,启动技能没反应:https://bbs.huaweicloud.com/forum/thread-193032-1-1.html HiLens如何用HDMI来连接显示屏:https://bbs.huaweicloud.com/forum/thread-193510-1-1.html hilens设备告警看不懂,日志内容怎么看:https://bbs.huaweicloud.com/forum/thread-194133-1-1.html hilens studio与手机摄像头实现视频流显示的错误:https://bbs.huaweicloud.com/forum/thread-194162-1-1.html hilens怎么保存视频(推理后):https://bbs.huaweicloud.com/forum/thread-194037-1-1.html hilens的摄像头如何录制视频,并且保存在自己想要保存 的位置:https://bbs.huaweicloud.com/forum/thread-194434-1-1.html 打不开hilens kit的ip地址:https://bbs.huaweicloud.com/forum/thread-194688-1-1.html ## 混合云FusionInsight hive元数据库连接:https://bbs.huaweicloud.com/forum/thread-192987-1-1.html Flink的准备安全认证问题:https://bbs.huaweicloud.com/forum/thread-193349-1-1.html flink提交任务运行失败:https://bbs.huaweicloud.com/forum/thread-193657-1-1.html 如何查看sceurity 是否配置成功(Flink客户端):https://bbs.huaweicloud.com/forum/thread-193744-1-1.html Flink的JDBCsink,batchintervalMs和BatchSize参数问题:https://bbs.huaweicloud.com/forum/thread-195124-1-1.html spark客户端提交代码报错Unable to obtain password from user 找不到密码:https://bbs.huaweicloud.com/forum/thread-195544-1-1.html ## MapReduce服务 【MRS产品】【hetuengine功能】hetu配置clickhouse数据源与clickhouse查询的结果不一致:https://bbs.huaweicloud.com/forum/thread-192997-1-1.html 【MRS产品】【hetu配置数据源功能】hetu是否能配置hive的内置元数据库数据源:https://bbs.huaweicloud.com/forum/thread-193786-1-1.html 【MRS】【hetu查询】进入hetu命令行不管输入什么都报错:Error running command: java.net.:https://bbs.huaweicloud.com/forum/thread-195417-1-1.html
  • [API集成编排] ADC2.1 sql中时间函数怎么使用的?
  • [知识分享] openGauss内核分析:查询重写
    摘要:查询重写优化既可以基于关系代数的理论进行优化,也可以基于启发式规则进行优化。本文分享自华为云社区《openGauss内核分析(四):查询重写》,作者:酷哥。查询重写SQL语言是丰富多样的,非常的灵活,不同的开发人员依据经验的不同,手写的SQL语句也是各式各样,另外还可以通过工具自动生成。SQL语言是一种描述性语言,数据库的使用者只是描述了想要的结果,而不关心数据的具体获取方式,输入数据库的SQL语言很难做到是以最优形式表示的,往往隐含了一些冗余信息,这些信息可以被挖掘用来生成更加高效的SQL语句。查询重写就是把用户输入的SQL语句转换为更高效的等价SQL,查询重写遵循两个基本原则。• 等价性:原语句和重写后的语句,输出结果相同。• 高效性:重写后的语句,比原语句在执行时间和资源使用上更高效。查询重写优化既可以基于关系代数的理论进行优化,例如谓词下推、子查询优化等,也可以基于启发式规则进行优化,例如Outer Join消除、表连接消除等。查询重写是基于规则的逻辑优化。在代码层面,查询重写的架构如下:下面以外连接消除Outer2Inner—外连接转内连接为例分析查询重写过程:在left outer join或者right outer join中,如果查询条件中存在逻辑上能够包含IS NOT NULL,例如c1 > 0,可以将查询转换成INNER JOIN,从而减少关联处理产生的中间结果集外连接消除Outer2Inner下面首先以一个例子来说明各种多表连接方式的区别create table t1(c1 int, c2 int); create table t2(c1 int, c2 int); insert into t1 values(1, 10); insert into t1 values(2, 20); insert into t1 values(3, 30); insert into t2 values(1, 100); insert into t2 values(3, 300); insert into t2 values(5, 500);内连接inner join:返回两个表都满足的组合,相当于取两个表的交集SELECT * FROM t1 inner JOIN t2 ON t1.c1 = t2.c1;左连接 left outer join:返回左表中的所有行,如果左表中行在右表中没有匹配行,则结果中右表中的列返回空值SELECT * FROM t1 Left OUTER JOIN t2 ON t1.c1 = t2.c1;右连接 right outer join:返回右表中的所有行,如果右表中行在左表中没有匹配行,则结果中左表中的列返回空值SELECT * FROM t1 right OUTER JOIN t2 ON t1.c1 = t2.c1;全连接 full join:返回左表和右表中的所有行。当某行在另一表中没有匹配行,则另一表中的列返回空值,相当于取两个表并集SELECT * FROM t1 full JOIN t2 ON t1.c1 = t2.c1;在以上实验的基础上增加t2表的where条件left join和inner join的结果是一样的,这是因为查询条件中包含WHERE t2.c2 >100这个条件,t2表所有不匹配元组均被过滤掉(包括空值),因此可以进行查询转换left-outer join -> inner join,能够有效减小t1和t2关联产生的结果集,达到性能提升的目的。在openGauss数据库系统中,subquery_planner会遍历查询树中的rtable,看看是否有RTE_JOIN类型的节点存在,设置hasOuterJoins标志量,从而进入到reduce_outer_joins接口,满足外连接消除条件时再执行外连接的消除。 reduce_outer_Joins函数内部做两个动作,(1)reduce_outer_joins_pass1预检查,就是检查jointree中是否含有外链接,以及一些引用表的信息,为动作2做好信息采集准备,重点参考数据结构reduce_outer_joins_state;(2)reduce_outer_joins_pass2真正完成消除外链接。void reduce_outer_joins(PlannerInfo* root) { reduce_outer_joins_state* state = NULL; state = reduce_outer_joins_pass1((Node*)root->parse->jointree); /* planner.c shouldn't have called me if no outer joins */ if (state == NULL || !state->contains_outer) ereport(ERROR, (errmodule(MOD_OPT), errcode(ERRCODE_OPTIMIZER_INCONSISTENT_STATE), (errmsg("so where are the outer joins?")))); reduce_outer_joins_pass2((Node*)root->parse->jointree, state, root, NULL, NIL, NIL); }利用上一期的分析方法,可以得到查询树内存结构(查询树Query结构体中targetList存储目标属性语义分析结果,rtable存储FROM子句生成的范围表,jointree的quals字段存储WHERE子句语义分析的表达式树)对比reduce_outer_joins运行前后查询树,jointree和rtable中的jointype都由join_left转换为join_inner,即外连接已转为内连接(gdb) p *((JoinExpr*)(parse->jointree->fromlist->head.data->ptr_value)) $1 = {type = T_JoinExpr, jointype = JOIN_INNER, isNatural = false, larg = 0x7fdfb345cd08, rarg = 0x7fdfb345e2e8, usingClause = 0x0, quals = 0x7fdfb2f0b8a8, alias = 0x0, rtindex = 3} (gdb) p *(RangeTblEntry*)(parse->rtable->tail.data->ptr_value) $2 = {type = T_RangeTblEntry, rtekind = RTE_JOIN, relname = 0x0, partAttrNum = 0x0, relid = 0, partitionOid = 0, isContainPartition = false, subpartitionOid = 0, isContainSubPartition = false, refSynOid = 0, partid_list = 0x0, relkind = 0 '\000', isResultRel = false, tablesample = 0x0, timecapsule = 0x0, ispartrel = false, ignoreResetRelid = false, subquery = 0x0, security_barrier = false, jointype = JOIN_INNER, …}
  • [技术干货] 开源SPL强化MangoDB计算-转载
    MongoDB是NoSQL数据库的典型代表,支持文档结构的存储方式数据存储和使用更为便捷,数据存取效率也很高,但计算能力较弱,实际使用中涉及MongoDB的计算尤其是复杂计算会很麻烦,这就需要具备强计算能力的数据处理引擎与其配合。开源集算器SPL是一款专业结构化数据计算引擎,拥有丰富的计算类库和完备、不依赖数据库的计算能力。SPL提供了独立的过程计算语法,尤其擅长复杂计算,可以增强MongoDB的计算能力,完成分组汇总、关联计算、子查询等通通不在话下。常规查询MongoDB不容易搞定的连接JOIN运算,用SPL很容易搞定:A    B1    =mongo_open("mongodb://127.0.0.1:27017/raqdb")    /连接MongDB2    =mongo_shell(A1,"c1.find()").fetch()    /获取数据3    =mongo_shell(A1,"c2.find()").fetch()    4    =A2.join(user1:user2,A3:user1:user2,output)    /关联计算5    >A1.close()    /关闭连接 单表多次参与运算,复用计算结果:A    B1    =mongo_open("mongodb://127.0.0.1:27017/raqdb")    2    =mongo_shell(A1,“course.find(,{_id:0})”).fetch()    /获取数据3    =A2.group(Sno).((avg   = ~.avg(Grade), ~.select(Grade>avg))).conj()    /计算成绩大于平均值4    >A1.close()     IN计算:A    B1    =mongo_open("mongodb://localhost:27017/test")    2    =mongo_shell(A1,"orders.find(,{_id:0})")    /获取数据3    =mongo_shell(A1,"employee.find({STATE:'California'},{_id:0})").fetch()    /过滤employee数据4    =A3.(EID).sort()    /取出EID并排序5    =A2.select(A4.pos@b(SELLERID)).fetch()    /二分法查找6    >A1.close()     外键对象化,外键指针不仅方便,效率也高:A    B1    =mongo_open("mongodb://localhost:27017/local")    2    =mongo_shell(A1,"Progress.find({},   {_id:0})").fetch()    /获取Progress数据3    =A2.groups(courseid;   count(userId):popularityCount)    /按课程分组计数4    =mongo_shell(A1,"Course.find(,{title:1})").fetch()    /获取Course数据5    =A3.switch(courseid,A4:_id)    /外键连接6    =A5.new(popularityCount,courseid.title)    /创建结果集7    =A1.close()     APPLY算法的简单实现:A    B1    =mongo_open("mongodb://127.0.0.1:27017/raqdb")    2    =mongo_shell(A1,"users.find()").fetch()    /获取users数据3    =mongo_shell(A1,"workouts.find()").fetch()    /获取workouts数据4    =A2.conj(A3.select(A2.workouts.pos(_id)).derive(A2.name))    /查询_id 值workouts 序列的记录5    >A1.close()     集合运算,合并交差:A    B1    =mongo_open("mongodb://127.0.0.1:27017/raqdb")    2    =mongo_shell(A1,"emp1.find()").fetch()    3    =mongo_shell(A1,"emp2.find()").fetch()    4    =[A2,A3].conj()    /多序列合集5    =[A2,A3].merge@ou()    /全行对比求并集6    =[A2,A3].merge@ou(_id,   NAME)    /键值对比求并集7    =[A2,A3].merge@oi()    /全行对比求交集8    =[A2,A3].merge@oi(_id,   NAME)    /键值对比求交集9    =[A2,A3].merge@od()    /全行对比求差集10    =[A2,A3].merge@od(_id,   NAME)    /键值对比求差集11    >A1.close()     在序列中查找成员序号:A    B1    =mongo_open("mongodb://localhost:27017/local)    2    =mongo_shell(A1,"users.find({name:'jim'},{name:1,friends:1,_id:0})")   .fetch()    3    =A2.friends.pos("luke")    /从friends序列中获取成员序号4    =A1.close()     多成员集合的交集:A    B1    [Chemical,   Biology, Math]    /课程2    =mongo_open("mongodb://127.0.0.1:27017/raqdb")    3    =mongo_shell(A2,"student.find()").fetch()    /获取student数据4    =A3.select(Lesson^A1!=[])    /查询选修至少一门的记录5    =A4.new(_id,   Name, ~.Lesson^A1:Lession)    /计算出结果6    >A2.close()    复杂计算TOPN运算:A    B    1    =mongo_open("mongodb://127.0.0.1:27017/test")        2    =mongo_shell(A1,"last3.find(,{_id:0};{variable:1})")    /获取last3数据,并按variable排序    3    for A2;variable    =A3.top(3;-timestamp)    /选出timestamp最晚的3个4        =@|B3    /将选出文档追加到B4中5    =B4.minp(~.timestamp)         /选出timstamp最早的文档    6    >mongo_close(A1)         嵌套结构的聚合:A1    =mongo_open("mongodb://127.0.0.1:27017/raqdb")2    =mongo_shell(A1,"computer.find()").fetch()3    =A2.new(_id:ID,income.array().sum():INCOME,output.array().sum():OUTPUT)4    >A1.close() 合并多属性子文档:A    B    C1    =mongo_open("mongodb://localhost:27017/local")        2    =mongo_shell(A1,"c1.find(,{_id:0};{name:1})")        3    =create(_id,   readUsers)        /创建结果序表4    for   A2;name    =A4.conj(acls.read.users|acls.append.users|acls.edit.users|acls.fullControl.users).id()    /取出所有users字段5        >A3.insert(0,   A4.name, B4)    /插入本组数据6    =A1.close()         嵌套List子文档的查询A    B1    =mongo_open("mongodb://localhost:27017/local")    2    =mongo_shell(A1,"Cbettwen.find(,{_id:0})").fetch()    3    =A2.conj((t=~.objList.data.dataList,   t.select((s=float(~.split@c1()(1)), s>6154   && s<=6155))))    /找到符合条件的字符串4    =A1.close()     交叉汇总:A1    =mongo_open("mongodb://localhost:27017/local")2    =mongo_shell(A1,"student.find()").fetch()3    =A2.group(school)4    =A3.new(school:school,~.align@a(5,sub1).(~.len()):sub1,~.align@a(5,sub2).(~.len()):sub2)5    =A4.new(school,sub1(5):sub1-5,sub1(4):sub1-4,sub1(3):sub1-3,sub1(2):sub1-2,sub1(1):sub1-1,sub2(5):sub2-5,sub2(4):sub2-4,sub2(3):sub2-3,sub2(2):sub2-2,sub2(1):sub2-1)6    =A1.close() 分段分组A    B1    [3000,5000,7500,10000,15000]    /Sales分段区间2    =mongo_open("mongodb://127.0.0.1:27017/raqdb")    3    =mongo_shell(A2,"sales.find()").fetch()    4    =A3.groups(A1.pseg(~.SALES):Segment;count(1):   number)    /根据 SALES 区间分组统计员工数5    >A2.close()     分类分组A    B1    =mongo_open("mongodb://127.0.0.1:27017/raqdb")    2    =mongo_shell(A1,"books.find()")    3    =A2.groups(addr,book;count(book):   Count)    /分组计数4    =A3.groups(addr;sum(Count):Total)    /分组统计5    =A3.join(addr,A4:addr,Total)    /关联计算6    >A1.close()     数据写入导出成CSV:A    B1    =mongo_open("mongodb://localhost:27017/raqdb")    2    =mongo_shell(A1,"carInfo.find(,{_id:0})")    3    =A2.conj((t=~,cars.car.new(t.id:id,   t.cars.name, ~:car)))    /对car字段进行拆分成行4    =file("D:\\data.csv").export@tc(A3)    /导出生成csv文件5    >A1.close()     更新数据库(MongoDB到MySQL):A    B1    =mongo_open("mongodb://localhost:27017/raqdb")    /连接MongDB2    =mongo_shell(A1,"course.find(,{_id:0})").fetch()    3    =connect("myDB1")    /连接mysql4    =A3.query@x("select   * from course2").keys(Sno, Cno)    5    >A3.update(A2:A4,   course2, Sno, Cno, Grade; Sno,Cno)    /向mysql更新数据6    >A1.close()     更新数据库(MySQL到MongoDB):A    B1    =connect("mysql")    /连接mysql2    =A1.query@x("select   * from course2")    /获取表course2数据3    =mongo_open("mongodb://localhost:27017/raqdb")    /连接MongDB4    =mongo_insert(A3,   "course",A2)    /将MySQL表course2导入MongoDB集合course5    >A3.close()     混合计算借助SPL还很容易实现MongoDB与其他数据源进行混合计算:A    B1    =mongo_open("mongodb://localhost:27017/test")    /连接MongDB2    =mongo_shell(A1,"emp.find({'$and':[{'Birthday':{'$gte':'"+string(begin)+"'}},{'Birthday':{'$lte':'"+string(end)+"'}}]},{_id:0})").fetch()    /查询某时间段的记录3    =A1.close()    /关闭MongoDB4    =myDB1.query("select   * from cities")    /获取mysql中表cities数据5    =A2.switch(CityID,A4:   CityID)    /外键关联6    =A5.new(EID,Dept,CityID.CityName:CityName,Name,Gender)    /创建结果集7    return   A6    /返回SQL支持SPL除了原生语法,还提供了相当于SQL92标准的SQL支持,可以使用SQL查询MongoDB了,比如前面的关联计算:A1    =mongo_open("mongodb://127.0.0.1:27017/test")2    =mongo_shell(A1,"c1.find()").fetch()3    =mongo_shell@x(A1,"c2.find()").fetch()4    $select s.* from {A2} as s left join {A3}   as r on s.user1=r.user1 and s.user2=r.user2 where r.income>0.3应用集成不仅如此,SPL提供了标准JDBC/ODBC等应用程序接口,集成调用很方便。如JDBC的使用:…Class.forName("com.esproc.jdbc.InternalDriver");Connection conn = DriverManager.getConnection("jdbc:esproc:local://");PrepareStatement st=con.prepareStatement("call splScript(?)"); // splScript为spl脚本文件名st.setObject(1,"California");st.execute();ResultSet rs = st.getResultSet();…有了这些功能,增强MongoDB的计算能力可不是说说而已,要不要下载试试?————————————————版权声明:本文为CSDN博主「石臻臻的杂货铺」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/u010634066/article/details/125854301
  • [问题求助] 在单个sql上开启smp是否会影响其他sql
    如图,在单个mapper的sql上添加set query_dop=-5;设置DN线程池是否为只在当前sql开启多线程数?会不会影响到其他sql?
  • [技术干货] 标准系列解读|服务商如何做好SQL审核与安全审计?
    本期接着上期的文章继续为大家解读《数据库服务能力成熟度模型》运维运营能力域的SQL审核与安全审计两个能力项,备份恢复与应急方案演练将在下一期文章中进行解读。《数据库服务能力成熟度模型》的整体框架如下图所示:《数据库服务能力成熟度模型》按照交付类型总体分为规划设计能力域、实施部署能力域和运维运营能力域,共包含27个能力项。每个能力项均从人员、工具、流程、制度、技术等维度,通过人员访谈、资料审查、工具演示等方式,对企业服务能力的评价从低到高依次划分为初始级、可重复级、稳健级、量化管理级和优化级五个等级。每个能力域的等级评定是由能力域所包含能力项的等级按照一定算法计算得出,每个能力项的等级评定是由该能力项五个等级的符合程度按照一定算法判定所得。简单来说,SQL审核能力是指为数据库服务方通过SQL审核平台或工具对未上线、已上线的SQL代码进行代码语法、算法的安全性和质量审核检查,提前发现SQL编写、表和索引设计等方面的隐患问题,推动开发部门提前进行规避性优化处理。SQL审核的主要过程描述如下:a) 数据库服务方与用户沟通SQL审核的管理流程,确定其中关键角色;b) 安装部署相关脚本或SQL审核工具;c) 确定需要审核的数据库和相关人员;d) 根据具体的审核需求,连接数据库采集SQL信息,或由用户提交审核信息,或者其他SQL来源;e) 查看SQL审核结果,发现SQL代码存在的隐患;f) 制定相关的优化建议并提交相关人员;g) 由相关人员对存在隐患的SQL代码进行整改;h) 对比整改前后的SQL运行情况,确认整改的执行性和优化的有效性。按照服务能力成熟度的差异划分,SQL审核能力要求如表1所示:表1 数据库服务能力成熟度-SQL审核能力等级标准评估要点:◆ SQL审核报告内容丰富度(SQL文本、违规情况、性能数据、优化建议等)、SQL审核流程、SQL审核模板等;◆ SQL审核服务体系,人员是否拥有SQL优化经验和对象设计经验,能否支撑从研发、测试、上线发布、运行维护全生命周期的SQL质量管控;◆ SQL审核工具/平台的功能丰富程度、易用性等。介绍完SQL审核后,接下来解读运维运营的第七个能力项:安全审计。安全审计是指数据库服务方根据需求方的安全审计要求,通过数据库自带的审计功能,或独立的安全审计工具、平台实现数据库安全审计功能,记录符合审计选项的操作记录。通过对用户访问数据库行为的记录、分析和汇报,帮助用户事后生成合规报告、事故追根溯源,同时加强内外部数据库行为记录,提高数据资产安全。根据公安行业标准《信息安全技术 数据库安全审计产品安全技术要求》定义,数据库安全审计产品是指对用户访问数据库的操作行为进行记录、分析并响应的产品。主要支持数据采集、设置采集策略、生成审计记录、安全告警、设置告警方式和内容、查询和统计审计记录、生成和导出报表、安全存储审计记录、会话分析、安全管理、审计日志等功能。安全审计的主要过程描述如下:a) 调研和需求分析:对需求方的安全审计需求进行调研和分析,了解需求方的管理规范、管理流程和审计需求;b) 制定方案:根据需求分析结果,制定安全审计方案。方案包括但不限于安全审计的配置操作手册、安全审计结果记录、安全审计结果呈现等;c) 安全审计实施:根据制定的安全审计方案,对安全审计进行在线或离线的启用、关闭等,并对相关的审计规则、告警规则等进行配置。如果有安全审计的辅助平台,要一并部署并保证能顺利执行;d) 安全审计验证:根据安全审计方案实施后,形成满足需求方的安全审计环境。与需求方一起选取代表性的业务场景,对安全审计功能进行验证,从而证明安全审计功能满足需求方的要求。按照服务能力成熟度的差异划分,安全审计的等级要求如表2所示:表2 数据库服务能力成熟度-安全审计能力等级标准评估要点:◆ 数据库安全审计工具功能完善性及易用性,审计对象和操作、告警方式和信息的丰富程度;◆ 人员的数据库安全审计经验、项目丰富度;◆ 安全审计方案、实施文档、管理规范等。《数据库服务能力成熟度模型》标准是由中国信息通信研究院依托通信标准化协会大数据技术标准推进委员会(CCSA TC601),联合云和恩墨、腾讯云、星环科技、新炬网络、中兴通讯、爱可生、华为云、华胜信泰、科蓝软件、浪潮云、金山云、迪思杰、万里开源、百度智能云等企业于2020年联合编制而成,标准共包括900多个评估点,成为国内数据库服务领域最权威的行业标准,目前已累计完成3批6家共11次评估工作,包括云和恩墨、星环科技、腾讯云、科蓝软件、中移苏研和京东科技,为行业遴选优质服务商提供有力依据。文章来源:大数据技术标准推进委员会 (如有侵权,请联系删除)
  • [技术干货] 吃透50个常用的SQL语句,面试趟过[转载]
    50个常用的sql语句Student(S#,Sname,Sage,Ssex) 学生表Course(C#,Cname,T#) 课程表SC(S#,C#,score) 成绩表Teacher(T#,Tname) 教师表问题:1、查询“001”课程比“002”课程成绩高的所有学生的学号; select a.S# from (select s#,score from SC where C#='001') a,(select s#,score from SC where C#='002') b where a.score>b.score and a.s#=b.s#;2、查询平均成绩大于60分的同学的学号和平均成绩;    select S#,avg(score)    from sc    group by S# having avg(score) >60;3、查询所有同学的学号、姓名、选课数、总成绩; select Student.S#,Student.Sname,count(SC.C#),sum(score) from Student left Outer join SC on Student.S#=SC.S# group by Student.S#,Sname4、查询姓“李”的老师的个数; select count(distinct(Tname)) from Teacher where Tname like '李%';5、查询没学过“叶平”老师课的同学的学号、姓名;    select Student.S#,Student.Sname    from Student     where S# not in (select distinct( SC.S#) from SC,Course,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平');6、查询学过“001”并且也学过编号“002”课程的同学的学号、姓名; select Student.S#,Student.Sname from Student,SC where Student.S#=SC.S# and SC.C#='001'and exists( Select * from SC as SC_2 where SC_2.S#=SC.S# and SC_2.C#='002');7、查询学过“叶平”老师所教的所有课的同学的学号、姓名; select S#,Sname from Student where S# in (select S# from SC ,Course ,Teacher where SC.C#=Course.C# and Teacher.T#=Course.T# and Teacher.Tname='叶平' group by S# having count(SC.C#)=(select count(C#) from Course,Teacher where Teacher.T#=Course.T# and Tname='叶平'));8、查询课程编号“002”的成绩比课程编号“001”课程低的所有同学的学号、姓名; Select S#,Sname from (select Student.S#,Student.Sname,score ,(select score from SC SC_2 where SC_2.S#=Student.S# and SC_2.C#='002') score2 from Student,SC where Student.S#=SC.S# and C#='001') S_2 where score2 <score;9、查询所有课程成绩小于60分的同学的学号、姓名; select S#,Sname from Student where S# not in (select Student.S# from Student,SC where S.S#=SC.S# and score>60);10、查询没有学全所有课的同学的学号、姓名;    select Student.S#,Student.Sname    from Student,SC    where Student.S#=SC.S# group by Student.S#,Student.Sname having count(C#) <(select count(C#) from Course);11、查询至少有一门课与学号为“1001”的同学所学相同的同学的学号和姓名;    select S#,Sname from Student,SC where Student.S#=SC.S# and C# in select C# from SC where S#='1001';12、查询至少学过学号为“001”同学所有一门课的其他同学学号和姓名;    select distinct SC.S#,Sname    from Student,SC    where Student.S#=SC.S# and C# in (select C# from SC where S#='001');13、把“SC”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩;    update SC set score=(select avg(SC_2.score)    from SC SC_2    where SC_2.C#=SC.C# ) from Course,Teacher where Course.C#=SC.C# and Course.T#=Teacher.T# and Teacher.Tname='叶平');14、查询和“1002”号的同学学习的课程完全相同的其他同学学号和姓名;    select S# from SC where C# in (select C# from SC where S#='1002')    group by S# having count(*)=(select count(*) from SC where S#='1002');15、删除学习“叶平”老师课的SC表记录;    Delect SC    from course ,Teacher     where Course.C#=SC.C# and Course.T#= Teacher.T# and Tname='叶平';16、向SC表中插入一些记录,这些记录要求符合以下条件:没有上过编号“003”课程的同学学号、2、    号课的平均成绩;    Insert SC select S#,'002',(Select avg(score)    from SC where C#='002') from Student where S# not in (Select S# from SC where C#='002');17、按平均成绩从高到低显示所有学生的“数据库”、“企业管理”、“英语”三门的课程成绩,按如下形式显示: 学生ID,,数据库,企业管理,英语,有效课程数,有效平均分    SELECT S# as 学生ID        ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='004') AS 数据库        ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='001') AS 企业管理        ,(SELECT score FROM SC WHERE SC.S#=t.S# AND C#='006') AS 英语        ,COUNT(*) AS 有效课程数, AVG(t.score) AS 平均成绩    FROM SC AS t    GROUP BY S#    ORDER BY avg(t.score) 18、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分    SELECT L.C# As 课程ID,L.score AS 最高分,R.score AS 最低分    FROM SC L ,SC AS R    WHERE L.C# = R.C# and        L.score = (SELECT MAX(IL.score)                      FROM SC AS IL,Student AS IM                      WHERE L.C# = IL.C# and IM.S#=IL.S#                      GROUP BY IL.C#)        AND        R.Score = (SELECT MIN(IR.score)                      FROM SC AS IR                      WHERE R.C# = IR.C#                  GROUP BY IR.C#                    );19、按各科平均成绩从低到高和及格率的百分数从高到低顺序    SELECT t.C# AS 课程号,max(course.Cname)AS 课程名,isnull(AVG(score),0) AS 平均成绩        ,100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) AS 及格百分数    FROM SC T,Course    where t.C#=course.C#    GROUP BY t.C#    ORDER BY 100 * SUM(CASE WHEN isnull(score,0)>=60 THEN 1 ELSE 0 END)/COUNT(*) DESC20、查询如下课程平均成绩和及格率的百分数(用"1行"显示): 企业管理(001),马克思(002),OO&UML (003),数据库(004)    SELECT SUM(CASE WHEN C# ='001' THEN score ELSE 0 END)/SUM(CASE C# WHEN '001' THEN 1 ELSE 0 END) AS 企业管理平均分        ,100 * SUM(CASE WHEN C# = '001' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '001' THEN 1 ELSE 0 END) AS 企业管理及格百分数        ,SUM(CASE WHEN C# = '002' THEN score ELSE 0 END)/SUM(CASE C# WHEN '002' THEN 1 ELSE 0 END) AS 马克思平均分        ,100 * SUM(CASE WHEN C# = '002' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '002' THEN 1 ELSE 0 END) AS 马克思及格百分数        ,SUM(CASE WHEN C# = '003' THEN score ELSE 0 END)/SUM(CASE C# WHEN '003' THEN 1 ELSE 0 END) AS UML平均分        ,100 * SUM(CASE WHEN C# = '003' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '003' THEN 1 ELSE 0 END) AS UML及格百分数        ,SUM(CASE WHEN C# = '004' THEN score ELSE 0 END)/SUM(CASE C# WHEN '004' THEN 1 ELSE 0 END) AS 数据库平均分        ,100 * SUM(CASE WHEN C# = '004' AND score >= 60 THEN 1 ELSE 0 END)/SUM(CASE WHEN C# = '004' THEN 1 ELSE 0 END) AS 数据库及格百分数 FROM SC21、查询不同老师所教不同课程平均分从高到低显示 SELECT max(Z.T#) AS 教师ID,MAX(Z.Tname) AS 教师姓名,C.C# AS 课程ID,MAX(C.Cname) AS 课程名称,AVG(Score) AS 平均成绩    FROM SC AS T,Course AS C ,Teacher AS Z    where T.C#=C.C# and C.T#=Z.T# GROUP BY C.C# ORDER BY AVG(Score) DESC22、查询如下课程成绩第 3 名到第 6 名的学生成绩单:企业管理(001),马克思(002),UML (003),数据库(004)    [学生ID],[学生姓名],企业管理,马克思,UML,数据库,平均成绩    SELECT DISTINCT top 3      SC.S# As 学生学号,        Student.Sname AS 学生姓名 ,      T1.score AS 企业管理,      T2.score AS 马克思,      T3.score AS UML,      T4.score AS 数据库,      ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) as 总分      FROM Student,SC LEFT JOIN SC AS T1                      ON SC.S# = T1.S# AND T1.C# = '001'            LEFT JOIN SC AS T2                      ON SC.S# = T2.S# AND T2.C# = '002'            LEFT JOIN SC AS T3                      ON SC.S# = T3.S# AND T3.C# = '003'            LEFT JOIN SC AS T4                      ON SC.S# = T4.S# AND T4.C# = '004'      WHERE student.S#=SC.S# and      ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)      NOT IN      (SELECT            DISTINCT            TOP 15 WITH TIES            ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0)      FROM sc            LEFT JOIN sc AS T1                      ON sc.S# = T1.S# AND T1.C# = 'k1'           LEFT JOIN sc AS T2                      ON sc.S# = T2.S# AND T2.C# = 'k2'            LEFT JOIN sc AS T3                      ON sc.S# = T3.S# AND T3.C# = 'k3'            LEFT JOIN sc AS T4                      ON sc.S# = T4.S# AND T4.C# = 'k4'      ORDER BY ISNULL(T1.score,0) + ISNULL(T2.score,0) + ISNULL(T3.score,0) + ISNULL(T4.score,0) DESC);23、统计列印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]    SELECT SC.C# as 课程ID, Cname as 课程名称        ,SUM(CASE WHEN score BETWEEN 85 AND 100 THEN 1 ELSE 0 END) AS [100 - 85]        ,SUM(CASE WHEN score BETWEEN 70 AND 85 THEN 1 ELSE 0 END) AS [85 - 70]        ,SUM(CASE WHEN score BETWEEN 60 AND 70 THEN 1 ELSE 0 END) AS [70 - 60]        ,SUM(CASE WHEN score < 60 THEN 1 ELSE 0 END) AS [60 -]    FROM SC,Course    where SC.C#=Course.C#    GROUP BY SC.C#,Cname;24、查询学生平均成绩及其名次      SELECT 1+(SELECT COUNT( distinct 平均成绩)              FROM (SELECT S#,AVG(score) AS 平均成绩                      FROM SC                  GROUP BY S#                  ) AS T1            WHERE 平均成绩 > T2.平均成绩) as 名次,      S# as 学生学号,平均成绩    FROM (SELECT S#,AVG(score) 平均成绩            FROM SC        GROUP BY S#        ) AS T2    ORDER BY 平均成绩 desc;25、查询各科成绩前三名的记录:(不考虑成绩并列情况)      SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数      FROM SC t1      WHERE score IN (SELECT TOP 3 score              FROM SC              WHERE t1.C#= C#            ORDER BY score DESC              )      ORDER BY t1.C#;26、查询每门课程被选修的学生数 select c#,count(S#) from sc group by C#;27、查询出只选修了一门课程的全部学生的学号和姓名 select SC.S#,Student.Sname,count(C#) AS 选课数 from SC ,Student where SC.S#=Student.S# group by SC.S# ,Student.Sname having count(C#)=1;28、查询男生、女生人数    Select count(Ssex) as 男生人数 from Student group by Ssex having Ssex='男';    Select count(Ssex) as 女生人数 from Student group by Ssex having Ssex='女';29、查询姓“张”的学生名单    SELECT Sname FROM Student WHERE Sname like '张%';30、查询同名同性学生名单,并统计同名人数 select Sname,count(*) from Student group by Sname having count(*)>1;;31、1981年出生的学生名单(注:Student表中Sage列的类型是datetime)    select Sname, CONVERT(char (11),DATEPART(year,Sage)) as age    from student    where CONVERT(char(11),DATEPART(year,Sage))='1981';32、查询每门课程的平均成绩,结果按平均成绩升序排列,平均成绩相同时,按课程号降序排列    Select C#,Avg(score) from SC group by C# order by Avg(score),C# DESC ;33、查询平均成绩大于85的所有学生的学号、姓名和平均成绩    select Sname,SC.S# ,avg(score)    from Student,SC    where Student.S#=SC.S# group by SC.S#,Sname having    avg(score)>85;34、查询课程名称为“数据库”,且分数低于60的学生姓名和分数    Select Sname,isnull(score,0)    from Student,SC,Course    where SC.S#=Student.S# and SC.C#=Course.C# and Course.Cname='数据库'and score <60;35、查询所有学生的选课情况;    SELECT SC.S#,SC.C#,Sname,Cname    FROM SC,Student,Course    where SC.S#=Student.S# and SC.C#=Course.C# ;36、查询任何一门课程成绩在70分以上的姓名、课程名称和分数;    SELECT distinct student.S#,student.Sname,SC.C#,SC.score    FROM student,Sc    WHERE SC.score>=70 AND SC.S#=student.S#;37、查询不及格的课程,并按课程号从大到小排列    select c# from sc where scor e <60 order by C# ;38、查询课程编号为003且课程成绩在80分以上的学生的学号和姓名;    select SC.S#,Student.Sname from SC,Student where SC.S#=Student.S# and Score>80 and C#='003';39、求选了课程的学生人数    select count(*) from sc;40、查询选修“叶平”老师所授课程的学生中,成绩最高的学生姓名及其成绩    select Student.Sname,score    from Student,SC,Course C,Teacher    where Student.S#=SC.S# and SC.C#=C.C# and C.T#=Teacher.T# and Teacher.Tname='叶平' and SC.score=(select max(score)from SC where C#=C.C# );41、查询各个课程及相应的选修人数    select count(*) from sc group by C#;42、查询不同课程成绩相同的学生的学号、课程号、学生成绩 select distinct A.S#,B.score from SC A ,SC B where A.Score=B.Score and A.C# <>B.C# ;43、查询每门功成绩最好的前两名    SELECT t1.S# as 学生ID,t1.C# as 课程ID,Score as 分数      FROM SC t1      WHERE score IN (SELECT TOP 2 score              FROM SC              WHERE t1.C#= C#            ORDER BY score DESC              )      ORDER BY t1.C#;44、统计每门课程的学生选修人数(超过10人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,查询结果按人数降序排列,若人数相同,按课程号升序排列     select C# as 课程号,count(*) as 人数    from sc     group by C#    order by count(*) desc,c# 45、检索至少选修两门课程的学生学号    select S#     from sc     group by s#    having count(*) > = 246、查询全部学生都选修的课程的课程号和课程名    select C#,Cname     from Course     where C# in (select c# from sc group by c#) 47、查询没学过“叶平”老师讲授的任一门课程的学生姓名    select Sname from Student where S# not in (select S# from Course,Teacher,SC where Course.T#=Teacher.T# and SC.C#=course.C# and Tname='叶平');48、查询两门以上不及格课程的同学的学号及其平均成绩    select S#,avg(isnull(score,0)) from SC where S# in (select S# from SC where score <60 group by S# having count(*)>2)group by S#;49、检索“004”课程分数小于60,按分数降序排列的同学学号    select S# from SC where C#='004'and score <60 order by score desc;50、删除“002”同学的“001”课程的成绩delete from Sc where S#='001'and C#='001';————————————————版权声明:本文为CSDN博主「软件质量保障」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/csd11311/article/details/125750653
  • [问题求助] 【appcube】【脚本开发】脚本是否支持动态sql标签功能?
    脚本开发多表关联查询时,使用拼接sql的方式实现,目前是在代码中手动拼接sql和查询参数 比较麻烦,平台是否支持动态sql标签(类似mybatis)?如果目前不支持,是否考虑后期补齐此能力?
  • [问题求助] 如何通过sql实现全表的分析
    高斯版本:6.5.1目前需求:想实现对全表的自动化分析,不是单纯的罗列analyze+表名,而是能有一个通用的策略,实现自动化的表分析。探索1:研究了autovacuum可以实现这个即使,但是autovacuum参数属于postmaster参数修改后需要重启才能生效,现在不想重启集群。探索2:有没一种sql的方式,通过把所有表名查询出来,然后作为[参数],放到循环中,循环中执行【analyze [参数];】,从而实现全表的analyze?