-
触发器ORACLE跟GaussDB(DWS)有一定区别,在项目实践的时候踩了些坑,在下面博客记录一下https://bbs.huaweicloud.com/blogs/196527
-
oracle的connect_by_root,connect_by_isleaf 在gaussdb(DWS) 没有直接的函数,以下博客展示如何实现这两个函数。https://bbs.huaweicloud.com/blogs/196094
-
【摘要】 GaussDB(DWS) TD和Oracle两种兼容模式的差异,以及对每种差异做了举例说明。GaussDB(DWS)支持两种兼容模式,即TD(Teradata)兼容模式、ORA(Oracle)兼容模式。可以在CREATE DATABASE时通过指定选项DBCOMPATIBILITY进行选择。语法如下:--创建兼容TD的数据库 postgres=# CREATE DATABASE td_compatible_db DBCOMPATIBILITY 'TD';CREATE DATABASE--创建兼容ORA的数据库 postgres=# CREATE DATABASE ora_compatible_db DBCOMPATIBILITY 'ORA';CREATE DATABASEpostgres=# SELECT datname,datcompatibility FROM PG_DATABASE WHERE datname LIKE '%compatible_db'; datname | datcompatibility -------------------+------------------ td_compatible_db | TD ora_compatible_db | ORA(2 rows)两种兼容模式的注意差异对比如下表格所示:下面对每一个兼容性进行举例说明:-- 切到TD兼容的库下,创建表并插入数据 postgres=# \c td_compatible_db td_compatible_db=# CREATE TABLE td_table(a INT,b VARCHAR(5),c date);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 TABLEtd_compatible_db=# INSERT INTO td_table VALUES(1,null,CURRENT_DATE); INSERT 0 1td_compatible_db=# INSERT INTO td_table VALUES(2,'',CURRENT_DATE); INSERT 0 1-- 区分空串和NULL,date类型只显示年月日td_compatible_db=# SELECT a, b, b IS NULL AS null, c FROM td_table; a | b | null | c ---+---+------+------------ 1 | | t | 2020-06-19 2 | | f | 2020-06-19(2 rows)td_compatible_db=# SELECT CURRENT_DATE; date ------------ 2020-06-19(1 row)-- 空串转int,转为0。TD数据库不同于Oracle,Oracle将空串当做NULL进行处理,TD在将空串转换为数值类型的时候,默认将空串转换为0进行处理,因此查询空串会查询到数值为0的数据。同样地,在TD兼容模式下,字符串转换数值的过程中,也会将空串默认转换为相应数值类型的0值进行处理。除此之外,' - '、' + '、' '这些字符串也都会在TD兼容模式下默认转换为0进行处理,但是小数点字符串' . '会报错td_compatible_db=# SELECT b::int FROM td_table WHERE b = ''; b --- 0(1 row)--超长字符自动截断。当连接到TD兼容的数据库时,td_compatible_truncation参数设置为on时,将启用超长字符串自动截断功能,在后续的insert语句中(不包含外表的场景下),对目标表中char和varchar类型的列上插入超长字符串时,系统会自动按照目标表中相应列定义的最大长度对超长字符串进行截断。td_compatible_db=# SHOW td_compatible_truncation; td_compatible_truncation -------------------------- on(1 row)td_compatible_db=# INSERT INTO td_table VALUES(3,'12345678',CURRENT_DATE);INSERT 0 1td_compatible_db=# SELECT * FROM td_table WHERE a = 3; a | b | c ---+-------+------------ 3 | 12345 | 2020-06-19(1 row)--varchar + int运算,转为numeric + numeric计算td_compatible_db=# EXPLAIN VERBOSE SELECT b + a FROM td_table WHERE a = 3; QUERY PLAN ----------------------------------------------------------------------------------------------- Data Node Scan (cost=0.00..0.00 rows=0 width=0) Output: (((td_table.b)::numeric + (td_table.a)::numeric)) Node/s: datanode7 Remote query: SELECT b::numeric + a::numeric AS "?column?" FROM public.td_table WHERE a = 3(4 rows)-- case和coalesce表达式。对于case 和coalesce,在TD 兼容模式下的处理● 如果所有输入都是相同的类型,并且不是unknown类型,那么解析成这种类型。● 如果所有输入都是unknown类型则解析成text类型。● 如果输入字符串(包括unknown,unknown当text来处理)和数字类型,那么解析成字符串类型,如果是其他不同的类型范畴,则报错。● 如果输入类型是同一个类型范畴,则选择该类型的优先级较高的类型。● 把所有输入转换为所选的类型。如果从给定的输入到所选的类型没有隐式转换则失败。示例1:Union中的待定类型解析。这里,unknown类型文本'b'将被解析成text类型。td_compatible_db=# SELECT text 'a' AS "text" UNION SELECT 'b';text------ab(2 rows)示例2:简单Union中的类型解析。文本1.2的类型为numeric,而且integer类型的1可以隐含地转换为numeric,因此使用这个类型。td_compatible_db=# SELECT 1.2 AS "numeric" UNION SELECT 1;numeric---------11.2(2 rows)示例3:转置Union中的类型解析。这里,因为类型real不能被隐含转换成integer,但是integer可以隐含转换成real,那么联合的结果类型将是real。td_compatible_db=# SELECT 1 AS "real" UNION SELECT CAST('2.2' AS REAL);real------12.2(2 rows)示例4:TD模式下,coalesce参数输入int和varchar类型,那么解析成varchar类型。ORA模式下会报错。查看coalesce参数输入int和varchar类型的查询语句的执行计划如下td_compatible_db=# EXPLAIN VERBOSE select coalesce(a, b) FROM td_table; QUERY PLAN --------------------------------------------------------------------------------------------- Data Node Scan (cost=0.00..0.00 rows=0 width=0) Output: (COALESCE((td_table.a)::character varying, td_table.b)) Node/s: All datanodes Remote query: SELECT COALESCE(a::character varying, b) AS "coalesce" FROM public.td_table(4 rows)原文链接:https://bbs.huaweicloud.com/blogs/176361【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
建表:create table tb_recursive(id int,parent_id int);1.select list中Oracle中实现方式:select id,parent_id,rownum from tb_recursive order by 3;DWS中实现方式:select id,parent_id,row_number() over() from tb_recursive order by 3;2.where条件中Oracle中实现方式:select id,parent_id from tb_recursive where rownum =1 order by id;DWS中实现方式:select id,parent_id from tb_recursive order by id limit 1;3.sql语句中有order byOracle中实现方式:select id from (select id,parent_id from tb_recursive order by id desc) where rownum =1;DWS中实现方式:select id from tb_recursive order by id desc limit 1;4.sql语句中有countOracle中实现方式:select count(1) from (select id,parent_id from tb_recursive where id = 1) where rownum =1;DWS中实现方式:select count(1) from (select id,parent_id from tb_recursive where id = 1 limit 1);
-
建表:create table tb_recursive(id int,parent_id int);Oracle中实现方式:select id,parent_id,connect_by_root(parent_id) as rid,level lvl from tb_recursive connect by prior id=parent_id start with parent_id =2 order by id;DWS中实现方式:with recursive r1 as (select id,parent_id,parent_id rid,1 as lvlfrom tb_recursivewhere parent_id =2union allselect t.id,t.parent_id,t1.rid,t1.lvl+1 as lvlfrom tb_recursive t,r1 t1where t.parent_id=t1.id)select id,parent_id,rid,lvl from r1 order by id;
-
建表:create table tb_recursive(id int,parent_id int);Oracle中实现方式:select id,parent_id,level lvl from tb_recursive connect by prior id=parent_id start with parent_id is null order siblings by id;DWS中实现方式:with recursive r1 as (select id,parent_id,1 as lvl,lpad(id,4,0)||lpad(ctid||xc_node_id::text,20,0) sortnofrom tb_recursivewhere parent_id is nullunion allselect t.id,t.parent_id,t1.lvl+1 as lvl,t1.sortno||lpad(t.id,4,0)||lpad(ctid||xc_node_id::text,20,0) sortnofrom tb_recursive t,r1 t1where t.parent_id=t1.id)select id,parent_id,lvl from r1 order by sortno;
-
建表:create table tb_recursive(id int,parent_id int);Oracle写法:select id,parent_id,sys_connect_by_path(id,' > ') path,level lvl from tb_recursive connect by prior id= parent_id start with parent_id is null order by id;DWS改写如下:with recursive r1 as (select id,parent_id,' > '||id path,1 as lvlfrom tb_recursivewhere parent_id is nullunion allselect t.id,t.parent_id,t1.path||' > '||t.id path,t1.lvl+1 as lvlfrom tb_recursive t,r1 t1where t.parent_id=t1.id )select id,parent_id,path,lvl from r1 order by id;
-
建表语句如下:create table tb_recursive(id int,parent_id int);Oracle递归语句写法:select id,parent_id,level lvl from tb_recursive connect by prior id=parent_id start with parent_id is nullorder by id;DWS改写:with recursive r1 as (select id,parent_id,1 as lvlfrom tb_recursivewhere parent_id is nullunion allselect t.id,t.parent_id,t1.lvl+1 as lvlfrom tb_recursive t,r1 t1where t.parent_id=t1.id)select id,parent_id,lvl from r1 order by id;
-
项目中存在大量调用存储过程返回游标的场景,想在不改动java代码的前提,如何让GaussDB 200 存储过程适配java当前java调用GaussDB 200 存储过程报错,获取不到游标的值。报错: You may wish to exclude one of them to ensure predictable runtime behavior 2020-12-14 16:50:22,071 [main] DEBUG [com.huawei.it.finioc.dao.IFiniocGaussDao.finiocGaussFunNewTest] ==> Preparing: {call DWRSALES.proc_test_lyt( ?, ?, ?, ?) }2020-12-14 16:50:22,081 [main] DEBUG [com.huawei.it.finioc.dao.IFiniocGaussDao.finiocGaussFunNewTest] ==> Parameters: 1(String), 1(String), YYY(String) org.springframework.jdbc.BadSqlGrammarException:### Error querying database. Cause: com.huawei.gauss200.jdbc.util.PSQLException: A CallableStatement function was executed and the out parameter 1 was of type java.sql.Types=1111 however type java.sql.Types=-10 was registered.### The error may exist in file [D:\Idea\Jalor6\cnbgioc_develop\om.impl\target\classes\com\huawei\it\finioc\dao\IFiniocGaussDao.xml]### The error may involve com.huawei.it.finioc.dao.IFiniocGaussDao.finiocGaussFunNewTest-Inline### The error occurred while setting parameters### SQL: {call DWRSALES.proc_test_lyt( ?, ?, ?, ?) }### Cause: com.huawei.gauss200.jdbc.util.PSQLException: A CallableStatement function was executed and the out parameter 1 was of type java.sql.Types=1111 however type java.sql.Types=-10 was registered.; bad SQL grammar []; nested exception is com.huawei.gauss200.jdbc.util.PSQLException: A CallableStatement function was executed and the out parameter 1 was of type java.sql.Types=1111 however type java.sql.Types=-10 was registered. at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:101) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:74) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:440) at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:159) at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:87) at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:57) at com.huawei.it.finioc.dao.FiniocGaussDaoTest.finiocGaussFunNewTest(FiniocGaussDaoTest.java:50) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.lang.reflect.Method.invoke(Method.java:498) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.test.context.junit4.statements.RunBeforeTestExecutionCallbacks.evaluate(RunBeforeTestExecutionCallbacks.java:74) at org.springframework.test.context.junit4.statements.RunAfterTestExecutionCallbacks.evaluate(RunAfterTestExecutionCallbacks.java:84) at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75) at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86) at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:251) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:220) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:53)Caused by: com.huawei.gauss200.jdbc.util.PSQLException: A CallableStatement function was executed and the out parameter 1 was of type java.sql.Types=1111 however type java.sql.Types=-10 was registered. at com.huawei.gauss200.jdbc.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:473) at com.huawei.gauss200.jdbc.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:415) at org.apache.commons.dbcp2.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:94) at org.apache.commons.dbcp2.DelegatingPreparedStatement.execute(DelegatingPreparedStatement.java:94) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:59) at org.apache.ibatis.executor.statement.CallableStatementHandler.query(CallableStatementHandler.java:68) at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:79) at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:63) at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:324) at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109) at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:83) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140) at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:76) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.lang.reflect.Method.invoke(Method.java:498) at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:426) ... 22 more
-
数据库与实例首先,数据库是什么?数据库是数据管理的有效技术,是由一批数据构成的有序集合,这些数据被存放在结构化的数据表里。数据表之间相互关联,反映客观事物间的本质联系。数据库能有效地帮助一个组织或企业科学地管理各类信息资源。数据库的作用是长久存储数据,而内存只能临时存储,磁盘等才能真正存储数据。其实数据库就是磁盘上的一系列物理文件。例如MySQL数据库,就是由一些列物理文件组成,如:frm、MYD、MYI、ibd等结尾的文件。然后我们得纠正一个概念,我们平常说的数据库,如Oracle或Oracle数据库,指的其实是Oracle数据库管理系统,而Oracle数据库管理系统,指的是管理数据库访问的计算机软件,它由Oracle数据库和Oracle实例(instance)构成。 那么我们如何使用数据库呢,即如何操作磁盘里的一系列文件?我们知道这样的一个常识:必须把磁盘上的文件读入内存才能使用。那正确的流程就是把磁盘上文件先读入内存,然后使用。实际上,正常的数据库读入内存的过程是,由实例中一组后台进程从磁盘上将数据文件读入到实例的内存中,然后经过在内存中对数据的操作再从实例的内存中经过一组后台进程写到数据库中。 接着上面说什么是实例?实例是位于物理内存里的数据结构,由线程和内存池组成,实例才是真正用于操作数据库文件的(即前面说的一系列文件);如Oracle实例: 位于物理内存里的数据结构,它由操作系统的多个后台进程和一个共享的内存池所组成,共享的内存池可以被所有进程访问。用户如果要存取数据库里的数据, 必须通过Oracle实例才能实现,而不能直接读取硬盘上的文件。备注:其实Oracle实例也即是平常所说的数据库服务(service) 实例相对与数据库而言,可以理解为是数据库的运行环境(不准确但也还算贴切)。 实例与数据库Oracle数据库与实例之间是 1对1或1/n 的关系,即实例只能对于一个数据库,而一个数据库能有对个实例:在非并行的数据库系统中每个Oracle数据库与一个实例相对应;在并行的数据库系统中,一个数据库会对应多个实例,同一时间用户只与一个实例相联系,当某一个实例出现故障时,其他实例自动服务,保证数据库正常运行。mysql一般情况下一个实例操作一个或多个数据库;集群情况下多个实例操作一个或多个数据库。------------------------------------------------------------------------------------------一个数据库中包含存储真正数据的多个表结构,而一个实例包含多个数据库,一台服务器(硬件)可以包含多个实例。
-
嵌套循环 嵌套循环的算法 驱动表返回一行数据,通过连接列传值给被驱动表,驱动表返回多少行,被驱动表就要被扫描多少次。 在执行计划中,离NESTED LOOPS关键字最近的表就是驱动表。 嵌套循环使用场景 驱动表应该返回少量数据,关联条件的索引命中的数据必须很少。 嵌套循环被驱动表必须走索引。如果嵌套循环被驱动表的连接列没包含在索引中,那么被驱动表就只能走全表扫描,而且是反复多次全表扫描。当被驱动表很大 的时候,SQL 就执行不出结果。 嵌套循环被驱动表走索引只能走INDEXUNIQUE SCAN或者INDEX RANGE SCAN。HASH连接 HASH连接的算法 两表等值关联,返回大量数据,将较小的表选为驱动表,将驱动表的“select列和join列”读入PGA中的work area,然后对驱动表的连接列进行hash运 算生成hash table,当驱动表的所有数据完全读入PGA中的work area之后,再读取被驱动表(被驱动表不需要读入PGA中的workarea),对被驱动表的 连接列也进行hash运算,然后到PGA中的work area去探测hash table,找到数据就关联上,没找到数据就没关联上。 HASH连接的适用场景 哈希连接只支持等值连接。 哈希连接的适用场景就是嵌套循环的不适用场景,即两表连接条件关联的结果集比较大。 Used-Mem表示HASH连接消耗了多少PGA,当驱动表太大、PGA不能完全容纳驱动表时,驱动表就会溢出到临时表空间,进而产生磁盘 HASH连接, 这时候HASH连接性能会严重下降。嵌套循环不需要消耗PGA。 外连接的HASH 对于左外连接,Oracle会选择小表为hash表(执行计划上面的表)。 Oracle如果想改变hash表,需要使用swap_join_inputs提示(leading不起作用)。排序合并连接(SORT MERGE JOIN) 适用场景 排序合并连接主要用于处理两表非等值关联,比如>,>=,<,<=,<>,但是不能用于instr、substr、like、regexp_like关联,instr、substr、like、 regexp_like关联只能走嵌套循环。 如果两表是等值关联,一般不建议走排序合并连接。因为排序合并连接需要将两个表放入PGA中,而HASH连接只需要将驱动表放入PGA中,排序合并 连接与HASH连接相比,需要耗费更多的PGA。 算法介绍 排序合并连接的算法:两表关联,先对两个表根据连接列进行排序,将较小的表作为驱动表,然后从驱动表中取出连接列的值,到已经排好序的被驱动 表中匹配数据,如果匹配上数据,就关联成功。驱动表返回多少行,被驱动表就要被匹配多少次,这个匹配的过程类似嵌套循环,但是嵌套循环是从被 驱动表的索引中匹配数据,而排序合并连接是在内存中(PGA中的workarea)匹配数据。 1.Both relations are sorted on the join attributes. 2.Then, both relations are scanned in the order of the join attributes. Tuples that satisfy the join condition are merged to form the result relation。笛卡儿连接 两个表关联没有连接条件的时候会产生笛卡儿积,这种表连接方式就叫笛卡儿连接。 执行计划中MERGE JOIN CARTESIAN就表示笛卡儿连接。 在多表关联的时候,两个表没有直接关联条件,但是优化器错误地把某个表返回的Rows算为1行(注意必须是1行),这个时候也可能发生笛卡儿连接。标量子查询什么是标量子查询? 当一个子查询介于select与from之间,这种子查询就叫标量子查询 。标量子查询类似一个天然的嵌套循环,而且驱动表固定为主表。标量子查询中子查询的表 连接列也必须包含在索引中。 标量子查询优化建议 尽量避免使用标量子查询,假如主表返回大量数据,主表的连接列基数很高,那么子查询中的表会被多次扫描,从而严重影响SQL性能。 当SQL里面有标量子查询,我们可以将标量子查询等价改写为外连接,从而使它们可以进行HASH连接。半连接(SEMI JOIN) 什么是半连接? 两表关联只返回一个表的数据就叫半连接。半连接一般就是指的in和exists。 in和exists一般情况下都可以进行等价改写。 SQL> select * from dept where deptno in (select deptno from emp); SQL> select * from dept where exists (select 1 from emp where dept.deptno=emp.deptno); 半连接和内连接的等价写法(性能不如半连接) SQL> select d.* from dept d, (select deptno from emp group by deptno) e where d.deptno = e.deptno; 半连接以子查询为驱动,对主表嵌套循环 适用于子查询的数据集非常小并且主表有索引的场景。Oracle hint小技巧 1。对于in子查询可以用/*+ qb_name(a) */定义子查询,然后在提示中用a引用对应的表 2。Oracle会为每个查询块定义一个名字,提示中也可以用这个名字,block名字通过下面这种方式获得 SQL> explain plan for select * from dept where deptno in (select deptno from emp); SQL> select * from table(dbms_xplan.display(null, null,'advanced -projection -outline -predicate'));
-
Oracle和Mysql都是数据库但是有些地方还是不一样,我在这里记录一下。 本质区别:Oracle数据库是一个对象关系数据库管理系统(收费)MySQL是一个开源的关系数据库管理系统(免费) 数据库的安全性:mysql使用三个参数来验证用户,即用户名,密码和位置Oracle使用了更多的安全功能,如用户名,密码,配置文件,本地身份验证,外部身份验证,高级安全增强功能等 权限 MySQL的权限系统是通过继承形成的分层结构。权限授于高层时,其他低层隐式继承被授于的权限,当然低层也可改写这些权限。 按授权范围不同,MySQL有以下种授权方式: 1、全局; 2、基于每个主机; 3、基于表; 4、基于表列。 每一级在数据库中都有一个授权表。当进行权限检查时,MySQL从高到低检查每一张表,低范围授权优先于高范围授权。 与Oracle不同,MySQL没有角色的概念。也就是说,如果对一组用户授于同样的权限,需要对每一个用户分别授权。 模式迁移 模式包含表、视图、索引、用户、约束、存储过程、触发器和其他数据库相关的概念。多数关系型数据库都有相似的概念。 本节包含以下内容: 1、模式对象的相似性; 2、模式对象的名称; 3、表设计时的关注点; 4、多数据库整合; 5、MySQL模式整合的关注点。 模式对象的相似性 就模式对象,Oracle和MySQL存储诸多的相似,但也有一些不同。 模式对象OracleMysqlAFTER triggertriggerBEFORE triggertriggerCheck constraintCheck constraintColumn defaultColumn defaultDatabaseDatabaseForeign keyForeign keyIndexIndexPackageN/APL/SQL functionRoutinePrimary keyPrimary keyRoleN/ASchemaSchemaSequenceAUTO_INCREMENT for a columnSnapshotN/ASynonymN/ATableTableTemporary tableTemporary tableTrigger for each rowTrigger for each rowUnique keyUnique key 模式对象的名称 Oracle是大小写不敏感的,并且模式对象是以在写时行存储。在Oracle的世界中,列、索引、存储过程、触发器以及列别名都是大小写不敏感,并且在所有 的平台都是如此。MySQL是大小写敏感的,如数据库相对的存储路径、表对应的文件都是如此 当把关键字用引号引起来时,Oracle和MySQL都允许把这些关键字用于模式对象。但MySQL对于一些关键字,不加引号也行。 表设计的关注点 本节主要讨论当把MySQL转为Oracle时需要注意的地方。主要包含以下两点: 1、字符数据的类型; 2、列默认值。 3.2.3.1 字符数据类型 MySQL和Oracle在字符型数据保存和读取上存在一些不同。MySQL的字符类型,如CHAR和VARCHAR的长度小于65535字节。 Oracle支持4种字体类型:CHAR、NCHAR、NVARCHAR2和VARCHAR2。CHAR和NCHAR的最大长度为2000字节, NVARCHAR2和VARCHAR2最大长度为4000字节。 MySQL和Oracle在字符型数据保存和读取上存在一些不同。MySQL的字符类型,如CHAR和VARCHAR的长度小于65535字节。Oracle支持4种字体类型:C HAR、NCHAR、NVARCHAR2和VARCHAR2。CHAR和NCHAR的最大长度为2000字节,NVARCHAR2和VARCHAR2最大长度为4000字节。 3.2.3.2 列默认值 MySQL会处理列默认值,不允许他为空,这点和Oracle不同。在Oracle中如果向表插入数据,需要对有所有不允许为NULL列的值。 多数据库迁移 如果多个MySQL数据库位于同一个数据库服务上,支持迁移。 数据存储概念 MySQL的数据库对应于服务器上数据目录内的了目录,这一数据存储方式与多数据数据库不同,也包括Oracle。数据库中的表对应一个或者多个数据库目录下的文件,并取表存储时的存储引擎。 一个Oracle数据库包含一个或者多个表空间。表空间对应数据在磁盘上的物理存储。表空间是从一个或者多个数据文件开始构建的。数据文件是文件系统中的文件或者原始存储的一块空间。 一些语法上的区别: 主键:mysql一般使用自动增长类型,在创建表的时候指定表的主键为auto increment,主键就会自动增长。Oracle中没有自动增长,主键一般使用序列,插值时依次赋值即可。 引号问题: Oracle不使用双引号,会报错mysql则对引号没有限制 分页查询:mysql分页查询使用关键字limit来实现Oracle没有实现分页查询的关键字,实现起来较复杂,在每个结果集中只有一个rownum字段标明它的位置,并且只能用rownum<=某个数,不能用rownum>=某个数,因为ROWNUM是伪列,在使用时所以需要为ROWNUM取一个别名,变成逻辑列,然后来操作 数据类型:mysql中的整型:int(),字符串类型:varchar()Oracle中的整形:number(),字符串类型:varchar2()
-
1、简介目前主流的第三方IO测试工具有fio、iometer和Orion,这三种工具各有千秋。fio在Linux系统下使用比较方便,iometer在window系统下使用比较方便,Orion是oracle的IO测试软件,可在没有安装oracle数据库的情况下模拟oracle数据库场景的读写。官网: https://fio.updatestar.com/2、基础环境类别子项版本获取地址(方法)华为云虚拟机KC1(920)--OSCentOS7.7Kernel4.14软件包fio2.1.10https://github.com/axboe/fio/archive/fio-2.1.10.tar.gz3、依赖安装 无4、组件编译安装 源码编译安装下载Fio源码cd /optwget https://github.com/axboe/fio/archive/fio-2.1.10.tar.gztar xf fio-2.1.10.tar.gzcd fio-fio-2.1.10/ make && make install预期如下fio -version 5、系统配置 无6、测试无7、参考信息https://www.huaweicloud.com/kunpeng/software/fio.html8、FAQ 无
-
在最近热映的电影《天气之子》中,想必大家都对这样的情节历历在目:天空突降暴雨,千万雨柱唰唰而下,倾盆的雨水淹没了整条街道,车、人、房子、树木尽数泡于水中……图片来自电影《天气之子》作为一部以“天气”为主题的电影,影片取材都源于现实世界,比如:片中的倾盆大雨、积雨云等特殊气象均有现实依据。每当暴雨不请自来,城市频频出现“看海”现象,在影片里可能是源于“神秘不可知的力量”,但在现实生活中可能是纵横交错的雨洪管理系统等问题在作怪。要想城市“面子”好看,城市“里子”必须搞好。作为一家致力于智慧水务、智慧城建与智慧规划三大行业的信息技术企业,奥格智能专为城市灾洪排忧解难,管理着数以千计的城市“里子”。随着数字化的升级发展以及业务的不断扩展,奥格智能需要一个高可靠、高安全、高可用、高性能的数据库来支撑日益增长的业务需求。经过一番考察、评估,奥格智能最终选择牵手华为云,将原先Oracle数据库上的数据全部搬迁到华为云上,并共同构建了一套“智慧雨洪管理”解决方案。那么,华为云具体是怎么做的呢?两大专业服务联手数据搬家变得so easy奥格智能涉及的业务量巨大,服务对象众多,需要数据库提供稳定高效安全的云服务,而且可以根据业务需求实现快速弹性扩展。>>性能好,遇问题见招拆招一套PostgreSQL增强版(简称PG增强版)高度兼容Oracle数据库,同时搭配华为云数据复制服务DRS,将Oracle数据库的数据原封不动地迁移至PG增强版,不给数据开溜机会。>>>>安全高,为数据全方位防护数据不丢问题解决了,安全防护一样不能少。华为云在PG增强版上部署实际应用,并进行大量系统测试,测试中不断发现问题,解决问题,最后正式部署业务,迁移上线。>>>>降成本,让钱花在刀刃上伴随着赋能产品项目快速落地的同时,华为云帮助客户大幅度降低了运维成本,减少了60%的投入。不仅性能好,安全高,关键还省钱!技术加持让“智慧雨洪管理”更加聪明暴雨无情,人间有情。兵来将挡,水来土掩。即便灾洪来势汹汹,奥格智能自有妙招相对。此次奥格智能携手华为云,将自身优势置于万物互联的云平台上,共同推出“智慧雨洪管理”解决方案。“智慧雨洪管理”解决方案该解决方案基于物联网综合技术构建了一套通往智能管理和高效运营的数字化管理工具,实现了“事前预知、事中应急、事后优化”的三段式管理,积极引领“智慧雨洪管理”的创新。事前预知凡事预则立,不预则废。在内涝发生前,将每一个异常清晰可见,不打无准备之仗!奥格智能与华为OceanConnect IoT平台打通,借助低功耗网络及时回传信息,构建了实时监测数据库,对雨洪监测和内涝预测、预警进行实时监控。事中应急面对紧急灾情,速度要先行,还要同时调动多方资源,这就需要数据库扛得住高并发带来的压力。华为云海量分布式可扩展的块存储服务,秒级扩展,轻松应对访问压力,成功助力奥格地理信息平台练就“快准狠”绝招,使其在极短的时间内达成了几乎所有全范围信息互通、全资源高度集中调动。事后优化对每一次灾洪都做到心中有数,不做事后诸葛。• 华为云服务为奥格智能提供了全面完整的中间平台方案,让奥格智能聚焦业务场景,为持续更新水利行业大数据库和反馈迭代优化应急方案提供宝贵建议。• 同时助力奥格智能建成清晰、完整、准确的排水设施“一张图”,实现水流方向全过程可视化查询、分析,管理好城市各种“里子”,实现“每分钱都花在刀刃上”。“智慧雨洪管理”解决方案架构图在整个“智慧雨洪管理”解决方案中,华为云凭借多年的技术积淀和专业优秀的云服务,助力奥格智能专注于顶端业务应用层及感知层的专业设计。城市雨洪关及你我他,有了华为云的技术加持,雨洪管理变得智慧与智能起来,风雨再大也不怕。
推荐直播
-
华为云码道 × 仓颉编程:工程化AI编码探索2026/05/27 周三 19:00-21:00
刘俊杰-华为云仓颉语言专家/李炎-华为云码道技术专家/王智鹏-OpenCangjie开源社区发起人
本场直播围绕华为云仓颉语言与华为云码道的深度结合,展示华为云智能编程从零基础到高效落地的完整生态能力。以华为云码道为引擎,仓颉语言为载体,带给大家日常提效、趣味创新到极速量产的开发体验。
回顾中
热门标签