不习惯使用 Oracle,但我们有一个大型数据库,其中有一个非唯一查询,例如
SELECT * FROM employees where department = 'HR'
正在工作,结果列表没有问题。
但是当我这样做时
SELECT * FROM employees where employeeID = '3HVtxO-F3004728F87EF61E'
oracle 数据库查询挂起(我期待一条记录回来,我确定它存在,因为我从另一个查询中复制粘贴了employeeID)。
对于列,两者之间的唯一区别是:
department is VARCHAR2(25) NULL
employeeID is VARCHAR2(50) NULL
此外,部门会有很多匹配项,而员工 ID 很可能有 1 个(我看不到它在表定义中被特别定义为唯一)。
其他表特性:
- 实际上不是员工表,它有与工作相关的数据,所以我在这里重命名了它......
- 包含超过一百万行和几十列
- 有点旧的数据库,不确定是谁在很久以前设计的,可能存在数据库完整性/索引问题?
- 没有 where 子句的常规 select * from employees 也不起作用,因为它冻结了大约 50 万行找到的标记。
知道为什么会发生这种情况吗?我应该更好地设计我的查询吗?您如何建议诊断与数据库本身问题相关的一些问题?试图掌握这个 oracle 数据库,但习惯起来有点尴尬,因为应该返回一个项目的简单查询被挂起。谢谢你。
更新 1:响应评论,该列没有索引。幸运的是,这是一个过时的表,根本不会使用,正在制作一个具有索引列的新版本,所以我认为这是一个问题。
关于第二个查询的计划,它看起来像:
Plan hash value: 123724717
------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 12 | 4416 | 2376K (1)| 07:55:19 | | |
| 1 | PARTITION RANGE ALL| | 12 | 4416 | 2376K (1)| 07:55:19 | 1 | 14 |
|* 2 | TABLE ACCESS FULL | [Employee| 12 | 4416 | 2376K (1)| 07:55:19 | 1 | 14 |
------------------------------------------------------------------------------------------------
Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------
1 - SEL$1
2 - SEL$1 / Employees@SEL$1
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("EmployeeID"='3R5MMN-0F9345L9IK8A349A043')
Column Projection Information (identified by operation id):
-----------------------------------------------------------
-- The list of all the columns follows.
我的猜测是,这只是一张设计精美的表格,并没有设计得这么大,或者让某人实际使用很多 :) 出于实际目的,我将继续使用该表格的更新版本,该表格将具有索引并希望这将解决它。
听从 a_horse_with_no_name 的建议,
我已经发布了执行计划的相关部分......但是我无法从中找出问题所在......
我听从了 Mat 的建议,并猜测缺少索引是问题所在。 因为没有索引,所以正如马特所说,这个简单的查询正在执行全表扫描,这可能比我等待查询完成的几分钟要长......
关于索引概念的有用链接:http ://www.orafaq.com/node/1403
谢谢你们的帮助。让我知道我的假设是否有误,或者您是否有其他见解 a_horse_with_no_name....