楼主: lastwinner

[精华] sql求解200万内质数各种算法点评

[复制链接]
论坛徽章:
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
41#
发表于 2014-3-29 12:43 | 只看该作者
lastwinner 发表于 2014-3-29 12:33
要这样说,那pl/sql里你采取小批量处理的策略,而不是一个一个去处理,会快更多

学newkid的办法:先保存在数组,再一次性插入表

使用道具 举报

回复
论坛徽章:
22
奥运会纪念徽章:马术
日期:2013-02-17 16:10:59奥运会纪念徽章:射击
日期:2013-03-11 14:17:07奥运会纪念徽章:羽毛球
日期:2013-03-18 14:45:35奥运会纪念徽章:举重
日期:2013-03-18 14:45:35奥运会纪念徽章:击剑
日期:2013-03-18 14:45:35奥运会纪念徽章:垒球
日期:2013-03-18 14:45:35奥运会纪念徽章:体操
日期:2013-03-27 16:57:50奥运会纪念徽章:垒球
日期:2013-04-27 15:03:482014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02
42#
发表于 2014-4-1 13:34 | 只看该作者
膜拜.... 各位ORACLE的前辈.

使用道具 举报

回复
求职 : 数据库管理员
论坛徽章:
7
优秀写手
日期:2014-05-30 05:59:14马上有车
日期:2014-02-18 16:50:092014年新春福章
日期:2014-02-18 16:50:09itpub13周年纪念徽章
日期:2014-10-08 15:15:25itpub13周年纪念徽章
日期:2014-10-08 15:15:25秀才
日期:2015-07-29 16:51:15秀才
日期:2015-11-11 10:52:26
43#
发表于 2014-5-21 17:30 | 只看该作者
厉害

使用道具 举报

回复
论坛徽章:
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
44#
发表于 2014-5-22 15:08 | 只看该作者
下面准备测试一下varray和index by table的性能差别

使用道具 举报

回复
论坛徽章:
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
45#
发表于 2014-5-22 15:21 | 只看该作者
〇〇 发表于 2014-5-22 15:08
下面准备测试一下varray和index by table的性能差别

稀疏index by table和删除节点后性能不相上下
SQL> exec pkg_newkid.LT(2000000)
148933
已用时间:  00: 00: 00.95
SQL> select count(case pkg_newkid.isprimLT(level)when 1 then 1 end) from dual connect by level<=1e5;

COUNT(CASEPKG_NEWKID.ISPRIMLT(LEVEL)WHEN1THEN1END)
--------------------------------------------------
                                              9592
已用时间:  00: 00: 00.33
SQL> c/5/6
  1* select count(case pkg_newkid.isprimLT(level)when 1 then 1 end) from dual connect by level<=1e6
SQL> /

COUNT(CASEPKG_NEWKID.ISPRIMLT(LEVEL)WHEN1THEN1END)
--------------------------------------------------
                                             78498
已用时间:  00: 00: 03.40
SQL> exec pkg_newkid.newkid(2000000)
已用时间:  00: 00: 00.89
SQL> select count(case pkg_newkid.isprim(level)when 1 then 1 end) from dual connect by level<=1e5;

COUNT(CASEPKG_NEWKID.ISPRIM(LEVEL)WHEN1THEN1END)
------------------------------------------------
                                            9592
已用时间:  00: 00: 00.36
SQL> select count(case pkg_newkid.isprim(level)when 1 then 1 end) from dual connect by level<=1e6;

COUNT(CASEPKG_NEWKID.ISPRIM(LEVEL)WHEN1THEN1END)
------------------------------------------------
                                           78498
已用时间:  00: 00: 03.57

使用道具 举报

回复
论坛徽章:
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
46#
发表于 2014-5-22 15:30 | 只看该作者
〇〇 发表于 2014-5-22 15:21
稀疏index by table和删除节点后性能不相上下
SQL> exec pkg_newkid.LT(2000000)
148933

varray与index by table的区别也几乎没有
SQL> exec pkg_newkid.LTV(2000000)
148933
已用时间:  00: 00: 01.06
SQL> select count(case pkg_newkid.isprimLTV(level)when 1 then 1 end) from dual connect by level<=1e5;

COUNT(CASEPKG_NEWKID.ISPRIMLTV(LEVEL)WHEN1THEN1END)
---------------------------------------------------
                                               9592
已用时间:  00: 00: 00.34
SQL> c/5/6
  1* select count(case pkg_newkid.isprimLTV(level)when 1 then 1 end) from dual connect by level<=1e6
SQL> /

COUNT(CASEPKG_NEWKID.ISPRIMLTV(LEVEL)WHEN1THEN1END)
---------------------------------------------------
                                              78498
已用时间:  00: 00: 03.37

使用道具 举报

回复
论坛徽章:
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
47#
发表于 2014-5-22 15:31 | 只看该作者
〇〇 发表于 2014-5-22 15:30
varray与index by table的区别也几乎没有
SQL> exec pkg_newkid.LTV(2000000)
148933

create or replace package pkg_newkid is
  TYPE t_row IS TABLE OF BINARY_INTEGER;
  V_RESULT T_row:=t_row();
V_RESULT2 T_row:=t_row();
type ty_i is varray(10000000) of int;
V_RESULT3 ty_i:=ty_i();
  function isprim (n number )
  return number;
  function isprimLT (n number )
  return number;
  function isprimLTV (n number )
  return number;
  
  PROCEDURE NEWKID(X IN NUMBER);
PROCEDURE LT(U IN NUMBER)  ;
PROCEDURE LTV(U IN NUMBER)  ;
end;
/
create or replace package body pkg_newkid is --用质数表

PROCEDURE NEWKID(X IN NUMBER) AS
  I NUMBER DEFAULT 1;
  J NUMBER DEFAULT 0;
  C NUMBER DEFAULT 1;
  lv_limit NUMBER := x;
  lv_upper1 NUMBER := (SQRT(lv_limit)-1)/2;
  lv_upper2 NUMBER := lv_limit/2-1;
  lv_step BINARY_INTEGER;
BEGIN
    v_result.EXTEND(lv_upper2);
    while i<lv_upper1 loop
          lv_step := i*2+1;
          j:=2*i*(i+1);
          while j<=lv_upper2 loop
                v_result.DELETE(j);
                j:=j+lv_step;
          end loop;
          i := v_result.NEXT(i);
    end loop;
END;

PROCEDURE LT(U IN NUMBER)  
AS  
   I NUMBER DEFAULT 3;  
   J NUMBER DEFAULT 0;  
   C NUMBER DEFAULT 1;  
BEGIN  
  v_result2.EXTEND(U);  
  while(i<sqrt(U)) loop  
if v_result2(i)=1 then --利用已经计算出的质数表
     goto n;  
   end if;  
   j:=i*(i-2);  
   while (j<U) loop  
    v_result2(j):=1;  
    j:=J+i+i;  
   end loop;  
   <<n>>  
   I:=i+2;  
  end loop;  
  for j in 1 .. U/2 loop  
if v_result2(j+j-1)is null then --只判断奇数
  c:=c+1;  
  end if;  
  end loop;  
  DBMS_OUTPUT.PUT_LINE(c);  
END;

PROCEDURE LTV(U IN NUMBER)  
AS  
   I NUMBER DEFAULT 3;  
   J NUMBER DEFAULT 0;  
   C NUMBER DEFAULT 1;  
BEGIN  
  v_result3.EXTEND(U);  
  while(i<sqrt(U)) loop  
if v_result3(i)=1 then --利用已经计算出的质数表
     goto n;  
   end if;  
   j:=i*(i-2);  
   while (j<U) loop  
    v_result3(j):=1;  
    j:=J+i+i;  
   end loop;  
   <<n>>  
   I:=i+2;  
  end loop;  
  for j in 1 .. U/2 loop  
if v_result3(j+j-1)is null then --只判断奇数
  c:=c+1;  
  end if;  
  end loop;  
  DBMS_OUTPUT.PUT_LINE(c);  
END;

function isprim (n number )
return number
is
begin
if n=2 then
return 1;
elsif mod(n,2)=0  then
return 0;
elsif v_result.exists((n-1)/2) then
return 1;
end if;
return 0;
end;

function isprimLT (n number )
return number
is
begin
if n=2 then
return 1;
elsif mod(n,2)=0  then
return 0;
elsif v_result2(n)is null then
return 1;
end if;
return 0;
end;

function isprimLTV (n number )
return number
is
begin
if n=2 then
return 1;
elsif mod(n,2)=0  then
return 0;
elsif v_result3(n)is null then
return 1;
end if;
return 0;
end;
end;
/

使用道具 举报

回复
论坛徽章:
0
48#
发表于 2014-5-22 19:29 | 只看该作者
不觉明历!

使用道具 举报

回复
论坛徽章:
6
秀才
日期:2015-07-14 09:44:30秀才
日期:2015-07-28 09:11:43巨蟹座
日期:2015-12-22 23:17:51白羊座
日期:2016-01-17 22:36:152016猴年福章
日期:2016-02-18 09:31:30奥运会纪念徽章:篮球
日期:2016-09-08 22:13:34
49#
发表于 2015-7-5 19:47 | 只看该作者
分析问题循序渐进~慢慢学了

使用道具 举报

回复
论坛徽章:
59
优秀写手
日期:2015-02-12 06:00:132016猴年福章
日期:2016-02-23 09:58:34猴赛雷
日期:2016-02-23 10:04:24紫水晶
日期:2016-04-01 12:19:28双子座
日期:2016-04-28 10:19:29秀才
日期:2016-06-23 14:15:06奥运会纪念徽章:曲棍球
日期:2016-08-30 13:12:24奥运会纪念徽章:体操
日期:2016-09-26 11:24:37妮可·罗宾
日期:2016-10-25 13:54:46娜美
日期:2017-04-28 10:45:33
50#
发表于 2015-7-6 13:14 | 只看该作者
看完这个帖子,我只想说,,,哪位版主收徒?

使用道具 举报

回复

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

本版积分规则 发表回复

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