您的位置:首页 > 国内新闻

Oracle 分页查询与数据去重深入理解

时间:2019-09-14

0×251C

Oracle分页查询

一、高效写作

**/P>

1。不按顺序书写。(最高效率)

(测试后,该方法成本最低,只有一层嵌套,速度最快!即使查询的数据量很大,也几乎不受影响,而且速度仍然很快!

选择*

从(选择rownum作为rowno,t.)。*

来自EMP T

其中,雇用日期介于到日期之间(“”,“YYYYMMDD”)。

截止日期(“”,“YYYYMMDD”)。

和rownum<;=20)表别名

其中table_alias.rowno>;=10;

2。按顺序书写。(效率更高)

(测试后,随着查询范围的扩大,这个方法会越来越慢!

选择*

从(选择TT.*,rownum作为rowno

从(选择)*

来自EMP T

其中,雇用日期介于到日期之间(“”,“YYYYMMDD”)。

截止日期(“”,“YYYYMMDD”)。

按创建时间描述订购,EMP编号)TT

其中rownum<;=20)表别名

其中table_alias.rowno>;=10;

**/P>

2。高效的垃圾,但似乎是常见的分页

**/P>

三。不按顺序书写。(建议使用方法1代替)

随着查询数据的扩展,此方法将越来越慢。

选择*

从(选择rownum作为rowno,t.)。*

来自k_任务t

其中,航班“日期”介于“截止日期”之间(“”,“YYYYMMDD”)。

和“结束日期”(“”,“YYYYMMDD”))表别名

其中table_alias.rowno=10;

表_alias.rowno介于10和100之间;

4。按顺序书写。(建议使用方法2代替)

随着查询范围的扩大,此方法将越来越慢。

选择*

从(选择tt.*,rownum作为rowno

从(选择*

来自k_任务t

其中,航班“日期”介于“截止日期”之间(“”,“YYYYMMDD”)。

截止日期(“”,“YYYYMMDD”)。

按事实订购时间,航班号)表别名

其中table_alias.rowno介于10和20之间;

5。替代语法。(订购人)

(语法风格不同于传统的SQL语法。阅读和理解是不方便的。不建议标准化和统一标准。)

零件数据为

选择rownum作为rowno,tt.*。

从(选择*

来自k_任务t

其中,航班“日期”介于“截止日期”之间(“”,“YYYYMMDD”)。

截止日期(“”,“YYYYMMDD”)。

实际订购时间,航班号

在哪里ROWNUM&lt;=20)

SELECT *

来自partdata

何处rowno&gt;=10;

6替代语法。 (没有排序)

与partdata AS

SELECT ROWNUM AS rowno,t。*

来自k_task t

flight_date BETWEEN TO_DATE('','yyyymmdd')

和TO_DATE('','yyyymmdd')

AND ROWNUM&lt;=20)

SELECT *

来自partdata

何处rowno&gt;=10;

**

III。分析

**

Oracle的分页查询语句基本上可以以本文给出的格式应用。

分页查询格式:

SELECT *

FROM(SELECT a。*,ROWNUM rn)

FROM(SELECT)*

FROM table_name)a

在哪里ROWNUM&lt;=40)

其中rn>;=21

内部查询select*from table_name表示原始查询语句,而不翻页。rownum=21控制分页查询的每个页面的作用域。

0×251d

上面给出的分页查询语句在大多数情况下效率很高。分页的目的是控制输出结果集的大小,并尽快返回结果。在上面的分页查询语句中,这种考虑主要反映在rownum<;=40的语句中。

有两种方法可以选择21到40条记录。一种是通过rownum<;=40在上面示例中所示的查询的第二级控制最大值,以及在查询的最外层控制最小值。另一种方法是从查询的第二层删除where rownum<;=40语句,并控制查询最外层分页的最小值和最大值。以下是查询语句:

选择*

从(选择一个*行编号rn)

从(选择)*

从表(名称)a)中

其中Rn介于21和40之间

比较这两种书写方式,在大多数情况下,第一个查询的效率要比第二个查询的效率高很多。

这是因为在CBO优化模式下,Oracle可以将外部查询条件推送到内部查询中,以提高内部查询的执行效率。对于第一个查询语句,第二个查询条件WHERE ROWNUM&lt; Oracle可以将=40推入内部查询,这样一旦Oracle查询的结果超出ROWNUM限制,查询就会终止并返回结果。

第二个查询语句,因为查询条件BETWEEN 21和40存在于查询的第三层,Oracle无法将查询条件的第三层推送到最内层(即使到最内层也没有意义,因为最里面的查询不知道RN代表什么)。因此,对于第二个查询语句,Oracle的最内层将符合条件的所有数据返回到中间层,中间层将所有数据返回到最外层。数据过滤在最外层完成,这显然比第一个查询效率低得多。

上面分析的查询不仅是对单个表的简单查询,而且对于最里面的查询是复杂的多表联合查询或者最里面的查询包含排序的情况也是有效的。

此处不解释包含排序的查询,但将在下一篇文章中详细说明。

以下是多表关联的简要讨论。

对于等价表的最常见连接查询,CBO通常可以采用两种连接模式:NESTED LOOP和HASH JOIN(MERGE JOIN效率低于HASH JOIN,CBO一般不考虑这种情况)。这里,因为使用了分页,所以指定了返回的最大记录数。当返回的记录数超过最大值并将结果返回到中间层时,NESTED LOOP可以立即停止。 HASH JOIN必须处理所有结果集(MERGE JOIN也是如此)。在大多数情况下,NESTED LOOP作为分页查询的查询连接方法更有效(大多数情况下,当分页查询查询前几页的数据时,访问下一页的概率越低)。

因此,如果您不介意在系统中使用HINT,则可以按如下方式重写分页查询语句:

SELECT *

FROM(SELECT a。*,ROWNUM rn)

FROM(SELECT)*

FROM table_name)a

在哪里ROWNUM&lt;=40)

哪里有RN&gt;=21

Oracle Data Reduplication

I.完全重复的数据重复方法

具体的想法是先创建一个临时表,然后将DISTINCT后的表数据插入到临时表中;然后清空原始表数据;然后说说临时表数据插入到原始表中;最后删除临时表。

以下SQL语句可用于对表中的完全重复数据进行重复数据删除。

--Code

CREATE TABLE'#temp'AS(SELECTDISTINCT * FROM table name); - 创建临时表并将DISTINCT重复数据删除数据插入临时表

截断TABLE表名; - 清空原始表格数据

INSERT INTO表名(SELECT * FROM'#temp'); - 将临时表数据插入原始表

DROP TABLE'#temp'; - 删除临时表

二,一些重复数据删除方法

我们可以考虑创建一个临时表,将需要复制的字段,rowid插入临时表,然后在删除它们时进行比较。

可创建的临时表为

选择一个。领域1,a。字段2,MAX(a.ROWID)数据源来自官方表格GROUPBY a。领域1,a。第2场;

从表名中删除

其中a.rowid!=

从临时表b

中选择b.dataid

哪里一个。字段1=b。第1栏和

一个。字段2=b。第2场

);

提交;

例如:

- 根据MAX(a.rowid)过滤重复数据,以获得具有非重复数据的临时表

将表临时表创建为

从ipresult中选择a.ip,a.port,MAX(a.ROWID)dataid

一个GROUP BY a.ip,a.port;

- 删除官方表格中的重复数据,只留下最新的数据

从ipresult中删除

其中a.rowid!=

从临时表b

中选择b.dataid

其中a.ip=b.ip和

A.port=b.port

);

- 删除临时表并提交

删除表临时表;

提交;

http://wap.szdhdj.cn

  • 友情链接:
  • 康乐信息网 版权所有© www.lojasnipon.com 技术支持:康乐信息网| 网站地图