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)。哪个更好查询?
写一个查询,拉出最后注册的学生?
第二个查询不一定执行此操作,具体取决于EnrolmentDate
列的数据类型以及数据的粒度。如果此列不包含时间组件,则查询将返回在不满足问题的学生注册的最后一天注册的所有学生。如果是一个时间成分,很可能(但不太可能)会有返回了多行。
(编辑:亚历克斯·库兹涅佐夫正确的评论指出,第一个查询不一定返回的最后生源或者当有关系它是,但是,保证返回,一个在该事件的记录,而不是所有的记录,这通常是令人满意的。我认为我的观点更多的是比较两个查询是比较苹果和橙子,可以这么说。)
无论如何,如果我们假设所有的注册日期/时间都是唯一的,那么从给出的内容来看,问题的答案也不一定是明确的。你需要让我有资格成为你所说的更高效的意思。
第一个查询只会扫描一次,但可能会导致昂贵的排序(您没有说明表中存在哪些索引,所以我假设没有)。后一个查询将执行一次扫描以找到最大值,然后执行另一次扫描以找到所有匹配的行,这可能会使用更少的 CPU,但会使用更多的逻辑 I/O。完全有可能第二个查询总体上会更便宜(同样,没有可用的索引)。
说了这么多,如果我要开始对这个业务操作进行性能调优,我肯定会从查询 (a) 开始。
归档时间: |
|
查看次数: |
351 次 |
最近记录: |