iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >Oracle中怎么构造序列
  • 447
分享到

Oracle中怎么构造序列

2024-04-02 19:04:59 447人浏览 泡泡鱼
摘要

本篇文章给大家分享的是有关oracle中怎么构造序列,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Oracle构造序列的方法随着版本一直在变化

本篇文章给大家分享的是有关oracle中怎么构造序列,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

Oracle构造序列的方法随着版本一直在变化。在9i之前的版本,常用的方法是:

select rownum rn from all_objects where rownum<=xx;

从all_objects等系统视图中去获取序列的方式,虽然简单,但有一个致命的弱点是该视图的sql非常复杂,嵌套层数很多,一旦应用到真实案例中,极有可能碰到Oracle自身的bug,所以这种方式不考虑,直接pass掉。

2、9i之后,我们用connect by

select rownum rn from dual connect by rownum<=xx;

3、自从10g开始支持XML后,还可以使用以下方式:

select rownum rn from xmltable(&lsquo;1 to xx&rsquo;);

接下来我们从序列大小,构造时间等方面对比分析这两种方式。

1、先看connect by的方法

lastwinner@lw> select count(*) from (select rownum rn from dual connect by rownum<=power(2,19));  COUNT(*)  &mdash;&mdash;&mdash;-  524288  已用时间: 00: 00: 00.20  lastwinner@lw> select count(*) from (select rownum rn from dual connect by rownum<=power(2,20));  select count(*) from (select rownum rn from dual connect by rownum<=power(2,20))  *  第 1 行出现错误:  ORA-30009: CONNECT BY 操作内存不足

可见直接用connect by去构造较大的序列时,消耗的资源很多,速度也快不到哪儿去。实际上2^20并不是一个很大的数字,就是1M而已。

但xmltable方式就不会耗这么多资源

lastwinner@lw> select count(*) from (select rownum rn from xmltable(&lsquo;1 to 1048576&rsquo;));  COUNT(*)  &mdash;&mdash;&mdash;-  1048576  已用时间: 00: 00: 00.95

其实除了上述三种办法,我们还可以使用笛卡尔积来构造序列。如果换成笛卡尔连接的方式,那么构造2^20时,connect by也ok

lastwinner@lw> with a as (select rownum rn from dual connect by rownum<=power(2,10))  2 select count(*) from (select rownum rn from a, a);  COUNT(*)  &mdash;&mdash;&mdash;-  1048576  已用时间: 00: 00: 00.09

我们试着将1M加大到1G,在connect by方式下

lastwinner@lw> with a as (select rownum rn from dual connect by rownum<=power(2,10))  2 select count(*) from (select rownum rn from a, a, a);  COUNT(*)  &mdash;&mdash;&mdash;-  1073741824  已用时间: 00: 01: 07.37

耗时高达1分钟还多,再看看xmltable方式,考虑到1M的时候耗时就达到0.95秒,因此这里只测试1/16*1G,即64M的情况

lastwinner@lw> select count(*) from (select rownum rn from xmltable(&lsquo;1 to 67108864&rsquo;));  COUNT(*)  &mdash;&mdash;&mdash;-  67108864  已用时间: 00: 00: 37.00

如果直接构造到1G,那么时间差不多是16*37s这个级别。

但如果通过笛卡尔积+xmltable的方式来构造。

lastwinner@lw> select count(*) from (select rownum rn from xmltable(&lsquo;1 to 67108864&rsquo;));  COUNT(*)  &mdash;&mdash;&mdash;-  67108864  已用时间:  00: 00: 37.00

这时间和connect by的差不多。以上测试,总的可见,在构造较大序列时,笛卡尔积的方式是***的,单纯使用connect  by会遭遇内存不足,而单独使用xmltable则会耗费较多的时间。

现在再看看基本用纯表连接的方式来构造同样大小的序列,先来1M的

lastwinner@lw> with b as (select 1 r from dual uNIOn all select 2 from dual),  2  c as (select rownum r from b,b,b,b,b,  3  b,b,b,b,b,  4  b,b,b,b,b,  5  b,b,b,b,b)  6  select count(*) from c;  COUNT(*)  &mdash;&mdash;&mdash;-  1048576  已用时间:  00: 00: 00.33

再来64M的

lastwinner@lw> ed  已写入 file afiedt.buf  1  with b as (select 1 r from dual union all select 2 from dual),  2  c as (select rownum r from b,b,b,b,b,  3  b,b,b,b,b,  4  b,b,b,b,b,  5  b,b,b,b,b,  6  b,b,b,b,b,b)  7* select count(*) from c  lastwinner@lw> /  COUNT(*)  &mdash;&mdash;&mdash;-  67108864  已用时间:  00: 00: 16.62

这个速度并不快,但已经比直接xmltable快了。

其实64M,即64*2^20可以表示为(2^5)^5*2,那我们来改写一下64M的sql

lastwinner@lw> with b as (select 1 r from dual union all select 2 from dual),  2  c as (select rownum r from b,b,b,b,b),  3  d as (select rownum r from c,c,c,c,c,b)  4  select count(*) from d;  COUNT(*)  &mdash;&mdash;&mdash;-  67108864  已用时间:  00: 00: 04.53

可以看到,从16s到4s,已经快了很多。这个示例告诉我们,中间表c 在提高速度方面起到了很好的作用。

但在构造到1G时,还是要慢一些

lastwinner@lw> ed  已写入 file afiedt.buf  1  with b as (select 1 r from dual union all select 2 from dual),  2  c as (select rownum r from b,b,b,b,b),  3  d as (select rownum r from c,c,c,c,c,c)  4* select count(*) from d  lastwinner@lw> /  COUNT(*)  &mdash;&mdash;&mdash;-  1073741824  已用时间:  00: 01: 11.48

尝试相对较快的写法,多一层中间表

lastwinner@lw> ed  已写入 file afiedt.buf  1  with b as (select 1 r from dual union all select 2 from dual),  2  c as (select rownum r from b,b,b),  3  d as (select rownum r from c,c,c),  4  e as (select rownum r from d,d,d,c)  5* select count(*) from e  lastwinner@lw> /  COUNT(*)  &mdash;&mdash;&mdash;-  1073741824  已用时间:  00: 01: 06.89

更快一点(思路,32^2=1024, 1G=2^30=(2^5)^6=((2^5)^2)^3 。)

lastwinner@lw> ed  已写入 file afiedt.buf  1  with b as (select 1 r from dual union all select 2 from dual),  2  c as (select rownum r from b,b,b,b,b),  3  d as (select rownum r from c,c),  4  e as (select rownum r from d,d,d)  5* select count(*) from e  lastwinner@lw> /  COUNT(*)  &mdash;&mdash;&mdash;-  1073741824  已用时间:  00: 01: 05.21

这时候我们将2^5=32换成直接构造出来的方式

lastwinner@lw> ed  已写入 file afiedt.buf  1  with b as (select rownum r from dual connect by rownum<=power(2,5)),  2  c as (select rownum r from b,b),  3  d as (select rownum r from c,c,c)  4* select count(*) from d  lastwinner@lw> /  COUNT(*)  &mdash;&mdash;&mdash;-  1073741824  已用时间:  00: 01: 05.07

可见所耗费的时间差不多。

由此我们还可以得出,表连接的代价其实也是昂贵的,适当的减少表连接的次数,适当的使用with里的中间表,能有效提高系统性能。

再重复一下刚才构造64M(2^26)的场景

lastwinner@lw> ed  已写入 file afiedt.buf  1  with b as (select 1 r from dual union all select 2 from dual),  2  c as (select rownum r from b,b,b,b,b,  3  b,b,b,b,b,  4  b,b,b,b,b,  5  b,b,b,b,b,  6  b,b,b,b,b,b)  7* select count(*) from c  lastwinner@lw> /  COUNT(*)  &mdash;&mdash;&mdash;-  67108864  已用时间:  00: 00: 16.62

总共25次的表连接,1层嵌套,让速度非常慢。提高一下(26=4*3*2+2*2),总共8次表连接,3层嵌套。

lastwinner@lw> ed  已写入 file afiedt.buf  1  with b as (select 1 r from dual union all select 2 from dual),  2  c as (select rownum r from b,b,b,b),  3  d as (select rownum r from c,c,c),  4  e as (select rownum r from d,d,b,b)  5* select count(*) from e  lastwinner@lw> /  COUNT(*)  &mdash;&mdash;&mdash;-  67108864  已用时间:  00: 00: 04.00

效率提升4倍。要注意在这个案例中并非表连接越少越好,嵌套层数也是需要关注的指标。执行计划有兴趣的同学自己去看吧,我就不列了,上例中,系统生成的中间表有3个。

最终结论,构造较大序列时,例如同样是构造出64M的序列,oracle在处理时,用表连接的方式明显占优。但考虑到书写的便利性,因此在构造较小序列的时候,比如不超过1K的序列,那么直接用connect  by或xmltable的方式就好了。

附:newkid 回复方法,表示更灵活,有兴趣的同学可以尝试:

create or replace function generator (n pls_integer) return sys.odcinumberlist pipelined is m pls_integer := trunc(n / 10); r pls_integer := n &ndash; 10 * m; begin for i in 1 .. m loop pipe row (null); pipe row (null); pipe row (null); pipe row (null); pipe row (null); pipe row (null); pipe row (null); pipe row (null); pipe row (null); pipe row (null); end loop; for i in 1 .. r loop pipe row (null); end loop; end; / alter function generator compile plsql_code_type = native;  SQL> select count(*) from table(generator(67108864));  COUNT(*) &mdash;&mdash;&mdash;- 67108864  Elapsed: 00:00:06.68  SQL> with b as (select 1 r from dual union all select 2 from dual), 2  c as (select rownum r from b,b,b,b), 3  d as (select rownum r from c,c,c), 4  e as (select rownum r from d,d,b,b) 5  select count(*) from e;  COUNT(*) &mdash;&mdash;&mdash;- 67108864  Elapsed: 00:00:06.32

以上就是Oracle中怎么构造序列,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网数据库频道。

您可能感兴趣的文档:

--结束END--

本文标题: Oracle中怎么构造序列

本文链接: https://www.lsjlt.com/news/57813.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Oracle中怎么构造序列
    本篇文章给大家分享的是有关Oracle中怎么构造序列,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Oracle构造序列的方法随着版本一直在变化...
    99+
    2024-04-02
  • Python中怎么构造一个列表
    Python中怎么构造一个列表,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Python构造列表语法代码示例:#!/usr/bin/env python  ...
    99+
    2023-06-17
  • 刷题系列 - 中序和后序遍历队列,构造对应二叉树;
    假期继续刷题,也没有别的什么事情可以干。这个题是给出中序和后序遍历队列,构造对应二叉树;题目很简单,如下图,给出两个遍历队列,构成二叉树,这里假定没有重复点。 想了好几天,真是惭愧,因为一直想一次遍历就完成构造,最后发现不行;然后...
    99+
    2023-06-02
  • 刷题系列 - 给出前序和中序遍历队列,构造对应二叉树
    既然中序和后序队列构成二叉树写了,就把前序和中序一做吧。原理其实也很简单,前序队列第一个点就是根节点,再中序队列里面这个根节点可以分出左右两个树的两个中序队列,然后可以按照左右树的节点数量,再前序节点里面分出对应两组前序队列;然后反复递归即...
    99+
    2023-06-02
  • JavaScript中怎么序列化链式结构
    这篇文章给大家介绍JavaScript中怎么序列化链式结构,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、概述在JavaScript中,链式模式代码,太多太多,如下:if_else:...
    99+
    2024-04-02
  • 一道php反序列化题的pop链构造
    题目地址为:GitHub - mcc0624/php_ser_Class: php反序列化靶场 点击进入如下题 题目代码如下,其中像套娃一样,多次对魔术方法进行调用,挺烧脑。根据题目,显然目标是echo $flag 像这种题,需要使...
    99+
    2023-09-04
    php反序列化题 ctf pop链构造
  • CTF-PHP反序列化漏洞3-构造POP链
    作者:Eason_LYC 悲观者预言失败,十言九中。 乐观者创造奇迹,一次即可。 一个人的价值,在于他所拥有的。可以不学无术,但不能一无所有! 技术领域:WEB安全、网络攻防 关注WEB安全、网络...
    99+
    2023-10-09
    php 开发语言 web安全 反序列化漏洞 pop链
  • python列表的构造方法list()怎么用
    这篇文章主要介绍“python列表的构造方法list()怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python列表的构造方法list()怎么用”文章能帮助大家解决问题。首先看看列表的构造:...
    99+
    2023-06-29
  • C语言数据结构顺序表怎么构造
    本篇内容介绍了“C语言数据结构顺序表怎么构造”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!前言在学习链表之前先掌握顺序表什么是顺序表?顺序表...
    99+
    2023-06-30
  • 小程序的Page构造器怎么用
    这篇文章主要介绍“小程序的Page构造器怎么用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“小程序的Page构造器怎么用”文章能帮助大家解决问题。  程序与页面  你可以观察到 pages/logs...
    99+
    2023-06-26
  • typescript实用程序类型怎么构造
    本文小编为大家详细介绍“typescript实用程序类型怎么构造”,内容详细,步骤清晰,细节处理妥当,希望这篇“typescript实用程序类型怎么构造”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,...
    99+
    2024-04-02
  • C#中怎么构造函数
    本篇内容介绍了“C#中怎么构造函数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!C#构造函数大体上分为静态C#构造函数和实例C#构造函数,实...
    99+
    2023-06-18
  • Oracle中怎么对VARCHAR列进行排序
    在Oracle中,可以使用ORDER BY子句对VARCHAR列进行排序。例如: SELECT column_name FR...
    99+
    2024-04-09
    Oracle
  • oracle怎么更新序列值
    要更新Oracle序列的值,可以使用以下步骤: 使用ALTER SEQUENCE语句来修改序列的属性,包括INCREMENT BY...
    99+
    2024-04-09
    oracle
  • oracle怎么查询序列号
    oracle查询序列号方法:1、连接到Oracle数据库,使用SQL Plus工具或其他支持连接Oracle数据库的工具来实现;2、编写查询语句,查询序列号的当前值,查询指定序列的当前值,查询序列号的下一个值,查询指定序列的下一个值即可;3...
    99+
    2023-08-03
  • php反序列化pop链构造知识点有哪些
    本篇内容主要讲解“php反序列化pop链构造知识点有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php反序列化pop链构造知识点有哪些”吧!pop链构造一般的反序列化题目,存在漏洞或者能注...
    99+
    2023-06-30
  • HTML入门:有序列表篇,打造结构化内容
    HTML 有序列表基础知识 HTML 有序列表是用于在网页中以有序的方式显示一组相关项目的列表。有序列表中的项目通常使用数字或字母作为序号,以表示它们的顺序。有序列表的 HTML 标签是 <ol>,而列表中的每个项目则使用 &...
    99+
    2024-02-02
    HTML 有序列表 网页 设计 SEO
  • Oracle中的小序列
        话说序列很少人知道,因为Mysql和sql server都有自动增长字段(如ID主键自动增长的整数),而Oracle却没有提供该用法,那么Oracle提供了更...
    99+
    2024-04-02
  • oracle rac序列乱怎么办
    小编给大家分享一下oracle rac序列乱怎么办,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!sequence创建方法:CRE...
    99+
    2024-04-02
  • 微信小程序Component构造器怎么用
    小编给大家分享一下微信小程序Component构造器怎么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!  Component构造器可用于定义组件,调用Compo...
    99+
    2023-06-26
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作