AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 23482
Accepted
fa1c0n3r
fa1c0n3r
Asked: 2012-08-31 18:36:28 +0800 CST2012-08-31 18:36:28 +0800 CST 2012-08-31 18:36:28 +0800 CST

简单的 Oracle 查询挂起取决于 WHERE 子句

  • 772

不习惯使用 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.

我的猜测是,这只是一张设计精美的表格,并没有设计得这么大,或者让某人实际使用很多 :) 出于实际目的,我将继续使用该表格的更新版本,该表格将具有索引并希望这将解决它。

oracle select
  • 1 1 个回答
  • 8834 Views

1 个回答

  • Voted
  1. Best Answer
    fa1c0n3r
    2012-09-01T03:07:16+08:002012-09-01T03:07:16+08:00

    听从 a_horse_with_no_name 的建议,

    请向我们展示第二个查询的执行计划 – a_horse_with_no_name 4 小时前

    我已经发布了执行计划的相关部分......但是我无法从中找出问题所在......

    我听从了 Mat 的建议,并猜测缺少索引是问题所在。 因为没有索引,所以正如马特所说,这个简单的查询正在执行全表扫描,这可能比我等待查询完成的几分钟要长......

    关于索引概念的有用链接:http ://www.orafaq.com/node/1403

    该列是否已编入索引?否则你会得到一个全表扫描,如果表很大,这可能需要一段时间。– 垫 7 小时前

    select index_name, column_name from dba_ind_columns where index_owner = 'THE_SCHEMA' and table_name = 'YOUR_TAB' order by index_name 将为您提供所有索引列。查看解释计划以了解它在做什么(查看 set autotrace 或使用具有该功能的 GUI,如 sqldeveloper)– Mat 7 小时前

    谢谢你们的帮助。让我知道我的假设是否有误,或者您是否有其他见解 a_horse_with_no_name....

    • 2

相关问题

  • Oracle 中的数据库备份 - 导出数据库还是使用其他工具?

  • ORDER BY 使用文本列的自定义优先级

  • 舒服的sqlplus界面?[关闭]

  • 如何在数据库中找到最新的 SQL 语句?

  • 如何使用正则表达式查询名称?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve