
DB
zzhonghe2
这个作者很懒,什么都没留下…
展开
-
SQL语言艺术(数据库建模要点)
自从第一次数据库以来,我一直都在做所谓的建模。想来建模无非就是建建表,加加字段,最多还摆几个索引上去。建表的话,程序怎么方便怎么来,字段的话,甚至可以全部用varchar....经常也会考虑到怎样的表,怎样的模型才是最高效的模型,最好扩展的模型,最能够体现业务的模型。在仔细读这本书之前,一直不得其法。 虽然也会努力的想设计好这些模型,比如采用面向对象的方式,但做出来的东西,还是缺乏保障,需...原创 2010-12-21 19:43:24 · 192 阅读 · 0 评论 -
11g新特性 递归子查询 替代 Connect by
在这个例子里面,关于history的记录,每条记录都有一个prv_trx_history_id指向上一条的记录, 因此,可以采用递归的方式列出所有的History. (注,此处不用order by creation_date的原因是,可能同一时间可能会插入多条,这样就无法区分先后)select his.customer_trx_id, his.transaction_history_i...原创 2012-09-10 21:46:59 · 347 阅读 · 0 评论 -
11g新特性 pivot&unpivot 的行列转换
笔记如下:--求所有BR中,曾经有大于2次状态是Closed, 并且至少做过一次Unpaid的BR集合select * from(select customer_trx_id, status from ar_transaction_history_all)pivot ( count(status) for status in ('CLOSED' a...原创 2012-09-10 23:24:29 · 129 阅读 · 0 评论 -
开发Oracle数据库应用的正确和不正确的方法
看书的目的在于深入理解Oracle到底能做什么,尽量多的学习Oracle的功能,避免重复发明轮子。提高工作效率的一个原则就是做正确的事情,如果花费几个月的心血才研究实现出来的东西,却能够通过简单的配置Oracle就能实现,那么未免效率太过低下了。1. 基于数据库应用开发的基本原则在于, 如果功能能够在数据库中实现,那么就优先在数据库中实现。尽量用一条SQL语句来完成工作,如果实在是...原创 2012-10-04 17:52:34 · 106 阅读 · 0 评论 -
SQL性能调优技巧
Data Model设计的Tip 1. 以三个范式为基础,业务的独立性和原子性拆分要合适,杜绝Key的冗余和不充分依赖2. 对于有NULL值的时候,说明可以拆分为子类, 如果有互斥值,比如两个字段,如果A有值,那么B就不能有值3. 隐藏的约束,某个Column为A值,那么另外一个Column就必须为B值,或者某个Column只能是1~20的值4. 对于Boolean值,比如某...原创 2014-02-28 23:49:20 · 108 阅读 · 0 评论 -
Oracle的并发和多版本控制
写不会阻塞读,这是Oracle和其他数据库的一个根本的区别。Oracle能够同时物化多个版本的数据,每次写入数据,都会另外生成一个版本,并附上时间戳,而当一个读操作发起时,它只能读到这个时间戳以内的版本,超过这个时间戳所更新的数据,是不会返回在结果集里面。所以一个程序如果只是读操作,那么它永远也不会被阻塞,也不会发生死锁。从某种意义上看,Oracle天然就具备了读写分离的特性。不像Mysql,需...2014-03-03 22:27:53 · 365 阅读 · 0 评论 -
Oracle的锁
Oracle的锁是行锁,实现方式是在块上进行标识锁状态,因此几乎没有相关的开销,锁定1行和锁定1百万行的开销几乎是一样的。 由于Oracle的并发和多版本的实现,存在丢失更新的文件,需要代码手工去避免,这也是出于性能的考虑,让Oracle天然具有读写分离的特性。 悲观锁: select for update nowait.nowait的区别在于其他线程对于相同资源的访问并不...2014-03-04 08:57:33 · 131 阅读 · 0 评论 -
Oracle的事务
显式调用编写Oracle程序的时候,一个比较好的习惯就是要显示地执行Commit或者Rollback. 一些工具如Sqlplus在退出的时候,会自动commit,而另外一些则会rollback。 如果过分的依赖这些隐式地调用,那么有可能造成不可预估的后果。 SET TRANSACTION 或者 DBMS_TRANSACTION 可以显示地开始一个事务, 但这不必要, Ora...2014-03-04 10:31:17 · 149 阅读 · 0 评论 -
Oracle的Redo和Undo
延迟段创建: create table的时候,并没有真正分配段,而已等真正需要insert的时候才进行分配空间。 Update+ Commit所做的工作: update:生成undo信息修改数据块给数据块加锁标记,得到锁生成Redo信息commit:为事务生成SCN,计数LGWR把Redo日志写入到磁盘 -- IO最花时间, PLSQ...2014-03-05 09:06:18 · 261 阅读 · 0 评论 -
Oracle的表
堆表 -- 普通表99%的应用在使用到表的时候,都是使用堆表。Heap,这是一个无序的空间,插入的数据会找到一个合适的位置来存储,带有随机性,而不是按插入的顺序来存储。所以,在全表扫描的时候,返回的数据是按照空间检索的顺序来找到并返回记录。 索引组织表和堆表相比起来,索引组织表的所有的数据都是保存在索引的数据结构里面,存在索引段里面而非表段,所有的数据插入都是有序的放置在指定的连...2014-03-05 11:05:39 · 143 阅读 · 0 评论 -
Hive编程指南读书笔记
1. MapReduce的任务, Map之后,会进行排序,然后才会传入Reduce作业。 MapReduce的本质是结果集从1个集合到另外一个集合归并过滤的过程。 2. HBase的场景是所要查询的列只是一个列的子集的时候,查询速度会很快。 提供行级别的更新和快速查询。(亿级别的数据查询) 3. Hive可以用java编码来扩充Hive的功能UDF函数。 1. ...2015-05-07 09:01:07 · 207 阅读 · 0 评论 -
Hive行列转换
行列转换在ETL中是非常常见的场景,Hive中也毫不意外的遇到了:事例1drop table if exists row_column_test; create table row_column_test ( name string ,category string ,id string ...2015-05-07 09:07:52 · 184 阅读 · 0 评论 -
hive和hbase的联合表
在hive中创建表: 主键,账户状态,余额,同时定义好其在hbase中的mapping表名,以及键值对。 注意:hive表中必须有字段key作为主键 CREATE TABLE grzx_common(key string, account_status string, balance string) STORED BY 'org.apache.hadoop.hive.hbase...2015-12-29 11:04:15 · 210 阅读 · 0 评论 -
排序内存不够导致IO操作频繁的调优
--找到当前进程的SIDselect sid from v$mystat where rownum=1;--查看执行目标语句之前的PGA/UGA使用情况, Direct temp使用情况。Direct temp使用次数多的话,说明对临时文件读取频繁select * from v$statname a,v$sesstat bwhere a.statistic#=b.sta...原创 2012-09-09 10:54:12 · 275 阅读 · 0 评论 -
嵌套join和HashJoin以及Hash索引
嵌套join和Hash Join首先谈谈Join的方式,不同的数据库有不同的Join方式,比如Mysql就只支持嵌套Join, 而Oracle在默认情况下是嵌套Join,而在显示的语句下,或者是Join没有索引的情况下,就会使用HashJoin.示例语句:select a.xx,b.xxx from a, b where a.id=b.parentId 有两...原创 2012-09-08 12:47:54 · 771 阅读 · 0 评论 -
Mysql性能调优与架构设计--笔记
登入mysql主机:mysql -uadm -pbbnd_adm --prompt="\\u@\\h\\Y:\\m:\\r:\\m:\\s>" --tee=operat.log--tee帮助拷贝屏幕--prompt标记提示目前所处那个mysql,展示账号,ip等查看mysql状态的工具mysqladmin -uadm -pbbnd_adm -h loca...原创 2010-11-11 12:17:23 · 120 阅读 · 0 评论 -
使用索引需要注意的细节
索引的创建和数据表的创建同样的重要,都是系统性能的基石,索引没有创建好性能不但不能提高,还会造成系统资源的严重浪费,维护索引对于DB来说,开销还是很高的,甚至超过了表本身的数据。所以,对于任何一个索引的创建,都要有非常充分的理由。使用索引的时候通常要注意以下一些细节:1. 是否有查询用这个索引字段,没有的话绝对不能乱加2. 该表的数据量多大,如果只有少量数据,比如几...原创 2011-01-26 17:32:20 · 153 阅读 · 0 评论 -
小表是否就真的没有必要加索引
之前总结了部分使用索引的规则,其中有一条: 小表不必要加索引今个,在读Oracle性能诊断艺术的时候,作者对这条规则提出了异议,说是曾经在一次调优中,对一个小表添加索引,使得整个查询的性能得以提高30倍。 我觉得非常诧异,再细读下去才得知,小表做一次全表扫描,和做一次索引定位,时间的相差也许只有0.01秒,一般情况下是可以忽略不计的, 但小表如果在查询中处于核心路径的话,对小表...原创 2011-01-27 17:36:29 · 1182 阅读 · 0 评论 -
硬编码SQL有时比绑定变量SQL要好
众所周知,SQL提交到数据库引擎后,在执行前要做一系列的工作,包括解析,优化,生成执行计划等,这个过程是比较消耗CPU的计算过程。相同的SQL提交到引擎后,就可以省略掉执行前的一系列工作,直接选定上次用过的那个执行计划进行查询。所以,绑定变量的SQL就在这个情境下发挥最大的作用了,让多个查询共享一个游标和执行计划,大大提高了效率。但事情也不完全是这样的,在有些范围查询中,关键查...原创 2011-01-27 18:06:17 · 186 阅读 · 0 评论 -
Mysql复制的几个参数和命令--备忘
#开启二进制日志log-bin=mysql-bin#开启中继日志relay-log=mysql-relay#将Slave的修改记入二进制日志,方便该Slave再作为其他Slaves的Masterlog-slave-updates=1#建立账号grant replication client, replication slave on *.* to 'repl'@...原创 2011-02-22 11:49:40 · 117 阅读 · 0 评论 -
Mysql执行计划-Extra列解析
Mysql的执行计划中,其他的列都比较好理解,唯独这个Extra列,总是看得有点让人似懂非懂,先终于找了个机会自己研究了下。using index: 中文名叫做索引覆盖查询: 如果查询的时候,用到了索引,并且你最终需要的数据也是这个索引的一部分,那么就出现using index.例如:user表有索引 key(id), key(name)select id...原创 2011-02-22 12:11:20 · 278 阅读 · 0 评论 -
Mysql是支持预编译的,只是默认没开启
近日看到一帖子,曰Mysql不支持预编译,并做了大量的测试来证明是没有预编译。其实Mysql不是不支持,只是默认的状态下,预编译的功能并没有开启。这里的默认状态是指的jdbc url 的默认连接参数。采用show status like '%prepare%'; 可以看到mysql缓存了预编译的sql的数目;jdbc:mysql://xxx.22.11.31:3306/db...原创 2011-02-22 13:02:00 · 440 阅读 · 0 评论 -
决定MyISAM的Select&Insert&Update并发性能的参数
concurrent_insert 通过查看 show variables like '%concurrent%' 0: 表示不能并发,Select, insert之间只能串行执行1:表中有空洞(删除记录留下的)情况下,阻塞insert; 表中无空洞的情况下,Insert并发插入表尾2:无论是否有空洞都并发插入表尾默认情况下, 这个值是1, 所以在既有...原创 2011-02-23 13:40:32 · 252 阅读 · 0 评论 -
Insert语句的几个提高效率的特殊用法
我们做Insert操作的,经常要判断insert的条件是否满足。一般的做法,都会先执行一条判断语句,然后再执行insert语句,下面的方法可以帮助你节省第一条判断语句,把这两者结合到一起完成。测试表: create table ccc (id int primary key, name varchar(100));1. on duplicate key update column...原创 2011-02-24 19:03:48 · 1722 阅读 · 0 评论 -
用单条SQL优化流程化的统计过程
最近是一次成功优化的体验,把原来流程化的Java+N条SQL的统计流程精简成了一条SQL语句,成功减少了很多行Java代码,减少很多次连接以及流量,效率提高了好几倍。类似环境:create table items (id int,price int, mnt int, total int);insert into items values(rand()*1000, ...2011-02-25 11:09:41 · 93 阅读 · 0 评论 -
Mysql中模拟rownum完成行列转换
环境:create table ff(f1 varcahr(10), f2 int);insert into ff values ('A', round(rand()*100));insert into ff values ('A', round(rand()*100));insert into ff values ('A', round(rand()*100));...原创 2011-02-26 16:49:53 · 215 阅读 · 0 评论 -
SQL经典模式 - 行转列
不知道读者有没有类似的遭遇,遇到下面这样的设计:#雇员信息create table employee (eId int, propName varchar(10), propName varchar(10));insert into employee values (1, 'firstName','Calvin'),(1,'lastName','Zhou'),(1,'age',...2011-02-27 11:12:20 · 100 阅读 · 0 评论 -
SQL经典模式--列转行
SQL经典模式--列转行一般需要将列转成行来使用,一定是原有的Schema设计没有考虑周全。但是没有办法,为了保护现有的投资,不得不在糟糕的设计上周旋,用最小的代价去实现新需求。毕竟认识都是由浅入深,为不健全的Schema设计付出代价,就像交税一样,无可避免。举例:课程表: 每门课程由5位老师教,要求包含老师的信息,以及一些课程的信息create tab...2011-02-28 07:30:09 · 120 阅读 · 0 评论 -
用sqoop从Hive to Mysql导数
hive和mysql分别建表如下: hive> desc grzx_base_info;OKname string age int mysql> desc grzx_base_info;+-------+-------...2015-12-29 11:53:07 · 377 阅读 · 0 评论