oracle order by 优化(小白一个,球不鄙视)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle order by 优化(小白一个,球不鄙视)相关的知识,希望对你有一定的参考价值。

sql语句
select to_char(TRANSDATE,'yyyy-mm-dd') TRANSDATE, TRANSTIME, mm.prdid PRDID, mm.serviceid SERVICEID, mm.returncode RETURNCODE from eip.MCJNLQUERYLOG mm where TRANSDATE between to_char('2014-03-09','yyyy-mm-dd') and to_char('2014-06-09','yyyy-mm-dd') order by TRANSDATE DESC
表索引

执行后优化器的结果
如果不是order by影响效率,请指出,在线等

参考技术A 索引影响的是查询的列的效率,不影响排序的效率,就是说在你的这个SQL语句中,已经很简化的,从语言上是已经最优化的啦,除非你使用了分区等其他技术,在这里的SQL语句中要加索引的话应该加在查询字段而不是排序字段上,就是to_char字段上。还有上面的提到的其他技术可以提高效率,但不是从语句上面提高效率,比如分区等。追问

to_char函数要实现的在oracle处理和用java处理那一个比较快?另外分区是一个统一的设置吗?

追答

分区是在数据库系统层面设置的,java只是一种语言,最终的查询还是要通过数据库访问组件转到oracle里面处理,最终都是要oracle来进行查询,很明显是直接使用oracle查询快了,java还需要通过数据库访问组件,odbc,oledb等等组件,多了一道工序,肯定是需要效率时间和硬件资源的,当然慢了。另外一方面,很多时候必须使用java等语言编写一个系统,给不懂数据库的人来操作数据库。

参考技术B

transdate 是date类型的吧?那为什么要与字符比较呢?

改成下面的试试:

where TRANSDATE between to_date('2014-03-09','yyyy-mm-dd') and  to_date('2014-06-09','yyyy-mm-dd')

参考技术C 怎么了?这样没问题啊,索引加的挺好,写法也没问题。追问

你的意思是索引起作用了吗?

追答

索引影响的效率仅仅说是查询列,那就太简单了。事实并不是如此,查询列是影响最大的,但绝不是唯一的。不管是group by 还是order by 都会受其影响。要了解order by,建议你看看分析函数,那里面order by对于索引还是要求挺高的。
另外,如果只是数据量涉及并不是那么大(一般以2G为参照点),表分区还是不建议使用。毕竟有时候在查询方式不确定的情况下,表分区之后可能会更慢。

本回答被提问者采纳

oracle中,还是不甚明白order by和group by的用法

select * from scott.emp group by deptno (×)
select * from scott.emp order by deptno(√)
还有group by 分组,的顺序怎么回事?
select avg(sal),max(sal) ,job ,deptno from emp group by job, deptno;
回车显示的既不是以job 分组,也不是以deptno分组的。

我甚是理解你 我开始也很不明白
order by是排序
如order by ID 表示按ID 升序排列
order by ID,NUM 表示优先按照ID排序 ID相同的再按NUM排序 这个意思

group by 是分组
首先用group by 的前提是你的select里边用了聚合函数如sum(),avg(),min(),max()
没有聚合函数用不了group by会报错
其次 出现在select里边的除聚合函数以外的所有字段 都必须作为group by的条件
出现在group by中的字段可以不select出来
也就是说 select中的字段必须出现在group by中 group by中的分组条件不一定出现在select中
你的例子中 select * 表示所有字段 这个时候必须所有字段group by 你只group by deptno肯定报错
再次 group by 的顺序类似order by
如 group by A,B,C,D责先按A分组 再按BCD这个顺序分组
group by条件越多分组越细 也就是说 假如A是学校 B是学院 C是专业 D是班级 那最后group by的结果是按照有多少个不同的班级分组 按照最细致的分组

因为我对这个感触颇深希望我的理解对你有帮助追问

最细致的分组,比如说A可以是清华,北大;B是计算机,电子;C是编程技术,网络基础;D是计算机科学班1,电气化科学班2;
那排序是按照计算机科学班1和电气化科学班2分组,但是这两个班既可以是网络专业,也可以是编程技术的,还可以是计算机学院的,也可以是电子学院的。。而且或许是清华的或许是北大的?
还是很乱套的样子。

追答

所以说group by的条件越多 分组越细 越没有意义
给你一个前辈给我讲时的列子你再理解一下:
A B C D 数量
001 B1 C1 D1 10
001 B2 C2 D2 20
002 B3 C3 D3 30
002 B3 C3 D4 40
GROUP BY条件 分组结果求SUM(数量)
A 2行 30
70
A,B 3行 10
20
70
A,B,C 3行 10
20
70
A,B,C,D 4行 10
20
30
40
我觉得这个例子应该很明确分组概念了 你可以理解一下
如果还不明白可以继续探讨

参考技术A

Oracle Order By子句

在Oracle中,表中是以非指定顺序存储行数据记录的,它不管行插入数据库的顺序如何。要按列以升序或降序查询行记录,必须明确指示Oracle数据库要如何去排序。

例如,您可能希望按名称的字母顺序列出所有客户,或者按照从最低到最高信用限额的顺序显示所有客户。

要对数据进行排序,我们可以将ORDER BY子句添加到SELECT语句中,参考以下语法:

要按列排序结果集,可以在ORDER BY子句之后列出该列。

按照列名是一个排序顺序,可以是:

    ASC表示按升序排序

    DESC表示按降序排序

默认情况下,无论是否指定ASC,ORDER BY子句都按升序对行进行排序。如果要按降序对行进行排序,请明确使用DESC。

NULLS FIRST在非NULL值之前放置NULL值,NULLS LAST在非NULL值之后放置NULL值。

ORDER BY子句可以按多列对数据进行排序,每列可能有不同的排序顺序。

请注意,ORDER BY子句总是SELECT语句中的最后一个子句。

GROUP BY 是一个聚合子句,相当于把查询出的结果按某种方式分组。

教程来源:树懒学堂_一站式数据知识平台_Oracle Order By子句

参考技术B order by 顾名思义,就是排序的意思 order by 某列(column) 就是你查看的结果是根据某列的升降序显示的。
group by ,分组函数,关注的是 group by 列,中列的查询结果。当 group by和order by 一起使用时,先执行group by 在执行 order by。

你的sql 使用了聚合函数,是对 avg()max() 列做平均和最大值运算,是以这2个共同结果为分组的。追问

以这两个结果分组?那结果是随意显示的么?既然分组了 怎么看不出谁和谁是一组?

追答

你可以吧查询结果贴出来一下,结果是 以上2个分组+avg()升序来显示。

参考技术C 一个排序 一个分组 怎么不明白呀 不是一个意义呀

一个是用来改结果集的顺序的

一个是用来统计某些字段信息的

group by 不带排序功能

你可以group by了之后 order by 1,2

以上是关于oracle order by 优化(小白一个,球不鄙视)的主要内容,如果未能解决你的问题,请参考以下文章

oracle不可以用order by么

oracle中,还是不甚明白order by和group by的用法

oracle中,还是不甚明白order by和group by的用法

Oracle Order By排序用法详解

Oracle Order By排序用法详解

oracle查询选择语句——count、sum、order by、group by