首页 新闻 会员 周边

Sql去重性能比较

0
悬赏园豆:60 [已解决问题] 解决于 2011-06-03 18:19

表TB中,在gid为1和2中,要把souceid和type同时相同的找出来,只取一条

id souceid type gid

1   s1       t1       1

2   s1       t1       2

3   s2       t2       1

4   s2       t2       2

5   s3       t3       1

我了解的三种方法分别利用in、join、row_number

1.select * from TB where id in (select Max(id) from TB where gid in(1,2) group by souceid,type)

2.select * from TB A join (select Max(id) id from TB where gid in(1,2) group by souceid,type) B on A.id=B.id

3.select * from (select id,souceid,type,gid,row_number() over (partition by souceid,type order by id) as rn) A where A.rn=1

请高手指正,哪种方法最高效亦或是有更好的改进方法

89的主页 89 | 初学一级 | 园豆:0
提问于:2011-05-31 00:44
< >
分享
最佳答案
0

3效率最高.似乎应该这样写.select * from (select id,souceid,type,gid,row_number() over (partition by souceid,type order by id) as rn from TB) A where A.rn=1

直接得出结果.

 

1,2 都分两步进行,最后都涉及到聚合运算.

 

我的理解, 有不对的地方,欢迎指出.谢谢!

收获园豆:30
changbluesky | 小虾三级 |园豆:854 | 2011-05-31 15:32
其他回答(1)
0

不一定,话说分析函数挺费效率的.....在大数据量的时候

整体来看,效率最高的是2或3,数据量大的话应该是2;

gid in(1,2) ,改成 gid = 1 or gid = 2;

效率能高一点;

如果想效率最高的话,应该将其合并至一句:

很简单, GID最好加上索引;如果数据一直是1,2+位图索引;

收获园豆:30
刄月 | 园豆:235 (菜鸟二级) | 2011-06-01 04:55
那请问怎么合并至一句呢
支持(0) 反对(0) 89 | 园豆:0 (初学一级) | 2011-06-01 10:16
说的合并是指只得出具体的字段,而不是
select * from
因为重点是无法得到匹配的gid,id的合集,但是单纯得到GID和ID是没问题,何况此类语句一般都是嵌套在大的SQL里面使用的;

何况SQL语句的优化,主要还是看数据的 要求,然后是索引,再次是优化策略等方面;

直接拿一条很简单SQL,说明不了太多问题,因为10G后走自动优化路线,
如果是大SQL,主要看一些逻辑优化出手;

单纯此语句,2已经很不错了,因为没有具体的数据量和整体SQL结构是很难说如何让他更效率
支持(0) 反对(0) 刄月 | 园豆:235 (菜鸟二级) | 2011-06-03 13:13
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册