首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >需要帮助理解查询执行时间

需要帮助理解查询执行时间
EN

Stack Overflow用户
提问于 2013-12-04 08:54:15
回答 1查看 130关注 0票数 1

我以前在这里发布了一个关于根据特定条件连接两个表的问题,How to join two tables based on a timestamp (with variance of a few seconds)? (链接不需要阅读)

我发现在创建索引之后,它工作得非常快。我当前代码的片段是

代码语言:javascript
运行
复制
CREATE INDEX INDEXNAME1 ON TABLEA (CALL_DATE+5/86400);
CREATE INDEX INDEXNAME2 ON TABLEA (CALL_DATE+6/86400);
CREATE INDEX INDEXNAME3 ON TABLEB (NUMBER1,NUMBER2);
CREATE INDEX INDEXNAME4 ON TABLEA (NUMBER1,NUMBER2);
----
INSERT INTO AB_RECON (
SELECT A.*,B.* FROM TABLEB B FULL OUTER JOIN TABLEA A
ON B.NUMBER1=A.NUMBER1 AND B.NUMBER2=A.NUMBER2 AND
B.CALL_DATE-A.CALL_DATE IN (5/86400,6/86400);
----
DROP INDEX INDEXNAME1;
DROP INDEX INDEXNAME2;
DROP INDEX INDEXNAME3;
DROP INDEX INDEXNAME4;

不要担心代码的正确性,它是有效的。但我面临的问题是执行时间是随机的。90%的时间,执行时间非常快(2-5分钟),但有时(就像现在运行超过20分钟)。我知道这看起来像是“取决于表的大小”,但平均一个表A有140万条记录,TABLEB有.9百万条记录。几十万,而不是更多。

我运行了下面的代码(作为SYS运行)来标识当前运行在数据库上的查询以及经过的时间

代码语言:javascript
运行
复制
select sess.sid, sess.serial#, sess.sql_id, sess.last_call_et as 
EXECUTION_TIME,sq.sql_text from v$session sess,v$sql sq
where status = 'ACTIVE' and last_call_et > sysdate - (sysdate - (3/86400))
and username is not null and sess.sql_id=sq.sql_id;

我得到以下输出

代码语言:javascript
运行
复制
SID  ||  SERIAL#    ||  SQL_ID         ||  EXECUTION_TIME  ||  SQL_TEXT
246  ||  51291      ||  dxa2sz103vt0g  ||  1256            || <my recon query pasted above>

我不明白为什么要花这么长时间,因为从它的外观来看,它是唯一的主动查询。我不是DBA,所以我不完全理解我是不是错过了什么。

如果能给出一些可能的原因/解决方案,让我能指出正确的方向,我会很感激的。

如有需要,请提供补充资料

解释计划

代码语言:javascript
运行
复制
| Id  | Operation                | Name            | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------
|   0 | INSERT STATEMENT         |                 |  2386K|   530M|       |  2395M  (1)|999:59:59 |
|   1 |  LOAD TABLE CONVENTIONAL | AB_RECON        |       |       |       |            |          |
|   2 |   VIEW                   |                 |  2386K|   530M|       |  2395M  (1)|999:59:59 |
|   3 |    UNION-ALL             |                 |       |       |       |            |          |
|*  4 |     HASH JOIN RIGHT OUTER|                 |  1417K|   109M|    49M| 10143   (1)| 00:02:02 |
|   5 |      TABLE ACCESS FULL   | TABLEA          |   968K|    38M|       |  1753   (1)| 00:00:22 |
|   6 |      TABLE ACCESS FULL   | TABLEB          |  1417K|    52M|       |  2479   (1)| 00:00:30 |
|*  7 |     FILTER               |                 |       |       |       |            |          |
|   8 |      TABLE ACCESS FULL   | TABLEA          |   968K|    38M|       |  1754   (1)| 00:00:22 |
|*  9 |      TABLE ACCESS FULL   | TABLEB          |     1 |    29 |       |  2479   (1)| 00:00:30 |

甲骨文版数据库11g企业版11.2.0.3.0 64位生产

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-04 13:09:29

好吧,我没有真正找到我的问题的答案,但我确实在周围找到了一个工作。我已经把我想做的事情(基本上是两个信息源之间的协调)分成了三个部分。

  1. 匹配源A和B
  2. 源B中缺失
  3. 源A缺失

下面给出了我使用的查询。总的来说,它运行得更快。必须监控它在几次处决中的表现。

代码语言:javascript
运行
复制
INSERT INTO AB_RECON (
SELECT M.*,I.* FROM TABLEA M, TABLEB I
WHERE M.ANUMBER=I.ANUMBER AND M.BNUMBER=I.BNUMBER
AND M.CALL_DATE-I.CALL_DATE B (5/86400,6/86400));

COMMIT;


INSERT INTO AB_RECON
(SELECT ANUMBER,BNUMBER,CALL_DATE,CALL_DURATION,REF_NO,NULL,NULL,NULL,NULL,NULL FROM
   (SELECT * FROM TABLEA M WHERE NOT EXISTS
      (SELECT ANUMBER,BNUMBER,CALL_DATE,CALL_DURATION,REF_NO FROM AB_RECON I
       WHERE M.ANUMBER=I.ANUMBER AND M.BNUMBER=I.BNUMBER AND M.CALL_DATE=I.CALL_DATE
      )
   )
);

COMMIT;

INSERT INTO AB_RECON
(SELECT NULL,NULL,NULL,NULL,NULL,ANUMBER,BNUMBER,CALL_DATE,CALL_DURATION,REF_NO FROM
   (SELECT * FROM TABLEB M WHERE NOT EXISTS
      (SELECT ANUMBER,BNUMBER,CALL_DATE,CALL_DURATION,REF_NO FROM AB_RECON I
       WHERE M.ANUMBER=I.ANUMBER AND M.BNUMBER=I.BNUMBER AND M.CALL_DATE=I.CALL_DATE
      )
   )
);

老实说,我不知道为什么这样做更快的背后的理论。所以我的主要问题还没有解决。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20370858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档