【发布时间】: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