【问题标题】:Is there any difference between time complexity of the following sql queries that have to以下sql查询的时间复杂度有什么区别
【发布时间】:2016-10-24 21:59:57
【问题描述】:

我正在使用 Oracle Express 处理表。表Employees 有字段Employee 的First_Name、Last_Name 和他/她的Hire_Date。我的目标是检索从员工中最先被雇用的数据。

我写了这些查询,并开始考虑它们的复杂性。我假设第一个复杂度为 O(n logn),第二个复杂度为 O(n^2)。这只是我的假设(我对编程很陌生),我完全不确定。你能解释一下这些查询的复杂性是如何准确定义的吗?

SELECT * 
FROM
(
 SELECT Hire_Date, First_Name, Last_Name
 FROM Employees
 ORDER BY Hire_Date
)
WHERE ROWNUM <= 1

SELECT * 
FROM Employees
WHERE Hire_Date = 
(
 SELECT MIN(Hire_Date) 
 FROM Employees
)

【问题讨论】:

  • 很多情况取决于可用的索引。假设hire_date 上有一个索引,我希望两者都是 O(log n) 尽管我希望第一个查询更有效,因为它只需要访问表一次。如果您想进行更具体的讨论,包括实际的查询计划会很有帮助。

标签: sql oracle11g


【解决方案1】:

首先,如果您是编程新手,您需要了解这两个查询是不同的。第一个返回一行。第二个返回至少一行。

这表明执行计划会有所不同。

在正常情况下,如果你需要做这项工作,那么你会在Employees(Hire_Date) 上有一个索引。如果是这样,两者将具有非常相似的性能。第一个将开始使用索引按排序顺序返回记录,然后在第一个停止。第二个将进行索引查找以获取最小值。然后另一个来获取匹配的记录。

如果没有索引,由于排序原因,第一个可能是 O(n log n)。第二个是 O(n) - 一次扫描子查询,一次扫描外部查询(这些不是嵌套的,所以复杂度是线性的)。但是,Oracle 可能会进行一些优化,尤其是对于第一种情况。

【讨论】:

    【解决方案2】:

    这取决于您在该表上是否有Hire_Date 的index。如果你不你将不得不做一个完整的扫描表和那些O 听起来不错。 Firat onw 你需要一个排序,第二个你需要两次扫描

    但如果你拥有index,性能就会低得多。通常是log(n) 因为是b-tree搜索

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多