首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle 10合并性能

Oracle 10合并性能
EN

Stack Overflow用户
提问于 2011-11-12 22:24:10
回答 1查看 3.2K关注 0票数 4

我在Oracle10中遇到了一个与MERGE有关的非常奇怪的性能问题。一句话,我有一个存储过程,它根据她在系统中的活动计算和存储用户排名,并且只包含一条MERGE语句:

代码语言:javascript
复制
MERGE INTO user_ranks target USING 
([complex query that returns rank_id and user_id])src ON 
(src.user_id = target.user_id)
WHEN MATCHED THEN UPDATE SET target.rank_id = src.rank_id
WHEN NOT MATCHED THEN INSERT (target.user_id, target.rank_id)
  VALUES (src.user_id, src.rank_id);

// user_ranks table structure:
CREATE TABLE user_ranks (user_id INT NOT NULL 
PRIMARY KEY USING INDEX (CREATE UNIQUE INDEX UQ_uid_uranks ON user_ranks(user_id)),
rank_id INT NOT NULL,
CONSTRAINT FK_uid_uranks FOREIGN KEY (user_id) REFERENCES users(id),
CONSTRAINT FK_rid_uranks FOREIGN KEY(rank_id) REFERENCES ranks(id));
// no index on rank_id - intentionally, ranks table is a lookup with 
// a very few records and no delete/update allowed

用作MERGE源的子查询最多返回1条记录(user_id作为参数传递给过程)。这是相当昂贵的,但执行时间是可以接受的(1-1.2秒)。问题是MERGE执行时间增加到超过40秒,我不知道为什么。我试着使用LEADING提示,但没有成功。但是,如果我将语句分成两个部分,首先运行SELECT子查询和存储结果(Rank_id)为变量,然后合并- MERGE ... USING (SELECT user_id, rank_id FROM DUAL)src ... -所有操作都很好。据我所读,甲骨文的MERGE存在已知的问题,但它们大多与触发器有关(在我的例子中没有触发器)。它还说,MERGE的工作速度慢于INSERTUPDATE的结合,但我相信“正常”的差异在5-10%左右,而不是30倍.

我在努力理解我做错了什么..。谢谢你的建议。

更新执行计划在这里发布非常长,简而言之:子查询成本本身是12737,merge - 76305。merge的统计数据输出:

>统计

代码语言:javascript
复制
         108  recursive calls
           4  db block gets
    45630447  consistent gets
       24905  physical reads
           0  redo size
         620  bytes sent via SQL*Net to client
        1183  bytes received via SQL*Net from client
           2  SQL*Net roundtrips to/from client
           2  sorts (memory)
           0  sorts (disk)

单独的子查询:

>统计

代码语言:javascript
复制
           8  recursive calls
           0  db block gets
          34  consistent gets
           0  physical reads
           0  redo size
         558  bytes sent via SQL*Net to client
         234  bytes received via SQL*Net from client
           1  SQL*Net roundtrips to/from client
           1  sorts (memory)
           0  sorts (disk)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-12 07:36:41

如果您已经使用了加自动跟踪,那么看看实际执行计划的哪一部分导致了最物理和逻辑的I/O,并使用了最多的内存,这只是几秒钟的问题。

请注意,使用此方法获得的信息比简单的explain plan要精确得多。

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

https://stackoverflow.com/questions/8108017

复制
相关文章

相似问题

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