|
|
Re: 不知道这是否可以给大家一个提示?
最初由 biti_rainy 发布
[B]SQL> declare
2 n1 number;
3 n2 number;
4 n3 number;
5 n4 number;
6 n number;
7 begin
8
9 n1 := dbms_utility.get_time;
10 for i in 1..1000 loop
11 select /*+RULE*/ q.OBJECT_ID into n
12 from q,q1,q2,q3,q4,q5,q6,q7,q8,q9,q0
13 where q.OBJECT_NAME = q1.OBJECT_NAME
14 and q.OBJECT_NAME = q1.OBJECT_NAME
15 and q1.OBJECT_NAME = q2.OBJECT_NAME
16 and q2.OBJECT_NAME = q3.OBJECT_NAME
17 and q3.OBJECT_NAME = q4.OBJECT_NAME
18 and q4.OBJECT_NAME = q5.OBJECT_NAME
19 and q5.OBJECT_NAME = q6.OBJECT_NAME
20 and q6.OBJECT_NAME = q7.OBJECT_NAME
21 and q7.OBJECT_NAME = q8.OBJECT_NAME
22 and q8.OBJECT_NAME = q9.OBJECT_NAME
23 and q9.OBJECT_NAME = q0.OBJECT_NAME;
24 end loop;
25 n2 := dbms_utility.get_time;
26 for i in 1..1000 loop
27 select /*+first_rows*/ q.OBJECT_ID into n
28 from q,q1,q2,q3,q4,q5,q6,q7,q8,q9,q0
29 where q.OBJECT_NAME = q1.OBJECT_NAME
30 and q.OBJECT_NAME = q1.OBJECT_NAME
31 and q1.OBJECT_NAME = q2.OBJECT_NAME
32 and q2.OBJECT_NAME = q3.OBJECT_NAME
33 and q3.OBJECT_NAME = q4.OBJECT_NAME
34 and q4.OBJECT_NAME = q5.OBJECT_NAME
35 and q5.OBJECT_NAME = q6.OBJECT_NAME
36 and q6.OBJECT_NAME = q7.OBJECT_NAME
37 and q7.OBJECT_NAME = q8.OBJECT_NAME
38 and q8.OBJECT_NAME = q9.OBJECT_NAME
39 and q9.OBJECT_NAME = q0.OBJECT_NAME;
40 end loop;
41 n3 := dbms_utility.get_time;
42 for i in 1..1000 loop
43 select /*+all_rows*/ q.OBJECT_ID into n
44 from q,q1,q2,q3,q4,q5,q6,q7,q8,q9,q0
45 where q.OBJECT_NAME = q1.OBJECT_NAME
46 and q.OBJECT_NAME = q1.OBJECT_NAME
47 and q1.OBJECT_NAME = q2.OBJECT_NAME
48 and q2.OBJECT_NAME = q3.OBJECT_NAME
49 and q3.OBJECT_NAME = q4.OBJECT_NAME
50 and q4.OBJECT_NAME = q5.OBJECT_NAME
51 and q5.OBJECT_NAME = q6.OBJECT_NAME
52 and q6.OBJECT_NAME = q7.OBJECT_NAME
53 and q7.OBJECT_NAME = q8.OBJECT_NAME
54 and q8.OBJECT_NAME = q9.OBJECT_NAME
55 and q9.OBJECT_NAME = q0.OBJECT_NAME;
56 end loop;
57 n4 := dbms_utility.get_time;
58
59 dbms_output.put_line('rule :'||to_char(n2 - n1));
60 dbms_output.put_line('first_rows :'||to_char(n3 - n2));
61 dbms_output.put_line('all_rows :'||to_char(n4 - n3));
62 end;
63 /
rule :118
first_rows :118
all_rows :121
PL/SQL procedure successfully completed.
SQL> analyze table q compute statistics;
Table analyzed.
SQL> declare
2 n1 number;
3 n2 number;
4 n3 number;
5 n4 number;
6 n number;
7 begin
8
9 n1 := dbms_utility.get_time;
10 for i in 1..1000 loop
11 select /*+RULE*/ q.OBJECT_ID into n
12 from q,q1,q2,q3,q4,q5,q6,q7,q8,q9,q0
13 where q.OBJECT_NAME = q1.OBJECT_NAME
14 and q.OBJECT_NAME = q1.OBJECT_NAME
15 and q1.OBJECT_NAME = q2.OBJECT_NAME
16 and q2.OBJECT_NAME = q3.OBJECT_NAME
17 and q3.OBJECT_NAME = q4.OBJECT_NAME
18 and q4.OBJECT_NAME = q5.OBJECT_NAME
19 and q5.OBJECT_NAME = q6.OBJECT_NAME
20 and q6.OBJECT_NAME = q7.OBJECT_NAME
21 and q7.OBJECT_NAME = q8.OBJECT_NAME
22 and q8.OBJECT_NAME = q9.OBJECT_NAME
23 and q9.OBJECT_NAME = q0.OBJECT_NAME;
24 end loop;
25 n2 := dbms_utility.get_time;
26 for i in 1..1000 loop
27 select q.OBJECT_ID into n
28 from q,q1,q2,q3,q4,q5,q6,q7,q8,q9,q0
29 where q.OBJECT_NAME = q1.OBJECT_NAME
30 and q.OBJECT_NAME = q1.OBJECT_NAME
31 and q1.OBJECT_NAME = q2.OBJECT_NAME
32 and q2.OBJECT_NAME = q3.OBJECT_NAME
33 and q3.OBJECT_NAME = q4.OBJECT_NAME
34 and q4.OBJECT_NAME = q5.OBJECT_NAME
35 and q5.OBJECT_NAME = q6.OBJECT_NAME
36 and q6.OBJECT_NAME = q7.OBJECT_NAME
37 and q7.OBJECT_NAME = q8.OBJECT_NAME
38 and q8.OBJECT_NAME = q9.OBJECT_NAME
39 and q9.OBJECT_NAME = q0.OBJECT_NAME;
40 end loop;
41 n3 := dbms_utility.get_time;
42 for i in 1..1000 loop
43 select /*+all_rows*/ q.OBJECT_ID into n
44 from q,q1,q2,q3,q4,q5,q6,q7,q8,q9,q0
45 where q.OBJECT_NAME = q1.OBJECT_NAME
46 and q.OBJECT_NAME = q1.OBJECT_NAME
47 and q1.OBJECT_NAME = q2.OBJECT_NAME
48 and q2.OBJECT_NAME = q3.OBJECT_NAME
49 and q3.OBJECT_NAME = q4.OBJECT_NAME
50 and q4.OBJECT_NAME = q5.OBJECT_NAME
51 and q5.OBJECT_NAME = q6.OBJECT_NAME
52 and q6.OBJECT_NAME = q7.OBJECT_NAME
53 and q7.OBJECT_NAME = q8.OBJECT_NAME
54 and q8.OBJECT_NAME = q9.OBJECT_NAME
55 and q9.OBJECT_NAME = q0.OBJECT_NAME;
56 end loop;
57 n4 := dbms_utility.get_time;
58
59 dbms_output.put_line('rule :'||to_char(n2 - n1));
60 dbms_output.put_line('analyze,cost:'||to_char(n3 - n2));
61 dbms_output.put_line('all_rows :'||to_char(n4 - n3));
62 end;
63
64 /
rule :76
analyze,cost:75
all_rows :74
PL/SQL procedure successfully completed.
SQL> [/B]
你这个测试本身没问题(如果是在9i的环境下)
可是要明确执行计划评估是在评估什么,这当然要包括对于数据量的考虑。
否则NESTED LOOPS、FULL TABLE SCAN的COST评估也就没有什么意义了。 |
|