DataBase

mysql seq

Submitted by Lizhe on Fri, 05/11/2018 - 10:58

create table tb_sequence(name varchar(50) not null,current_value int not null,_increment int not null default 1, primary key(name));

insert into tb_sequence values('userid',0,1);

DELIMITER //

create function _nextval(n varchar(50)) returns integer

begin

declare _cur int;

set _cur=(select current_value from tb_sequence where name= n for update);

update tb_sequence set current_value = _cur + _increment where name=n ;

return _cur; end;

//

 

DELIMITER ;

 

 

redis 入门

Submitted by Lizhe on Mon, 07/03/2017 - 11:03

因为redis不在centos的标准库中, 需要先安装epel-release库

yum install epel-release 

yum install redis

如果不使用systemctl启动的话,需要使用下面的命令

/usr/bin/redis-server /etc/redis.conf

从局域网访问需要先去掉redis.conf文件中的

 bind 127.0.0.1

否则只能本机登录

然后我们尝试使用java客户端连接

pom.xml

mybatis下oracle的分页

Submitted by Lizhe on Thu, 06/08/2017 - 18:01

备忘一下分页的mapper文件

<mapper namespace="com.test">

    <sql id="paginationPrefix">
        <if test="filter != null and paginated == true">
            select * from (select rownum rn_, q_.* from (
        </if>
    </sql>

    <sql id="paginationSuffix">
        <if test="filter != null and paginated == true">
            ) q_ where rownum &lt; #{maxRowToFetch}) where rn_ &gt;= #{minRowToFetch}
        </if>
    </sql>

</mapper>

 

Oracle 并发查询

Submitted by Lizhe on Mon, 06/05/2017 - 10:54

 

需要打开计时器的话可以参考

set timing on;

在开始之前需要强调的是

任何并发操作都是以硬件换速度, 如果没有足够的硬件不要轻易使用并发,另外如果是大访问量的网站系统请慎用,数据库并发查询一般还是用在夜晚的大批量batch批处理上

1. 直接改表

ALTER TABLE INO_ONCONFIG.LOOKUP_OPTIONS PARALLEL 4;

要关闭的话使用直接NOPARALLEL参数或者直接设置线程数为1好像也可以

ALTER TABLE INO_ONCONFIG.LOOKUP_OPTIONS NOPARALLEL;

ALTER TABLE INO_ONCONFIG.LOOKUP_OPTIONS PARALLEL 1;

2. 使用hint

需要注意的是如果需要指定schema名的话hint的时候需要把schema名去掉

select /*+ parallel(LOOKUP_OPTIONS 8) */ count(*) from INO_ONCONFIG.LOOKUP_OPTIONS;

 

数据库索引设计

Submitted by Lizhe on Fri, 06/02/2017 - 10:18

为关系型数据库添加索引是一种最基础的优化方式

基础虽基础, 但其实并不简单, 记得几年前去一家国内大公司的云计算部门面试

提到索引的时候面试官说"加索引都是最基础的", 我不赞同这种说法, 基础但并不简单

考虑下面这种情况

1 索引的原理是什么

2 我应该在哪些字段上加索引

3 我应该对每个字段使用独立的索引还是应该使用联合索引

4 加了索引之后的坏处是什么

5 哪些情况下没有索引反而要比有索引更快

 

下面我们进一步讨论这些问题

1 索引的原理是什么

索引的工作方式其实和view差不多, 每个索引都会构成一个单独的索引表, 这里我不想讨论B tree之类的问题

227

Linux下安装Oracle 12c ( 含systemctl 开机自动启动oracle)

Submitted by Lizhe on Tue, 05/30/2017 - 12:17

创建一个名为oracle的用户

把下载后的zip文件解压

我的路径是/home/oracle/database

这个路径下有一个叫做runInstaller的可执行文件,直接运行它,注意你需要使用oracle直接登录进ui界面,用su oracle切换过来调用任何图形界面都会报错

当然网上也有其他解决方案,不过我觉得还是直接用oracle登录进图形界面最简单

然后一步一步照着填就可以,安装过程中有两个脚本需要使用root权限调用,然后点击ok

创建用户名称的时候12c需要以C##开头, 原因是现在多了一个plugable DB的概念,具体还不太清楚,反正instance跟数据库由一对多变成多对多了

默认会安装在/home/oracle/app/oracle/product/12.2.0/dbhome_1 , 需要的其他命令比如要创建数据库的管理工具都在这个目录的bin目录下 (./dbca)

Cost Based Optimizer 基于成本的SQL优化器

Submitted by Lizhe on Wed, 03/29/2017 - 16:53

Oracle 自7开始引入了CBO.

Oracle会根据cpu,内存以及I/O的开销来进行SQL优化

可选择率是CBO的一个核心概念

1. 可选择率

可选择率 = 指定谓词返回的结果集记录数/未使用谓词返回的结果集记录数

取值范围是 0到1 , 值越小 表明 可选择性 越好

2. 可传递性

2.1 简单谓词传递

2.2 连接谓词传递

2.3 外链接谓词传递

实际上就是 a1=a2 and a1=10 等价于 a1=10 and a2=10

 

Rule Based Optimizer 基于规则的SQL优化器

Submitted by Lizhe on Mon, 03/27/2017 - 17:56

 

待执行的SQL语句进入数据库系统后都会进入查询优化器进行查询转换.

在Oracle 10g之前, Oracle会默认使用RBO规则

数据库会将查询条件分成15个等级, 通过判断条件(动作)的级别高低来决定那个谓词被优先执行

例如 基于rowid的查询级别是最高的为1, 全表扫描的执行级别最低为15

基于RBO优化器的一个明显缺点在于, 依靠硬编码来确定的规则很难被动态改变, 编写SQL语句的时候需要十分注意

这里如果你跟我一样使用的是10g之后的版本,我们需要使用下面的命令将优化器暂时改成RBO ( 只对当前session有效,不用再改回来)

alter session set optimizer_mode='RULE';

然后我执行一个执行计划

 

EXPLAIN PLAN FOR select * from INO_OUTAGES.OUTAGE where SUBCATEGORY='NBN Outage';
SELECT plan_table_output FROM TABLE(DBMS_XPLAN.DISPLAY('PLAN_TABLE'));