SELECT *
FROM (SELECT TEMP.*,
ROWNUM RNUM
FROM (SELECT entry_guid
FROM alertdevtest.ENTRY
WHERE Upper(alert_name) = 'alertname'
AND user_guid = 'AlertProductClientTest'
AND product_code = '-101'
AND status_code != 13) TEMP
WHERE ROWNUM <= 2500)
WHERE rnum >= 0;
SELECT *
FROM (SELECT TEMP.*,
ROWNUM RNUM
FROM (SELECT entry_guid
FROM alertdevtest.ENTRY
WHERE Upper(alert_name) = 'alertname'
AND user_guid = 'AlertProductClientTest'
AND product_code = '-101'
AND status_code != 13
AND product_view IN ( 'PView' )) TEMP
WHERE ROWNUM <= 2500)
WHERE rnum >= 0;
在第二个查询中运行查询并查看性能下降与第一个查询相比。唯一的区别是第二个查询中的附加过滤器AND PRODUCT_VIEW IN('PView')。但它在该专栏上有索引。请告诉我性能下降的原因是什么,如何检查索引是否被使用?我正在使用Oracle SQL开发人员并尝试检查解释计划,但无法获得更多详细信息。
答案 0 :(得分:4)
在Oracle SQL Developer中,当您在工作表中有SQL时,有一个按钮&#34; Explain Plan&#34;,您也可以点击F10。执行Explain计划后,它将显示在SQL Developer的底视图中。有一列&#34; OBJECT_NAME&#34;,它会告诉您正在使用的索引。例如,在我刚刚运行的查询中,在左栏(OPERATION)中显示&#34; SELECT STATEMENT&#34;首先是SORT(AGGREGATE),然后是INDEX(RANGE SCAN),然后在OBJECT_NAME列中显示TICKER_IDX1,这是我桌子上索引的名称。
因此,您可以通过OBJECT_NAME列查看正在使用的索引。
Oracle Cost Based Optimizer可能会选择次优执行计划。很多时候更新统计数据都可以解决问题。其他选择是添加其他索引,换句话说是多列索引。您可以提示SQL语句,但这很少需要。此外,还可以重写查询。
答案 1 :(得分:3)
EXPLAIN PLAN
语句是检查执行计划的最佳方式。
图形执行计划被认为是有害的。
EXPLAIN PLAN
与执行计划的常见图形表示相比有许多好处:
DBMS_XPLAN.DISPLAY
适用于任何环境,并生成每个Oracle专业人员都熟悉的输出。有权访问Oracle的任何人都可以重现该问题,每个人都可以使用相同的标准名称来讨论该问题。 SQL Developer可能是免费的,但大多数开发人员和DBA都不使用它。Note
部分。该部分通常包含重要信息。在您的示例中,DBA可能会为其中一个查询修复SQL计划基准而不是另一个查询。如果没有Notes
部分,我们只需要猜测是否有奇怪的事情发生。alter session enable parallel dml;
,计划可能会有很大差异。这对SQL Developer来说似乎不是问题,但我已经在其他程序中看到了它。DBMS_XPLAN
可以编写脚本并具有许多强大功能,例如format => '+outline'
,dbms_xplan.display_awr
等。以下是EXPLAIN PLAN
的简单示例。这个计划很好,但确实有一个巨大的红旗,大多数图形执行计划都不会显示。最后一行,
dynamic statistics used: dynamic sampling (level=2)
表示其中一个表缺少优化程序统计信息。
drop table test1;
create table test1(a number);
explain plan for insert into test1 select * from test1;
select * from table(dbms_xplan.display);
Plan hash value: 4122059633
----------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------
| 0 | INSERT STATEMENT | | 1 | 13 | 2 (0)| 00:00:01 |
| 1 | LOAD TABLE CONVENTIONAL | TEST1 | | | | |
| 2 | TABLE ACCESS FULL | TEST1 | 1 | 13 | 2 (0)| 00:00:01 |
----------------------------------------------------------------------------------
Note
-----
- dynamic statistics used: dynamic sampling (level=2)
为了快速检查,您可以更轻松地按F10,F5,ctrl + E或特定IDE中的快捷方式。但是,对于将与他人分享的严肃分析,请始终使用EXPLAIN PLAN
。
答案 2 :(得分:0)
了解性能不佳的原因最好是获取SQL * Trace。 有几种方法可以启用跟踪http://docs.oracle.com/cd/B19306_01/server.102/b14211/sqltrace.htm#g33356 例如
EXECUTE DBMS_SESSION.SESSION_TRACE_ENABLE(waits => TRUE, binds => TRUE);
您需要启用跟踪,运行这些查询,获取数据到最后(因为通常在获取期间执行的大部分工作),关闭会话(需要关闭游标以使执行计划随时间统计出现在跟踪文件中) 。
然后你应该去数据库服务器上的转储文件夹,获取跟踪文件,用户tkprof实用程序将其转换为更易读的方式,在里面找到这些查询,享受:)。
SQL Trace的好处在于它提供了在SQL执行期间使用的真实计划,并且它为计划的每个步骤提供了非常精确的时间,读取,获取,一致读取,CPU统计(不幸的是,我不知道任何其他可以做到这一点的工具)
缺点是你需要特权来开始跟踪,你需要访问转储文件夹(或者你需要让DBA执行带有跟踪和服务器管理员的查询来获取文件)。
更粗略的选择是启用对此SQL的监视(例如通过/ * + monitor * / hint)并使用DBMS_SQLTUNE.REPORT_SQL_MONITOR
http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_sqltun.htm#CHDBHIBG - 它可以为执行计划的每个步骤生成包含统计信息的漂亮HTML(如在SQL Trace中)
优点是易于使用(您不需要访问服务器文件夹即可使用它)
缺点是在这种情况下,统计数据通常为1秒,因此仅对长时间运行的查询(10秒或更长时间)有用。
如果只需检查SQL执行期间是否使用了索引,则可以查询v $ sql_plan视图和v $ sql,v $ sql_monitor视图以查找相应的计划。