inceptor的jdbc并发数量极限不超过50个,一般20个。延迟的话,小数据量较传统数据库无优势,但是超过500G以后就比传统数据库优秀
另,高并发低延迟查询应使用hbase
分桶应该质数,1-200w条数据一个桶。对表而言,分区表比只分桶表查询快很多
unknown expression of type java.lang.String in DOT expression left side 调用时存储过程名称写错了。
存过内时间格式出错,如调用存过时时间格式YYYY-MM-DD,但是数据中是yyyymmdd导致的,这时要date再to_char更换格式。
declare声明的变量和表内的字段冲突,会优先使用变量,不要声明与会用到的字段同名的变量。
输出查看存过中的定义的变量(接在begin的变量赋值后)
DBMS_OUTPUT.PUT_LINE(V1);
关于视图
如果创建一个视图,create a view as select 后面特别长,那么每次使用该视图都会花很长时间。因为视图是实时的,每次使用会调用这段特长的select
关于码表(又称配置表)
加载要快的表可以建成holdesk表。storeds as holdesk即可
关联字段写在on和where区别
on的优先级较高
on是在生成临时表的时候使用的条件,不管on的条件是否起到作用,都会返回左表 (table_name1) 的行。
where则是在生成临时表之后使用的条件,此时已经不管是否使用了left join了,只要条件不为真的行,全部过滤掉。
所有的连接条件都必需要放在ON后面,不然前面的所有LEFT,和RIGHT关联将作为摆设,而不起任何作用。
关于其update
文档上字段关联的update使用方法如下
UPDATE tag SET (age, gpa) = (SELECT 23, gpa FROM tg WHERE (tg.name = tag.name));
但是实际使用上无论如何调试都实现不了,现改用了merge
MERGE INTO tag d USING
(SELECT a.name name, a.age age, g.gpa gpa FROM ta a JOIN tg g ON a.name = g.name) s
ON (s.name = d.name)
WHEN MATCHED THEN UPDATE SET age = s.age+1, gpa = 0.1+s.gpa WHERE d.age> s.age+1
WHEN NOT MATCHED THEN INSERT (name, age, gpa) VALUES (s.name, s.age, s.gpa);
不加when not matched即为update
时间增减
date(字段)+to_year_interval(-1) 去年同日
sunstr((date(字段)+to_year_interval(-1)),1,4)||'1231' 去年末
对月日的增减to_year_interval换成month和day即可
trunc(date, format) String 返回日期的指定格式
支持string类型的date字段按format返回特定的日期。
format='yyyy'/'yy',返回该年第一天的日 期;
format='mm',返回该月第一天;
format='dd',得到日期;
format='d',得到该周第一天的日期;(周日)
format='hh',得到精确到小时的时间;
format='mi',得到精确到分钟的时间。
举例
select trunc('2015-01-30 11:11:11','hh') from system.dual limit 1; Result: 2015-01-30 11:00:00
select结果相加减:
select sum(fa) from
(
select sum(num1) as fa from table1
union
select sum(num2) as fa from table2
union
select sum(num3) as fa from table3
union
select 0-sum(num4) as fa from table4
union
select 0-sum(num5) as fa from table5
) as tmp
动态sql(将sql存为变量)
DECLARE sql_stat STRING;
set sql_stat:='select price from transactions where acc_num=6513065';
EXECUTE IMMEDIATE sql_stat;
END; /
传参形式
DECLARE sql_stat STRING;
set sql_stat:='select price from transactions where acc_num=?';
EXECUTE IMMEDIATE sql_stat using 623101;
END; /
数据倾斜
orc事务表分桶的字段选个较为均衡的字段,比如数据日期。本项目分桶一般53桶
分桶字段不当会数据倾斜
rank排名函数
SELECT name, acc_level, rank() OVER(ORDER BY acc_level) FROM user_info;
马** A 1
魏** A 1
邱* A 1
华* B 4
脏数据:
如chn_id=‘AE’如何都没有,但是数据库中可见。这是由于数据其实是‘AE ’,需要trim(chn_id)
含逗号,换行符的
出现的问题
Display all 475 possibilities? (y or n)
notepad++ =>视图=>显示符号=>显示空格和制表符
time类型不可用
!set plsqClientDialect db2;
set plsql.server.dialect=db2;
!set plsqlUseSlash true;
set plsql.use.slash=true;
声明为db2,这样才可以用time类型
列出存过详细(extended关键字会列出该PL/SQL函数/过程的原文)
desc plsql function extended function_name
建ORC事务表
事务表与非事务区别在TBLPROPERTIES ("transactional"="true")开启事务并且分桶(事务表要分桶)
非事务表不可增删改
//非分区表
CREATE TABLE <table_name>
(<column> <data_type>, <column> <data_type>, ...)
CLUSTERED BY (<bucket_key>) INTO <n> BUCKETS
STORED AS ORC
TBLPROPERTIES ("transactional"="true");
//单值分区表(Unique Value Partition)
CREATE TABLE <table_name>
(<column> <data_type>, <column> <data_type>, ...)
PARTITIONED BY (<partition_key> <data_type>)
CLUSTERED BY (<bucket_key>) INTO <n> BUCKETS
STORED AS ORC
TBLPROPERTIES ("transactional"="true");
//范围分区表(Range Partition)
CREATE TABLE <table_name>
(<column> <data_type>, <column> <data_type>, ...)
PARTITIONED BY RANGE(<partition_key1> <data_type>, <partition_key2> <data_type>, ...)
(PARTITION [<partition_name_1>] VALUE LESS THAN(<key1_bound_value1>, <key2_bound_value1>, ...),
PARTITION [partition_name_2] VALUE LESS THAN(key1_bound_value2, key2_bound_value2, ...), ... )
CLUSTERED BY (<bucket_key>) INTO <n> BUCKETS STORED AS ORC TBLPROPERTIES ("transactional"="true");
字段后面有空格,要加trim()
string类型字段后面有空格,row_number其中partition by该字段的时候,有空格字段会无效。另外,去重distinct(或group by所有字段)中有空格字段时候,无法去重,同样数据会再出现