楼主: lastwinner

[原创] 几种构造序列的方法比较

[复制链接]
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
11#
发表于 2013-6-15 00:05 | 只看该作者
如果不是10的整数幂, 时间是:

WITH
   E1(N) AS (
             SELECT 1 FROM DUAL CONNECT BY LEVEL<=10
            ),                          -- 1*10^1 or 10 rows
   E2(N) AS (SELECT 1 FROM E1 a, E1 b), -- 1*10^2 or 100 rows
   E4(N) AS (SELECT 1 FROM E2 a, E2 b), -- 1*10^4 or 10,000 rows
   E8(N) AS (SELECT 1 FROM E4 a, E4 b)  -- 1*10^8 or 100,000,000 rows
SELECT COUNT(*) FROM (SELECT * FROM E8 WHERE ROWNUM<=POWER(2,26))
;

  COUNT(*)
----------
  67108864

Elapsed: 00:00:07.41
和一亿差不多。

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
12#
 楼主| 发表于 2013-6-15 00:28 | 只看该作者
〇〇 发表于 2013-6-14 18:39
打印出执行计划的实际成本

sql太多,贴出来太费页面,所以就不贴了

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
13#
 楼主| 发表于 2013-6-15 00:35 | 只看该作者
lugionline 发表于 2013-6-14 23:09
tally table?
http://www.sqlservercentral.com/articles/T-SQL/74118/

好久不见,呵呵
sqlserver不了解的说

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
14#
 楼主| 发表于 2013-6-15 00:44 | 只看该作者
newkid 发表于 2013-6-14 21:43
贴个PLSQL函数,以前从jonathan lewis博客看来的,只比你的方法慢一点点但是更灵活:

create or replace ...

他这个方法应该还可以更快,比如除以100
核心思路就是增加嵌套层数,减少最直接的循环次数,从而提高效率

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
15#
发表于 2013-6-15 02:52 | 只看该作者
改100后也差不多:

create or replace function generator (n pls_integer) return sys.odcinumberlist pipelined is
  m pls_integer := trunc(n / 100);
  r pls_integer := n - 100 * m;
begin
  for i in 1 .. m loop
  FOR j IN 1..10 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;
  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(*)
----------
  67108864

Elapsed: 00:00:07.10

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
16#
发表于 2013-6-15 14:11 | 只看该作者
不错!~

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
17#
发表于 2013-6-15 22:10 | 只看该作者
搂主,你好像还掉了两种 MODEL 和 RECURSIVE WITH
我自己收集的有5种,现在,加NEWKid的自定义,就是6种了

--1. by japan
select level n from dual connect by level <=10;


--2. by tomkyte
select rownum n from all_objects where rownum<=10;


--3.
select to_number(column_value) n from xmltable('1 to 10');


--4. model
select n
  from (select 1 v from dual)
model
   dimension by (v)
   measures (v n)
   rules
   (
     n[for v from 2 to 10 increment 1] = n[cv(v)-1] + 1               
   );

   
--5. recursive with
with t(n) as
(
  select 1 from dual
  union all
  select n + 1 from t where n < 10
)
select n from t

使用道具 举报

回复
论坛徽章:
484
ITPUB北京香山2007年会纪念徽章
日期:2007-01-24 14:35:02ITPUB北京九华山庄2008年会纪念徽章
日期:2008-01-21 16:50:24ITPUB北京2009年会纪念徽章
日期:2009-02-09 11:42:452010新春纪念徽章
日期:2010-03-01 11:04:552010数据库技术大会纪念徽章
日期:2010-05-13 10:04:272010系统架构师大会纪念
日期:2010-09-04 13:35:54ITPUB9周年纪念徽章
日期:2010-10-08 09:28:512011新春纪念徽章
日期:2011-02-18 11:43:32ITPUB十周年纪念徽章
日期:2011-11-01 16:19:412012新春纪念徽章
日期:2012-01-04 11:49:54
18#
 楼主| 发表于 2013-6-16 14:37 | 只看该作者
solomon_007 发表于 2013-6-15 22:10
搂主,你好像还掉了两种 MODEL 和 RECURSIVE WITH
我自己收集的有5种,现在,加NEWKid的自定义,就是6种了 ...

那俩我不会

使用道具 举报

回复
论坛徽章:
548
生肖徽章2007版:猴
日期:2008-05-16 11:28:59生肖徽章2007版:马
日期:2008-10-08 17:01:01SQL大赛参与纪念
日期:2011-04-13 12:08:17授权会员
日期:2011-06-17 16:14:53ITPUB元老
日期:2011-06-21 11:47:01ITPUB官方微博粉丝徽章
日期:2011-07-01 09:45:27ITPUB十周年纪念徽章
日期:2011-09-27 16:30:472012新春纪念徽章
日期:2012-01-04 11:51:222012新春纪念徽章
日期:2020-11-30 22:13:24海蓝宝石
日期:2012-02-20 19:24:27
19#
发表于 2013-6-16 15:15 | 只看该作者
lastwinner 发表于 2013-6-16 14:37
那俩我不会

你太谦虚了!为了便于记忆收藏,我特意给你打了个包!

create or replace package pkg_serial is
  procedure sp_japan;
  procedure sp_tomkyte;
  procedure sp_xml;
  procedure sp_model;
  procedure sp_with;
  procedure sp_table;
  
  function generator (n pls_integer)
  return sys.odcinumberlist
  pipelined;
end;
/

create or replace package body pkg_serial is

  --1.
  procedure sp_japan is
    cursor cur is
      select level n from dual connect by level <= 10;
  begin
    for rec in cur loop
      dbms_output.put_line(rec.n);
    end loop;
  end;

  --2.
  procedure sp_tomkyte is
    cursor cur is
      select rownum n from all_objects where rownum <= 10;
  begin
    for rec in cur loop
      dbms_output.put_line(rec.n);
    end loop;
  end;

  --3.
  procedure sp_xml is
    cursor cur is
      select to_number(column_value) n from xmltable('1 to 10');
  begin
    for rec in cur loop
      dbms_output.put_line(rec.n);
    end loop;
  end;

  --4.
  procedure sp_model is
    cursor cur is
      select n
        from (select 1 v from dual)
       model
             dimension by (v)
             measures (v n)
             rules
             (
                n[for v from 2 to 10 increment 1] = n[cv(v)-1] + 1               
             );
  begin
    for rec in cur loop
      dbms_output.put_line(rec.n);
    end loop;
  end;

  --5.
  procedure sp_with is
    cursor cur is
      with t(n) as
      (
         select 1 from dual
          union all
         select n + 1 from t where n < 10
       )
       select n from t;  
  begin
    for rec in cur loop
      dbms_output.put_line(rec.n);
    end loop;
  end;


  function generator (n pls_integer)
  return sys.odcinumberlist
  pipelined
  is
  begin
    for i in 1..n loop
      pipe row(i);
    end loop;
    return;
  end;

  --6.
  procedure sp_table is
    --alter function generator compile plsql_code_type = native;
    cursor cur is
      select column_value n from table(generator(10));
     
  begin
    for rec in cur loop
      dbms_output.put_line(rec.n);
    end loop;
  end;

end pkg_serial;
/

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
20#
发表于 2013-6-16 15:56 | 只看该作者
既然写了存储过程,那么普通for循环也可

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表