精华内容
下载资源
问答
  • 存储过程重新编译一直卡死

    万次阅读 2016-06-12 11:20:55
    重新刷新了物化视图,存储过程无法重新编译 --跟踪PLSQL会话,kill掉正active和inactive的会话。 --结果还卡死 --查询会话状态 select distinct status from v$session; --查询已经kill掉的会话 ...
    一次修改dblink密码,导致所有物化视图存储过程失效,运行存储过程卡死.重新刷新了物化视图,存储过程无法重新编译
    

    --跟踪PLSQL会话,kill掉正active和inactive的会话。
    --结果还卡死


    --查询会话状态
    select distinct status from v$session;


    --查询已经kill掉的会话
    select * from v$session a where   a.status = 'KILLED'


    --查询是否存储已经kill掉的会话存在进程在跑
    select b.SPID from v$session a, v$process b where a.PADDR = b.ADDR and  a.status = 'KILLED'


    --存在登陆数据库
    sqlplus / as sysdba


    --查询spid 进程
    !ps -ef | grep 18110
     
     --杀死进程
    !kill -9 18110




    --重新编译
    alter procedure xxx compile;





    展开全文
  • 存储过程包含一组复杂的SQL语句,使生成存储过程的执行计划的代价有些高。因此通常重用存储过程的执行...1、产生存储过程重新编译的要素 为提高SQL性能,不仅仅是只注意SQL语句写法问题,也不仅是意味者提高硬件要...

      存储过程包含一组复杂的SQL语句,使生成存储过程的执行计划的代价有些高。因此通常重用存储过程的执行计划来代替生成新计划是有利的。但是有时候现有的计划可能不适用或者在重用期间可能不能提供最佳的处理策略。SQL Server重编译存储过程中的语句来生成一个新的执行计划以解决这个问题。

    1、产生存储过程重新编译的要素   为提高SQL性能,不仅仅是只注意SQL语句写法问题,也不仅是意味者提高硬件要求,我们也必须要关注存储过程编译的时机,以及影响存储过程重新编译的起因,也是改进性能的一项不可避免的因素。
       影响存储过程重新编译因素:
      a、存储过程语句中引用常规表、临时表或视图架构变化(索引修改、创建……)
      b、表索引或列上统计变化超过一定的阈值
      c、存储过程编译时一个对象不存在,但是在执行期间创建
      d、执行计划老化并释放
      e、表列上绑定值变化
      f、 环境变化(Set)
      g、参数的不确定性

    2、表列上绑定值的变化
      表结构如下:创建一张表并设置DateTimes默认值为当前时间 ,创建存储过程信息如下

      修改Test表中DateTimes绑定值信息,并执行,使用SQL Profiler工具查看存储过程执行的信息(进行了重新编译)


    3、存储过程语句中引用常规表、临时表或视图架构变化(索引修改、创建……)  当存储过程中的临时表……架构等发生变化也会导致存储过程重新编译。当我们修改了表架构时,原有的执行计划引擎将会被SQL放弃,当执行这个存储过程时,SQL Server会自动检测架构是否修改并重新编译。


    4、表索引或列上统计变化超过一定的阈值  Sqlserver 查询是基于开销查询的,在首次生成执行计划时是基于多阶段的分析优化才确定出较好的执行计划。而这些开销的基数估计,是根据统计信息来确定的。统计信息其实就是对表的各个字段的总体数据进行分段分布数据库默认都会自动维护。如何查看表的统计信息(展开表->选择统计信息->右键属性)
      当统计数超过阈值是就会引起存储过程重新编译,(BUT)但是重新编译可以生成一个与之前完成想同的执行计划这样,重新编译的开销就是额外的开销应当避免;如何避免不必要编译这里提供两种方法(未重新编译):
      1、保持原有的执行计划方案(keepfixedPlan)
      2、关闭表自动统计信息(sp_autostats)


    5、执行计划老化并释放  SQL Server通过维护缓冲中执行计划的寿命来管理存储过程缓冲的大小,如果一个存储过程长时间未被重新执行,执行计划的寿命字段将下降为0,内存短缺时将把该计划从缓冲中删除。当这种情况发生并且存储过程被重新执行时,将生成一个新计划并将其缓冲到过程缓冲中,如果系统中有足够的内存,未使用的计划在内存压力增加之前不会被删除。
      查询缓存执行计划方式:
      Sys.dm_exec_cached_plans:    包含缓存的执行计划,每个执行计划对应一行。
      Sys.dm_exec_plan_attributes: 这是一个系统函数,每一个执行计划都对应着一些属性,在这个系统函数中包含着这些属性。
      Sys.dm_exec_sql_text:             这是一个系统函数,返回文字格式的执行计划。
      Sys.dm_exec_query_plan:        这是一个系统函数,返回xml格式的执行计划。
      删除缓存方式:
      清除全局缓存使用下面的语句: 
      DBCC DROPCLEANBUFFERS;
      从全局缓存中清除执行计划,使用下面的语句: 
      DBCC FREEPROCCACHE;
      清除某一个数据库中的执行计划,使用下面的语句: 
      DBCC FLUSHPROCINDB(<db_id>);
      清除一个特定的执行计划使用下面的语句: 
      DBCC FREESYSTEMCACHE(<cachestore>);


    6、环境变化(Set)  所谓环境变化指的是SQL SERVER ManageMent Studio开发环境设置的变化


    7、参数的不确定性  参数不确定性就很简单了,在不少的存储过程中都会编写部分的业务逻辑信息,进行SQL拼接操作,但是不正当的拼接就会降低存储过程的性能,导致执行存储过程执行时执行计划中多出一步重新编译操作从而降低了存储过程的性能(案例见:高效安全式SQL拼接)

    8、重新编译执行时机

    学习了影响存储过程重新编译因素后,有不少开发人员会问我们什么时候该让存储过程进行编译什么时候又不该让其编译换句话来说,重新编译应在什么时候执行??
       a、当使用表(或对应的统计)中数据的分布变化或者表中添加了新的索引时。这时为查询计划生成了一个策略提高了查询性能时需重新编译不要使用缓存计划;
       b、当删除一个对查询性能没有任何影响的索引时,这时对此查询没有任何影响时就不需要重新译否则降低了缓冲效率添加了CPU额外的开销

    9、操作存储过程编译的方式  a调用sp_recompile系统存储过程(exec sp_recompile 'Test')对指定的表每次使用时进行编译


      b、使用WITH RECOMPILE子句(强制数据库引擎每次重新生成执行计划,针对特定的存储过程、或某一个比较特殊的存储执行才会使用;使用With Recompile 生成的计划不会被缓存,也不会影响到原缓存的计划),


      c、使用OPTIMIZE FOR查询提示(RECOMPILE方式提供了完全不使用计划缓存的节奏。但有些时候特性谓语的执行计划被使用的次数很多,仅仅那些谓语条件产生大量返回结果集的参数编译,我们可以考虑Optimize For参数)


      使用了该参数会使得缓存的执行计划按照OPTIMIZE FOR后面的谓语条件来生成并缓存执行计划,这也可能造成不在该参数中的查询效率低下,但是该参数是我们选择的,因此通常我们知道哪些谓语条件会被使用的多一些。

     

    转载于:https://www.cnblogs.com/tx720/p/5965930.html

    展开全文
  • oracle 存储过程重新编译方法

    千次阅读 2017-11-09 22:16:00
    随笔:工作之余写的一个小方法,... 左侧工具栏中选择“存储过程”-》选择已经失效的procedure-》右键-》选择重新编译 即可完成 第二种 命令行版 1.查找到无效对象 select 'Alter '||object_type||' '||object_name...

    随笔:工作之余写的一个小方法,方便忘了的时候查看

    第一种  如果你使用 PL/SQL Developer工具 
          左侧工具栏中选择“存储过程”-》选择已经失效的procedure-》右键-》选择重新编译 即可完成


    第二种  命令行版
    1.查找到无效对象
    select 'Alter '||object_type||' '||object_name||' compile;' from user_objects where status = 'INVALID';

    2.重新编译存储过程 pro_backup_call 执行下面脚本即可
    alter procedure pro_backup_call compile;


    Leonarding刘盛

    2014.04.18

    北京&spring

    分享技术~成就梦想

    Blogwww.leonarding.com





     本文转自 ztfriend 51CTO博客,原文链接:http://blog.51cto.com/leonarding/1397900,如需转载请自行联系原作者

    展开全文
  • oracle 存储过程不能编译– (编译的同时正在访问所导致的) 1.SELECT * FROM VDBOBJECTCACHEWHEREname=′NCCMMEDICALUSERSTATS2′ANDLOCKS!=′0′;2.selectSIDfromVDBOBJECTCACHEWHEREname=′NCCMMEDICALUSERSTATS...

    oracle 存储过程不能编译-- (编译的同时正在访问所导致的)

    1.SELECT * FROM V$DB_OBJECT_CACHE WHERE name='NCCM_MEDICAL_USERSTATS2' AND LOCKS!='0';
    2.select SID from V$ACCESS WHERE object='NCCM_MEDICAL_USERSTATS2';
    3.SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='135';
    4.alter system kill session '135,50430' immediate;
    

    在对存储过程进行访问、运行、测试的时候,没有完全停止,就又在另外一个窗口,对它进行修改而且进行编译,出现了卡死现象。用PLSQL Developer 在session里,找到这条session的记录,然后kill后,再重新编译这个过程,还是卡死,可是在session里这条记录已经是显示killed状态,那就通过下面的方法进行解决:

    1:查V$DB_OBJECT_CACHE

    SELECT * FROM V$DB_OBJECT_CACHE WHERE name='TASK_1002' AND LOCKS!='0'; 
    

    注意:P_DATA_SYNC_CHECK为存储过程的名称。

    发现locks=2,

    2:按对象查出sid的值

    select SID from V$ACCESS WHERE object='TASK_1002';
    

    注意:P_DATA_SYNC_CHECK为存储过程的名称。

    3:查sid,serial#

    SELECT SID,SERIAL#,PADDR FROM V$SESSION WHERE SID='122';
    

    4:alter system kill session 'sid值,serial#值' immediate;

    展开全文
  • .NET调用存储过程时,有时候变的很慢甚至timeout,但是再执行一下存储过程,再调用就很快。   解决办法: 1. 在可能比较耗时的语句...该存储过程将在每次执行时都重新编译。当存储过程的参数值在各次执行间都
  • 此前负责的部分项目使用的是sql server 数据库,现场导致经常遇到一个问题,一个存储过程语句拉出来运行数据正常,但执行存储过程发现数据有问题。坑了许久才想到需要重新编译存储。 特此备忘,防止掉坑。 exec sp_...
  • SQL优化:重新编译存储过程和表

    千次阅读 2016-04-27 13:53:21
    最近发现原来执行很快的存储过程,突然慢了下来,而很多存储过程每天就运行一次,所以打算把存储过程重新编译,另外,考虑到数据在不断变化,所以也要更新表的统计信息,这样能生成比较好的执行计划。 下面是具体...
  • 最近将系统中一个存储过程错误的覆盖编译了,于是上网找了下如何恢复错误覆盖的存储恢复:1、设置环境:set echo on;set feedback on;set trimspool off;set linesize 120;set pagesize 2000;set newpage 1;set ...
  • Oracle存储过程本地编译方式

    千次阅读 2014-03-18 00:00:54
    通常将Oracle存储过程编译为本地编译方式的测试记录.  测试用表: SQL> create table t1(rid number); Table created SQL> create table t_n(rid number); Table created测试用的存储过程: create or ...
  • 存储过程需要修改编译的时候卡死,并且里面的子过程也都编译不了。job删除了,过程还是编译不了,也查不到锁表信息!报错信息如下:[img=https://img-bbs.csdn.net/upload/201711/17/1510926131_767245.png][/img]...
  • 1.查看存储过程编译无效的原因 show errors procedure hr.getperson; 2.指定一个存储过程进行编译 alterprocedure hr.getperson compile; 转载于:https://www.cnblogs.com/want990/p/9478593.html...
  • ORACLE存储过程

    万次阅读 多人点赞 2018-11-02 18:14:48
    oracle存储过程 目录 一.什么是存储过程 二.为什么要写存储过程 三.存储过程基础 1.存储过程结构 2.存储过程语法 3.pl/sql处理存储过程 四.存储过程进阶 1.BUIK COLLECT 2.FORALL 3.pl/sql调试存储过程 ...
  • 存储过程编译不过去常见的情况大致可能分为三种情况 1.存储过程中查询的对象被锁住,杀掉对应对象占用的锁即可,此步需要查看具体语句判断。 2.此存储过程在library cache中被调用被加上s锁但是如果此时编译...
  • 1、存储过程举例: demo set serveroutput on create procedure demopro as begin update demo set age ='20' where id = '20'; dbms_output.put_line('修改年龄成功'); end; / 如果成功,则输出:Procedure ...
  • linux系统中使用shell脚本对oracle存储过程进行编译
  • 如何track存储过程编译次数

    千次阅读 2012-08-11 20:27:05
    Server中哪些存储过程变重编译的次数最多的:   --Gives you the top 25 stored procedures that have been recompiled.   select top 25 sql_text.text, sql_handle, plan_gene
  • Oracle存储过程编译卡死的解决方法

    千次阅读 2017-11-20 19:54:47
    这种情况下如果强行终止存储过程编译,再次Recompile存储过程发现还是挂死的,这个主要是由于强行终止后会话为INACTIVE状态,但是该会话却没有被真正的释放。使用如下语句查询出挂起的会话: SELE
  • 分析存储过程编译的起因以及避免 为了改进性能,分析重编译的起因很重要。往往,重编译可能并不需要,可以避免它以改进性能。了解导致重编译发生的不同条件有助于评估重编译的起因,并决定在重编译不必...
  • Oracle 存储过程 无法编译 解决方法

    万次阅读 2012-03-30 18:02:07
    昨天整理了一下shutdown过程中db hang住的问题,参考:Oracleshutdown 过程中 DBhang住 解决方法http://blog.csdn.net/tianlesoftware/article/details/7407587 今天同事修改存储过程又导致2个过程无法被编译,流程...
  • 今天同事修改Oracle存储过程又导致2个过程无法被编译,流程规范上的东西,Dave 这里不多说,看看怎么解决问题。   1. 查看无效对象 XEZF@xezf(qs-xezf-db1)&gt; select object_name,object_type,status ...
  • 在对存储过程进行test的时候,没有完全停止,就又在另外一个窗口,对它进行修改而且进行编译,出现了卡死现象。用PLSQL Developer 在session里,找到这条session的记录,然后kill后,再重新编译这个过程,还是卡死,...
  • 查找存储过程OPERATIONDATA_IMP(存储过程名)被哪些session锁住而无法编译select * FROM dba_ddl_locks where name =upper('OPERATIONDATA_IMP');从而得到session_id,然后通过select t.sid,t.serial# from v$...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 349,651
精华内容 139,860
关键字:

修改存储过程会重新编译吗