【问题标题】:Select query slow in oracle but fast in mysql database在 oracle 中选择查询慢但在 mysql 数据库中快速
【发布时间】:2014-12-09 23:56:09
【问题描述】:

我正在尝试优化一个简单的 sql 查询,它在 MySql 数据库中运行需要 15 毫秒,但在 Oracle 数据库中运行大约需要 600 毫秒。

以下是查询:

select *
from APPEALCASE appealcase0_
where appealcase0_.caseNumber='BAXXXXX00' and appealcase0_.DELETED_FLAG='N' 

我索引了 caseNumber 列,但它仍然没有帮助。任何人都可以建议我在 Oracle 数据库中获得相同的 15 毫秒响应时间的解决方案。

【问题讨论】:

  • 您的索引中没有包含deleted_flag 列是否有原因?是否有足够少的行与“Y”有关?此查询返回多少行?表中有多少行?查询计划是什么?统计数据准确吗?您如何测量“响应时间”——获取第一行的时间?最后一排?您是在测量数据库服务器上的时间(不包括网络时间)还是客户端上的时间(因此包括获取行的时间)?
  • 我不想仅仅为了解决这个问题而包含deleted_flag...这个查询只返回一行,此时大约有200,000行,并且随着时间的推移而增长。我不确定查询计划和统计信息。您能否提供更多现场信息。时间测量在 oracle 客户端上。我们可以尝试分区吗?
  • @Ashok Ambrose:有多少行具有相同的 _caseNumber 但标志不同?而且 200k 太少了,甚至无法开始考虑分区。 “我不确定查询计划和统计信息。你能提供更多的insite”---你先谷歌怎么样?
  • 您应该明确提出有关这些表格内容的问题;即,它们在两个 DMBS 中是否包含完全相同的数据?
  • 您使用什么客户端程序与 Oracle 交互?几乎所有这些都将具有生成查询计划的内置选项。例如,在 SQL*Plus 中,您可以在执行查询之前执行set autotrace on,以便在查询结果之后打印出查询计划。

标签: mysql database oracle query-optimization


【解决方案1】:

听起来你需要一个索引。我建议:

create index idx_appealcase_casenumber_deleted on appealcase(casenumber, deleted_flag);

【讨论】:

  • 压缩的相反顺序怎么样?
  • OP 确实表明在caseNumber 上创建了一个索引。如果有许多已删除的行,则此复合索引可能更有意义,但如果删除的行很少,则作用不大。
  • @JustinCave 这是我的第二个想法
  • 鉴于相同的查询在 MySQL 中运行得更快,所以有些事情正在发生。可能是热缓存或统计数据过时的简单问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 2012-03-30
  • 1970-01-01
  • 2011-11-30
  • 2018-11-16
  • 2013-07-16
  • 1970-01-01
相关资源
最近更新 更多