|
这样下去是不行的
SQL> 18
18* ,k as (select level l from dual connect by level<=1000)
SQL> c/1000/1E4
18* ,k as (select level l from dual connect by level<=1E4)
SQL> /
COUNT(L)
----------
811
已选择 1 行。
已用时间: 00: 00: 00.81
SQL> 18
18* ,k as (select level l from dual connect by level<=1E4)
SQL> c/4/5
18* ,k as (select level l from dual connect by level<=1E5)
SQL> /
COUNT(L)
----------
9280
已选择 1 行。
已用时间: 00: 00: 07.75
加了约束条件也没什么用
SQL> var m number
SQL> exec :m:=1000
PL/SQL 过程已成功完成。
已用时间: 00: 00: 00.00
SQL> WITH
2 t as(SELECT 2*ROWNUM+1 rn FROM DUAL CONNECT BY ROWNUM <= CEIL(((:n)/2-1-1)/2)
3 )
4 ,p AS (
5 SELECT pn,LOG(10,pn) lg
6 FROM (
7 SELECT 2 pn FROM DUAL
8 UNION ALL
9 SELECT rn pn from t
10 MINUS
11 SELECT t1.rn * t2.rn
12 FROM t t1, t t2
13 WHERE t1.rn <= t2.rn
14 AND t1.rn <=SQRT(:n)
15 AND t1.rn * t2.rn <:n/2
16 )
17 )
18 ,k as (select level l from dual connect by level<=:m)
19 select count(l) from k where exists(select 1 from p p1,p p2,p p3,p p4
20 where
21 p2.pn<:m/p1.pn and
22 p3.pn<:m/p1.pn/p2.pn and
23 p4.pn<:m/p1.pn/p2.pn/p3.pn and
24 mod(l,p1.pn) =0 and
25 mod(l,p2.pn) =0 and mod(l,p3.pn) =0 and mod(l,p4.pn) =0
26 and p1.pn<p2.pn and p2.pn<p3.pn and p3.pn<p4.pn);
COUNT(L)
----------
23
已选择 1 行。
已用时间: 00: 00: 00.11
SQL> exec :m:=1e4
PL/SQL 过程已成功完成。
已用时间: 00: 00: 00.00
SQL> /
COUNT(L)
----------
811
已选择 1 行。
已用时间: 00: 00: 00.92
SQL> exec :m:=1e5
PL/SQL 过程已成功完成。
已用时间: 00: 00: 00.01
SQL> /
COUNT(L)
----------
9280
已选择 1 行。
已用时间: 00: 00: 08.88
SQL> WITH
2 t as(SELECT 2*ROWNUM+1 rn FROM DUAL CONNECT BY ROWNUM <= CEIL(((:n)/2-1-1)/2)
3 )
4 ,p AS (
5 SELECT pn,LOG(10,pn) lg
6 FROM (
7 SELECT 2 pn FROM DUAL
8 UNION ALL
9 SELECT rn pn from t
10 MINUS
11 SELECT t1.rn * t2.rn
12 FROM t t1, t t2
13 WHERE t1.rn <= t2.rn
14 AND t1.rn <=SQRT(:n)
15 AND t1.rn * t2.rn <:n/2
16 )order by pn
17 )
18 ,k as (select level l from dual connect by level<=:m)
19 select count(l) from k where exists(select 1 from p p1,p p2,p p3,p p4
20 where
21 p2.pn<:m/p1.pn and
22 p3.pn<:m/p1.pn/p2.pn and
23 p4.pn<:m/p1.pn/p2.pn/p3.pn and
24 mod(l,p1.pn) =0 and
25 mod(l,p2.pn) =0 and mod(l,p3.pn) =0 and mod(l,p4.pn) =0
26 and p1.pn<p2.pn and p2.pn<p3.pn and p3.pn<p4.pn);
COUNT(L)
----------
9280
已选择 1 行。
已用时间: 00: 00: 08.85
SQL> create table p as WITH
2 t as(SELECT 2*ROWNUM+1 rn FROM DUAL CONNECT BY ROWNUM <= CEIL(((:n)/2-1-1)/2)
3 )SELECT pn,LOG(10,pn) lg
4 FROM (
5 SELECT 2 pn FROM DUAL
6 UNION ALL
7 SELECT rn pn from t
8 MINUS
9 SELECT t1.rn * t2.rn
10 FROM t t1, t t2
11 WHERE t1.rn <= t2.rn
12 AND t1.rn <=SQRT(:n)
13 AND t1.rn * t2.rn <:n/2
14 )order by pn;
FROM t t1, t t2
*
第 10 行出现错误:
ORA-01027: 在数据定义操作中不允许有绑定变量
加了索引也只提高了1倍
已用时间: 00: 00: 00.00
SQL> create table p as
2 with
3 t as(SELECT 2*ROWNUM+1 rn FROM DUAL CONNECT BY ROWNUM <= CEIL(((200)/2-1-1)/2)
4 )
5 SELECT pn,LOG(10,pn) lg
6 FROM (
7 SELECT 2 pn FROM DUAL
8 UNION ALL
9 SELECT rn pn from t
10 MINUS
11 SELECT t1.rn * t2.rn
12 FROM t t1, t t2
13 WHERE t1.rn <= t2.rn
14 AND t1.rn <=SQRT(200)
15 AND t1.rn * t2.rn <200/2
16 )order by pn;
表已创建。
已用时间: 00: 00: 00.04
SQL> create index ppn on p(pn);
索引已创建。
已用时间: 00: 00: 00.02
SQL> with k as (select level l from dual connect by level<=:m)
2 select count(l) from k where exists(select 1 from p p1,p p2,p p3,p p4
3 where
4 p2.pn<:m/p1.pn and
5 p3.pn<:m/p1.pn/p2.pn and
6 p4.pn<:m/p1.pn/p2.pn/p3.pn and
7 mod(l,p1.pn) =0 and
8 mod(l,p2.pn) =0 and mod(l,p3.pn) =0 and mod(l,p4.pn) =0
9 and p1.pn<p2.pn and p2.pn<p3.pn and p3.pn<p4.pn);
COUNT(L)
----------
9280
已选择 1 行。
已用时间: 00: 00: 04.25
SQL> |
|