哪个查询效率更高?

Jac*_*all 3 performance sql-server-2005 sql-server query query-performance

我有一张桌子叫 STUDENT

+-----------+-----------+-----------+---------------+
| StudentID | FirstName | LastName  | EnrollmenDate |
+-----------+-----------+-----------+---------------+
|         1 | x         | x         | x             |
|         2 | x         | x         | x             |
|         3 | x         | x         | x             |
+-----------+-----------+-----------+---------------+
Run Code Online (Sandbox Code Playgroud)

写一个查询,拉出最后注册的学生?

a) 按 EnrollmentDate Desc 从 STUDENTorder 中选择前 1 *

或者

b) select * from STUDENT where EnrollmentDate = (select Max(EnrollmentDate) from STUDENT)

面试的时候一般会问这个问题。一位候选人回答 b) 我期待 a)。哪个更好查询?

Jon*_*gel 7

写一个查询,拉出最后注册的学生?

第二个查询不一定执行此操作,具体取决于EnrolmentDate列的数据类型以及数据的粒度。如果此列不包含时间组件,则查询将返回在不满足问题的学生注册的最后一天注册的所有学生。如果一个时间成分,很可能(但不太可能)会有返回了多行。

(编辑:亚历克斯·库兹涅佐夫正确的评论指出,第一个查询不一定返回最后生源或者当有关系它是,但是,保证返回,一个在该事件的记录,而不是所有的记录,这通常是令人满意的。我认为我的观点更多的是比较两个查询是比较苹果和橙子,可以这么说。)

无论如何,如果我们假设所有的注册日期/时间都是唯一的,那么从给出的内容来看,问题的答案也不一定是明确的。你需要让我有资格成为你所说的更高效的意思。

第一个查询只会扫描一次,但可能会导致昂贵的排序(您没有说明表中存在哪些索引,所以我假设没有)。后一个查询将执行一次扫描以找到最大值,然后执行另一次扫描以找到所有匹配的行,这可能会使用更少的 CPU,但会使用更多的逻辑 I/O。完全有可能第二个查询总体上会更便宜(同样,没有可用的索引)。

说了这么多,如果我要开始对这个业务操作进行性能调优,我肯定会从查询 (a) 开始。


归档时间:

查看次数:

351 次

最近记录:

13 年,1 月 前