0

假设我有两张桌子,

   Student                           Test

Id    Name                   TestId   Score  StudentId
--    ----                   ------   ----  ---------  
1    Mark                      774     100       1   
2     Sam                      774      89       2  
3    John                      775      78       3

现在我必须打印每个学生的学生姓名、考试 ID 和分数。

我知道它们都产生相同的结果。但是哪一个在性能方面更好?第二个是否找到笛卡尔积然后应用过滤器(where 子句)?

1.Select test.testid,student.name,test.score 
  from student 
  join test 
  on test.studentid=student.id

2.Select test.testid,student.name,test.score  
  from student,test 
  where test.studentid=student.id
4

2 回答 2

1

我不会直接回答你的问题,而是为你提供一个工具来解决这些问题。

Oracle 提供了查看查询如何执行的方法。您可以查看对表的访问是如何执行的、查询执行需要多长时间、是否使用索引等。

命令是:

解释计划设置自动跟踪

在你的情况下,它会像这样简单:

EXPLAIN PLAN FOR
Select test.testid,student.name,test.score 
from student 
join test 
on test.studentid=student.id;

EXPLAIN PLAN FOR
Select test.testid,student.name,test.score  
from student,test 
where test.studentid=student.id;

或使用自动跟踪:

Set autotrace on;

Select test.testid,student.name,test.score 
from student 
join test 
on test.studentid=student.id;

Select test.testid,student.name,test.score  
from student,test 
where test.studentid=student.id;

在 的情况下EXPLAIN PLAN,结果保存在一个特殊的表中,您可以查询以查看它们。检查我链接到的文档,看看可以用它做什么。

于 2012-07-26T07:01:25.833 回答
-1

两个查询都有相同的执行计划(至少在 MS SQL 中是这样)。第二个查询将被优化

于 2012-07-26T09:24:06.027 回答