`
eimhee
  • 浏览: 2115834 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用partition by相对group by有什么优势吗?

阅读更多

我们公司上了一套系统,我查看了一下原开发人员在做报表时写的SQL代码,如下所示:  
  select   distinct   t3.code,t3.name,t3.material_spec,t3.default_unit,  
  sum(t2.quantity)   over   (partition   by   t3.code)   sum_qty,  
  sum(t2.amount)   over   (partition   by   t3.code)   sum_amount,  
  sum(t2.tax_amount)   over   (partition   by   t3.code)   -   sum(t2.amount)   over   (partition   by   t3.code)   tax,  
  sum(t2.tax_amount)   over   (partition   by   t3.code)   total_amount  
  from   t1,t2,t3,t4  
  where   ...  
  order   by   t3.code  
   
  然后以下是我自己整理的代码:  
  select   t3.code,t3.name,t3.material_spec,t3.default_unit,  
  sum(t2.quantity)     sum_qty,  
  sum(t2.amount)   sum_amount,  
  sum(t2.tax_amount)     -   sum(t2.amount)   tax,  
  sum(t2.tax_amount)     total_amount  
  from   t1,t2,t3,t4  
  where   ...  
  group   by   t3.code,t3.name,t3.material_spec,t3.default_unit  
  order   by   t3.code  
   
   
  二者运行的结果一要,性能我的那个要比原开发人员写的来的快。而且相差的性能很明显。用group   by要快很多。我就想问一下这里的高人?用partition   by是不是有别的用意?会比group   by   来的更科学更好?(ps:自己查资料一直找不到答案,所以上这里来麻烦大家了)  
  问题点数:100、回复次数:5Top

1 楼LoveLwn(小P)回复于 2005-03-08 16:28:34 得分 0

帮顶一下Top

2 楼slyfox123456()回复于 2005-03-08 16:33:26 得分 0

order   by  
  没有分区表快  
  从算法上都可以看出来Top

3 楼keanu_wang()回复于 2005-03-08 16:39:41 得分 100

partition   by关键字是oracle中分析性函数的一部分,它和聚合函数不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,partition   by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组,它有一部分函数既是聚合函数也是分析函数,比如avg、max,也有一部分是特有的,比如first、rank,除了order   by子句外,分析函数在一个查询中优先级最低。至于partition   by和group   by谁的性能更好,要看具体情况而定,从你所举的例子而言,partition   by的作用仅用于分组,那么性能可能比不上group   by。Top

4 楼lynx(lynx)回复于 2005-03-08 17:05:04 得分 0

sum()   over   (PARTITION   BY   ...)   是一个分析函数。   他执行的效果跟普通的sum   ...group   by   ...不一样,它计算组中表达式的累积和,而不是简单的和。  
   
  表a,内容如下:  
  B C D  
  02 02 1  
  02 03 2  
  02 04 3  
  02 05 4  
  02 01 5  
  02 06 6  
  02 07 7  
  02 03 5  
  02 02 12  
  02 01 2  
  02 01 23  
   
  select   b,c,sum(d)   e   from   a   group   by   b,c  
  得到:  
  B C E  
  02 01 30  
  02 02 13  
  02 03 7  
  02 04 3  
  02 05 4  
  02 06 6  
  02 07 7  
   
  而使用分析函数得到的结果是:  
  SELECT   b,   c,   d,   SUM(d)   OVER(PARTITION   BY   b,c   ORDER   BY   d)   e   FROM   a  
  B C E  
  02 01 2  
  02 01 7  
  02 01 30  
  02 02 1  
  02 02 13  
  02 03 2  
  02 03 7  
  02 04 3  
  02 05 4  
  02 06 6  
  02 07 7  
  结果不一样,这样看还不是很清楚,我们把d的内容也显示出来就更清楚了:  
  SELECT   b,   c,   d,SUM(d)   OVER(PARTITION   BY   b,c   ORDER   BY   d)   e   FROM   a  
  B C D E  
  02 01 2 2                     d=2,sum(d)=2  
  02 01 5 7                     d=5,sum(d)=7  
  02 01 23 30                   d=23,sum(d)=30  
  02 02 1 1                     c值不同,重新累计  
  02 02 12 13  
  02 03 2 2  
  02 03 5 7  
  02 04 3 3  
  02 05 4 4  
  02 06 6 6  
  02 07 7 7

评论

相关推荐

    详解partition by和group by对比

    今天大概弄懂了partition by和group by的区别联系。 1. group by是分组函数,partition by是分析函数(然后像sum()等是聚合函数); 2. 在执行顺序上, 以下是常用sql关键字的优先级 from > where > group by > ...

    只满足某个条件的查询效率分析

    介绍了 1.NOT EXISTS, 2.GROUP BY ... [HAVING ...] 3.count(*) over(partition by ...) 做查询的效率,以及各自的使用方法

    SQLServer中Partition By及row_number 函数使用详解

    partition by关键字是分析性函数的一部分,它和聚合函数不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,partition by用于给结果集分组,如果没有指定那么它把整个结果集...

    oracle函数介绍(6) 著名函数之分析函数.doc

    SELECT col, AVG(value) OVER(PARTITION BY col ORDER BY col) FROM tmp1 ORDER BY col; 2、SUM ( [ DISTINCT | ALL ] expr ) OVER ( analytic_clause ) 例如: --聚合函数 SELECT col, sum(value) FROM tmp1 ...

    oracle函数介绍(5) 分析函数简述.doc

    第五篇 分析函数简述 分析函数的语法结构比较复杂,但多数函数都具有相同的语法...Partition没啥说的,功能强大参数少,主要用于分组,可以理解成select中的group by。不过它跟select语句后跟的group by 子句并不冲突。

    Hive SQL大厂必考常用窗口函数及面试题.pdf

    窗⼝函数也称为OLAP函数,OLAP 是OnLine Analytical Processing 的简称,意思是对数据库数据进⾏实时分析处理。例如,市场分析、创建财务报表、创建计划...但是,PARTITION BY ⼦句并不具备 GROUP BY ⼦句的汇总功能。

    T-SQL高级查询

    可以完成对分组的数据进行增加排序,partition by可以与以上三个函数联合使用。 利用partition by按照班级名称分组,学生id排序 select s.id, s.name, cid, c.name, row_number() over(partition by c.name order ...

    快速RFID分组协议

    In RFID systems, the grouping problem is to efficiently group all tags according to a given partition such that tags in the same group will have the same group ID. Unlike previous research on the ...

    敲黑板啦!开窗函数你学会了吗

    开窗函数用于为行定义一个窗口(这里的窗口是指运算将要操作的行的集合),它对一组值进行操作,不需要使用GROUP BY子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。 Window Function又称为窗口函数...

    大数据学习笔记

    第一部分 Spark学习 6 第1章 Spark介绍 7 1.1 Spark简介与发展 7 1.2 Spark特点 7 1.3 Spark与Hadoop集成 7 ...28.3.2 JDBC GROUP BY查询语句实例 105 28.4 查询语句(JOIN) 106 28.4.1 JOIN查询语句实例 106

    分布式数据仓库Hive大全

    3.1 Group By 28 3.2 Order /Sort By 28 4. Hive Join 29 5. HIVE参数设置 31 6. HIVE UDF 33 6.1 基本函数 33 6.1.1 关系操作符 33 6.1.2 代数操作符 34 6.1.3 逻辑操作符 35 6.1.4 复杂类型操作符 35 6.1.5 内建...

    Hive用户指南

    3.1 Group By 28 3.2 Order /Sort By 28 4. Hive Join 29 5. HIVE参数设置 31 6. HIVE UDF 33 6.1 基本函数 33 6.1.1 关系操作符 33 6.1.2 代数操作符 34 6.1.3 逻辑操作符 35 6.1.4 复杂类型操作符 35 6.1.5 内建...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    其一、就业面广:全球前100强企业99家都在使用ORACLE相关技术,中国政府机构,大中型企事业单位都能有ORACLE技术的工程师岗位。 其二、技术层次深:如果期望进入IT服务或者产品公司(类似毕博、DELL、IBM等),...

    Apress.SQL.Server.Integration.Services.Design.Patterns.2nd.Edition.2014

    The book's group of master writers take you through various outline designs that you'll soon be utilizing consistently, giving the manner of thinking and specialized points of interest expected to ...

    Oracle连续相同数据的统计

    有些事情始终是需要坚持下去的。...row_number() OVER(ORDER BY ID)-row_number() OVER(PARTITION BY val ORDER BY ID) x FROM LCY ) GROUP BY val,x ORDER BY MIN(ID); 第二种rank(): SELECT val,COUNT(*

    Db2_SQL命令大全(完整版)

     CREATE TABLESPACE exoatbs IN DATABASE PARTITION GROUP IBMDEFAULTGROUP PAGESIZE 8K MANAGED BY SYSTEM USING ('/home/exoa2/exoacontainer') EXTENTSIZE 32 PREFETCHSIZE 16 BUFFERPOOL IBMDEFAULT8K ...

    SQL培训第一期

    1 SQL基础 1.1 基本概念 结构化查询语言(Structured Query ...select后面出现的列,如果没有使用集合函数,必须出现在group by 中。 select sno,sname,sum(grade) from student group by sno,sname; //合法写法 select...

    建立新年分区脚本.txt

    group by table_owner, table_name) b where a.table_owner = b.table_owner and a.table_name = b.table_name and a.partition_position = b.part_posi) loop v_part_name := v_minp_rec.minpart; ----------...

    微软内部资料-SQL性能优化5

    SQL Server keeps track of which pages belong to a table or index by using IAM pages. If there is no clustered index, there is a sysindexes row for the table with an indid value of 0, and that row will...

Global site tag (gtag.js) - Google Analytics