ITPUB论坛-中国最专业的IT技术社区

 找回密码
 注册
查看: 550|回复: 16

求问个物化视图刷新的问题

[复制链接]
论坛徽章:
0
发表于 2017-5-17 23:49 | 显示全部楼层 |阅读模式
是这样的,最近设置的一个job跑的过程中没报错,但结束不了,查了下记录,是卡在了一个物化视图的刷新上,我就关掉了job,单独运行这句刷新的sql,但过了十几个小时就是没结果,一直处于运行状态,不知道应该怎么办,物化视图是refresh force on demand。求问各位大手子,碰到这种情况,是该怎么解决,物化视图的创建语句没问题的,前些日子还刷新成功过的,这次就突然这样的,难打要一直等下去吗,已经十几个小时了。。。。。
论坛徽章:
0
 楼主| 发表于 2017-5-17 23:54 | 显示全部楼层
本来说放在sql窗口运行的,但是由于是远程的,那边机器承受不了,一段时间就会卡住,所以只能我把之前job里的刷新语句放在新的job里运行,但是就是一直运行,几个小时过去没反应,估计也会运行十几个小时甚至更多,,,情况不乐观,没招了,求助求助。。。

使用道具 举报

回复
论坛徽章:
454
秀才
日期:2015-08-18 09:49:27秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01状元
日期:2015-09-09 10:34:21榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01
发表于 2017-5-18 00:16 | 显示全部楼层
查看V$SESSION看看是卡在哪个SQL语句。
DBMS_MVIEW.REFRESH有一个参数可以设置 ATOMIC_REFRESH=>FALSE, 这样可以改用TRUNCATE而不是DELETE。
12C有OUT OF PLACE REFRESH选项。
你也可以自己CREATE NEW_TABLE AS SELECT ...
等新表准备好之后改名,或者在表之上建立视图,这样就只需修改视图的DDL,用两个表名来回切换。

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2017-5-18 01:30 | 显示全部楼层
newkid 发表于 2017-5-18 00:16
查看V$SESSION看看是卡在哪个SQL语句。
DBMS_MVIEW.REFRESH有一个参数可以设置 ATOMIC_REFRESH=>FALSE,  ...

我在刷新前已经truncate了,你说的自己create新表这个方法是为了避免使用物化视图吗,,,具体不是太懂你说的过程。。。。

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2017-5-18 01:32 | 显示全部楼层
newkid 发表于 2017-5-18 00:16
查看V$SESSION看看是卡在哪个SQL语句。
DBMS_MVIEW.REFRESH有一个参数可以设置 ATOMIC_REFRESH=>FALSE,  ...

确实是卡在这个物化视图刷新的动态sql执行这个点上,我已经对物化视图怕了,上回刷新很久就是不成功,结果到半夜刷新了一次,很快就刷完了,这回不行了,白天半夜都没用,我还以为是资源占用问题。。。刷新太久了,都不知道能不能成功的

使用道具 举报

回复
论坛徽章:
454
秀才
日期:2015-08-18 09:49:27秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01状元
日期:2015-09-09 10:34:21榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01
发表于 2017-5-18 02:03 | 显示全部楼层
咖啡好不好喝 发表于 2017-5-18 01:30
我在刷新前已经truncate了,你说的自己create新表这个方法是为了避免使用物化视图吗,,,具体不是太懂你 ...

你是自己把旧数据TRUNCATE了?那你岂不是要先DROP MATERIALIZED VIEW,变成表再操作?
我说的CREATE NEW_TABLE就是为了避免用物化视图。你要的就是那些数据,CREATE ... AS SELECT ...
是最高效的做法。
然后你在这张表上建立一个视图,名称和你原来的物化视图一样:
CREATE OR REPLACE VIEW MV_XXX AS SELECT * FROM MY_TABLE;
第二天刷新的时候,先用同样的办法建表,只是换个表名,做完之后把视图里面的MY_TABLE换一下就行了。旧表就DROP 掉。就这样两个表名来回使用。

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2017-5-18 08:28 | 显示全部楼层
newkid 发表于 2017-5-18 02:03
你是自己把旧数据TRUNCATE了?那你岂不是要先DROP MATERIALIZED VIEW,变成表再操作?
我说的CREATE NEW_ ...

我是先truncate这个物化视图里的数据,然后再刷新的,,,这样不行的么,,我之前就是这么刷新的,今天看了下,这个视图单独刷新,昨天晚上9点到现在还没刷新好,都不知道问题出在哪里,要是视图的创建代码有误或者原表结构改了,那至少也报个错,,什么错都没有真的是无从下手

使用道具 举报

回复
论坛徽章:
454
秀才
日期:2015-08-18 09:49:27秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01状元
日期:2015-09-09 10:34:21榜眼
日期:2015-09-09 10:34:21秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01秀才
日期:2015-09-09 10:33:01
发表于 2017-5-18 08:57 来自手机 | 显示全部楼层
把你操作的语句全部贴出来。MV 一般不能 truncate, 怀疑你写错了。

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2017-5-18 09:18 | 显示全部楼层
newkid 发表于 2017-5-18 08:57
把你操作的语句全部贴出来。MV 一般不能 truncate, 怀疑你写错了。

vPrc_Resulst:= 0;

    S_Pkg_PixPatInfo.Prc_LogPrcIni (vPrc_Resulst, vTaskId, vPrc_Name, 'CenDoc信息更新处理PIX任务创建成功');



    --02 CENDOC库人员基本信息同步开始

    vPrc_Resulst:= 0;

    --dbms_output.put_line('CENDOC库人员基本信息同步-{S_Pkg_PixPatInfo.Prc_Pix_GxGrDAH}开始');

    S_Pkg_PixPatInfo.Prc_Pix_GxGrDAH      (vPrc_Resulst, vTaskId);

    Resulst := Case When vPrc_Resulst > 0 Then Resulst Else vPrc_Resulst End;

    --dbms_output.put_line('CENDOC库人员基本信息同步-{S_Pkg_PixPatInfo.Prc_Pix_GxGrDAH}结束');



Procedure Prc_Pix_GxGrDAH     (Resulst Out Integer, vTaskId In Varchar2) Is

    vPrc_Name   Varchar2(100);

    script      Varchar2(8000);

    sql_log     Varchar2(8000);

    vTable      Varchar2(200);

    vRow_Ins    Integer;

    vRow_Upd    Integer;

  Begin

    vPrc_Name:='Prc_Pix_GxGrDAH';

    Resulst := 0;



    vTable:='TB_CENTER_INFO';



    --04 个人档案相关物化视图更新

    Script:='Truncate Table DAH_INDEX';

    --dbms_output.put_line(script);

    Execute Immediate Script;

    dbms_mview.Refresh('DAH_INDEX','Complete');

就是这里,能看到上一步的日志,然后这个刷新的物化视图里查不到数据,应该是卡在刷新这里,我的包里还有其他三个物化视图这么刷新的,前两个都可以刷的,之前也刷新过,

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2017-5-18 09:19 | 显示全部楼层
newkid 发表于 2017-5-18 08:57
把你操作的语句全部贴出来。MV 一般不能 truncate, 怀疑你写错了。

vPrc_Resulst:= 0;

    S_Pkg_PixPatInfo.Prc_LogPrcIni (vPrc_Resulst, vTaskId, vPrc_Name, 'CenDoc信息更新处理PIX任务创建成功');



    --02 CENDOC库人员基本信息同步开始

    vPrc_Resulst:= 0;

    --dbms_output.put_line('CENDOC库人员基本信息同步-{S_Pkg_PixPatInfo.Prc_Pix_GxGrDAH}开始');

    S_Pkg_PixPatInfo.Prc_Pix_GxGrDAH      (vPrc_Resulst, vTaskId);

    Resulst := Case When vPrc_Resulst > 0 Then Resulst Else vPrc_Resulst End;

    --dbms_output.put_line('CENDOC库人员基本信息同步-{S_Pkg_PixPatInfo.Prc_Pix_GxGrDAH}结束');



Procedure Prc_Pix_GxGrDAH     (Resulst Out Integer, vTaskId In Varchar2) Is

    vPrc_Name   Varchar2(100);

    script      Varchar2(8000);

    sql_log     Varchar2(8000);

    vTable      Varchar2(200);

    vRow_Ins    Integer;

    vRow_Upd    Integer;

  Begin

    vPrc_Name:='Prc_Pix_GxGrDAH';

    Resulst := 0;



    vTable:='TB_CENTER_INFO';



    --04 个人档案相关物化视图更新

    Script:='Truncate Table DAH_INDEX';

    --dbms_output.put_line(script);

    Execute Immediate Script;

    dbms_mview.Refresh('DAH_INDEX','Complete');

就是这里,能看到上一步的日志,然后这个刷新的物化视图里查不到数据,应该是卡在刷新这里,我的包里还有其他三个物化视图这么刷新的,前两个都可以刷的,之前也刷新过,

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

TOP技术积分榜 社区积分榜 徽章 电子杂志 团队 统计 虎吧 老博客 知识索引树 读书频道 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档 | IT博客
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛 | SAP ERP系统
CopyRight 1999-2011 itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有 联系我们 网站律师 隐私政策 知识产权声明
京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:1101082001 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表