http://blog.csdn.net/chentao5211314/article/details/5955751
3.保留重复数据中最新的一条记录
在Oracle中,rowid是隐藏字段,用来唯一标识每条记录。所以,只要保留重复数据中rowid最大的一条记录就可以了。
查询重复数据:
select a.rowid,a.* from 表名 a
where a.rowid != (
select max(b.rowid) from 表名 b
where a.字段1 = b.字段1 and a.字段2 = b.字段2 );
例:selete from dba_tables a
where a.rowid!=(
select max(rowid) from test b
where a.owner=b.owner);
删除重复数据,只保留最新的一条数据:
delete from 表名 a
where a.rowid != (
select max(b.rowid) from 表名 b
where a.字段1 = b.字段1 and a.字段2 = b.字段2 )
使用临时表实现高效查询
create table 临时表 as
(select a.字段1, a.字段2, MAX(a.ROWID) as dataid from 正式表 a
GROUP BY a.字段1,a.字段2);
delete from 表名 a
where a.rowid !=
( select b.dataid from 临时表 b
where a.字段1 = b.字段1 and
a.字段2 = b.字段2 );
commit;
DELETE t FROM (
SELECT RESOURCE_ID, COLUMN_ID,MIN(column_ref_RESOURCE_ID) minvalue FROM T_RES_COLUMN_MAP
GROUP BY RESOURCE_ID, COLUMN_ID
HAVING COUNT(*)>1
) a
INNER JOIN T_RES_COLUMN_MAP t ON a.RESOURCE_ID=t.RESOURCE_ID
AND a.COLUMN_ID=t.COLUMN_ID
AND t.column_ref_RESOURCE_ID>minvalue
DELETE T_RES_COLUMN_MAP
where rowid in (select rid
from (select map.rowid rid,
row_number() over(partition by RESOURCE_ID, COLUMN_ID order by resource_rank) rn
from T_RES_COLUMN_MAP map)
where rn > 1);
http://meipeng1114-163-com.iteye.com/blog/807015
③String是一个比较特殊的数据类型,在Java中,String是一个类,但是他的传值却是采用“值传递”的方式。
首先String不属于8种基本数据类型,String是一个对象。
因为对象的默认值是null,所以String的默认值也是null;但它又是一种非凡的对象,有其它对象没有的一些特性。
new String()和new String(“”)都是申明一个新的空字符串,是空串不是null;
String str=”kvill”;
String str=new String (“kvill”);的区别。
http://www.cnblogs.com/xiangshu/articles/2054447.html
Union因为要进行重复值扫描,所以效率低。如果合并没有刻意要删除重复行,那么就使用Union All
两个要联合的SQL语句 字段个数必须一样,而且字段类型要“相容”(一致);
如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字。union(或称为联合)的作用是将多个结果合并在一起显示出来。
union和union all的区别是,union会自动压缩多个结果集合中的重复结果,而union all则将所有的结果全部显示出来,不管是不是重复。
Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;
Union All:对两个结果集进行并集操作,包括重复行,不进行排序;
Intersect:对两个结果集进行交集操作,不包括重复行,同时进行默认规则的排序;
Minus:对两个结果集进行差操作,不包括重复行,同时进行默认规则的排序。
[java] view plaincopyprint?
- package cn.sh.webfile.model;
- import java.io.Serializable;
- import javax.persistence.Column;
- import javax.persistence.Entity;
- import javax.persistence.Id;
- import javax.persistence.OneToOne;
- import javax.persistence.PrimaryKeyJoinColumn;
- import javax.persistence.Table;
- import javax.persistence.Version;
- import org.apache.commons.lang.builder.ReflectionToStringBuilder;
- /**
- * 开始于 2010-06-09
- * 文件标签符号表的模型
- * [2010-06-18修]新增加一个字段
- * [2010-06-21修]根据应用程序的使用反馈,把引用计数、点击计数字段,放入两个不同的表
- * 以实现更好的多工状态下的并发操作,减少状态冲突。分拆理由,表《文件标签》主表、《文件标签引用计数》、
- * 《文件标签点击计数》作为从表,主表变化慢,从表变化快。
- * 最后修改于 2010-06-21
- * @author 万继斌
- * @version 1.3
- */
- @Entity
- @Table(name = "文件标签")
- public class FileTagModel implements Serializable {
- /**
- * 使用java的UUID唯一号,36长度的字符串
- */
- @Id
- @Column(name = "主键")
- private String id;
- /**
- * 标签名称
- */
- @Column(name = "标签名称")
- private String tagName;
- /**
- * 标签排序
- */
- @Column(name = "标签排序")
- private int px;
- /**
- * 主观权重
- */
- @Column(name = "主观权重")
- private boolean tagWeight;
- /**
- * 主观推荐
- */
- @Column(name = "主观推荐")
- private boolean tagSuggest;
- /**
- * 实体创建时的时间戳
- */
- @Column(name = "时间戳")
- private long timestamp;
- /**
- * 实体对象的版本号
- */
- @Column(name = "版本号")
- @Version
- private int version;
- /**
- * 点击计数
- */
- @Column(name = "点击计数")
- private int clickCount;
- /**
- * 引用计数
- */
- @Column(name = "引用计数")
- private int quoteCount;
}
主键:char(36)
标签名称:varchar(50)
标签排序:int
主观权重:bit
主观推荐:bit
时间戳:bigint
版本号:int
引用计数:int
点击计数:int
经过一段时间的测试后发现,“文件标签”表中,各个字段的的变化速度有很大的不同,其中引用计数、点击计数、变化很频繁,而其它字段的内容相对变化就比较稳定,一旦生成,相对比较稳定,这样在并发程度高时,常常导致数据更新冲突,虽然可以通过@version注解可以保证数据的乐观锁定发生作用,数据的一致性不被破坏。但是由于把变化频度差异很大的字段放在同一张表上,导致冲突发生的概率增大,降低了系统的效能。
《文件标签》表实体Bean
[java] view plaincopyprint?
- package cn.sh.webfile.model;
- import java.io.Serializable;
- import javax.persistence.Column;
- import javax.persistence.Entity;
- import javax.persistence.Id;
- import javax.persistence.OneToOne;
- import javax.persistence.PrimaryKeyJoinColumn;
- import javax.persistence.Table;
- import javax.persistence.Version;
- import org.apache.commons.lang.builder.ReflectionToStringBuilder;
- /**
- * 开始于 2010-06-09
- * 文件标签符号表的模型
- * [2010-06-18修]新增加一个字段
- * [2010-06-21修]根据应用程序的使用反馈,把引用计数、点击计数字段,放入两个不同的表
- * 以实现更好的多工状态下的并发操作,减少状态冲突。分拆理由,表《文件标签》主表、《文件标签引用计数》、
- * 《文件标签点击计数》作为从表,主表变化慢,从表变化快。
- * 最后修改于 2010-06-21
- * @author 万继斌
- * @version 1.3
- */
- @Entity
- @Table(name = "文件标签")
- public class FileTagModel implements Serializable {
- /**
- * 使用java的UUID唯一号,36长度的字符串
- */
- @Id
- @Column(name = "主键")
- private String id;
- /**
- * 标签名称
- */
- @Column(name = "标签名称")
- private String tagName;
- /**
- * 标签排序
- */
- @Column(name = "标签排序")
- private int px;
- /**
- * 主观权重
- */
- @Column(name = "主观权重")
- private boolean tagWeight;
- /**
- * 主观推荐
- */
- @Column(name = "主观推荐")
- private boolean tagSuggest;
- /**
- * 实体创建时的时间戳
- */
- @Column(name = "时间戳")
- private long timestamp;
- /**
- * 实体对象的版本号
- */
- @Column(name = "版本号")
- @Version
- private int version;
- /**
- * 点击计数
- */
- @OneToOne
- @PrimaryKeyJoinColumn
- private FileTagClickCountModel clickCount;
- /**
- * 引用计数
- */
- @OneToOne
- @PrimaryKeyJoinColumn
- private FileTagQuoteCountModel quoteCount;
-
}
《文件标签引用计数》表实体Bean
[java] view plaincopyprint?
- package cn.sh.webfile.model;
- import java.io.Serializable;
- import javax.persistence.Column;
- import javax.persistence.Entity;
- import javax.persistence.Id;
- import javax.persistence.Table;
- import javax.persistence.Version;
- import org.apache.commons.lang.builder.ReflectionToStringBuilder;
- /**
- * 开始于 2010-06-21
- * 文件标签引用计数表的模型
- * 《文件标签引用计数》作为从表,主表变化慢,从表变化快。
- * 最后修改于 2010-06-21
- * @author 万继斌
- * @version 1.0
- */
- @Entity
- @Table(name = "文件标签引用计数")
- public class FileTagQuoteCountModel implements Serializable {
- /**
- * 使用java的UUID唯一号,36长度的字符串
- */
- @Id
- @Column(name = "主键")
- private String id;
- /**
- * 引用计数
- */
- @Column(name = "引用计数")
- private int count;
- /**
- * 实体创建时的时间戳
- */
- @Column(name = "时间戳")
- private long timestamp;
- /**
- * 实体对象的版本号
- */
- @Column(name = "版本号")
- @Version
- private int version;
-
}
《文件标签点击计数》表实体Bean
[java] view plaincopyprint?
- package cn.sh.webfile.model;
- import java.io.Serializable;
- import javax.persistence.Column;
- import javax.persistence.Entity;
- import javax.persistence.Id;
- import javax.persistence.Table;
- import javax.persistence.Version;
- import org.apache.commons.lang.builder.ReflectionToStringBuilder;
- /**
- * 开始于 2010-06-21
- * 文件标签点击计数表的模型
- * 《文件标签点击计数》变化较快的表。
- * 最后修改于 2010-06-21
- * @author 万继斌
- * @version 1.0
- */
- @Entity
- @Table(name = "文件标签点击计数")
- public class FileTagClickCountModel implements Serializable {
- /**
- * 使用java的UUID唯一号,36长度的字符串
- */
- @Id
- @Column(name = "主键")
- private String id;
- /**
- * 点击计数
- */
- @Column(name = "点击计数")
- private int count;
- /**
- * 实体创建时的时间戳
- */
- @Column(name = "时间戳")
- private long timestamp;
- /**
- * 实体对象的版本号
- */
- @Column(name = "版本号")
- @Version
- private int version;
- }
《文件标签》表结构
主键:char(36)
标签名称:varchar(50)
标签排序:int
主观权重:bit
主观推荐:bit
时间戳:bigint
版本号:int
《文件标签引用计数》表结构
主键:char(36)
引用计数:int
时间戳:bigint
版本号:int
《文件标签点击计数》表结构
主键:char(36)
点击计数:int
时间戳:bigint
版本号:int
经过实地测试,并发效能大大提高,而通过对主表的分割,而导致的连接操作带来的速度损失相对较小,某些方面还可以增大综合读写速度。