当前位置:首页 » 服务存储 » 程序调用存储过程很慢
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

程序调用存储过程很慢

发布时间: 2022-12-09 23:54:45

存储过程比sql语句慢的问题,痛苦中.....

1首先存储过程是预编译,按理说应该会比程序运行的语句效率高,如果时间反而长的话,可能是统计信息没有及时更新导致优化器给存储过程与单语句生成了不同的查询计划,而用片面的统计信息生成的查询计划会导致索引利用率低效,试试更新统计信息或者重建/重组索引
2一次提交查询6、7百次?这样的系统我还未见过,如果可以的话,现将需要的表数据缓存到服务器或者本地内存中,在内存中进行数据的操作,当然存储过程对复杂的查询会有一定的优化效果的

② c# 调用oracle存储过程时快时慢 请各位路过的大侠帮忙解解

原因很多,可能是负荷问题,锁表问题或者其他。。总之出现多次几分钟出不来的情况,你就先考虑优化它。。。
分步执行你的存储过程,看看慢在哪个SQL上。。一般给报表写存储过程,要在第一步提取出最小范围的数据放到临时表,之后全部的处理过程都对该临时表操作,不再涉及任何实表,先看看这一点你做到了没有。。
如果做到了,问题基本就是在第一步提取数据的时候慢,那就专门对那个SQL看看有没有走索引,需要的情况下拆分SQL,分步提取数据

③ oracle存储过程执行速度很慢是什么原因

解决办法:你需要对你的表根据查询条件设计相应的索引,有时候根据需要可能一个表你需要建立好几个索引都是有可能的。然后再执行,你会发现原来要30几秒的现在零点几秒就可以搞定了,这跟使用游标没什么关系。游标的使用完全由你的应用需要决定,我相信能不用的你肯定不会选择使用游标处理,一般是实在没办法的情况下才选择游标去做。 你查询慢的原因是你在存储过程中执行的话,没有索引时,他会一条一条查知道把80几万条数据全部扫描一遍直到查完了你才看到一个结果,但是你在外面单独执行很快的原因是plsql他会首先去查查到几条数据就先给你返回来,所以你马上就看到结果了,但实际上查询也并没有结束,你要是数据很多的情况下你往下拉,你会发信很慢,其实查询过程根本就还没有结束。 总之写存储过程第一步是会写,第二步是要做好优化,否则当你的数据量很大的时候你的过程写的不好的话问题会马上暴露出来

④ 同样一个存储过程,为什么第一次快,第二次就很慢

sql是高级语言,数据库系统执行sql之前要将sql语句进行解析(相当于编译),这个过程叫硬解析;数据库系统每次执行sql之前都会检查共享池中是不是存在已经解析过的语句,如果有就拿来直接用,这叫软结息。软解析比硬解析效率高,这是影响因素之一;
二、第一次执行可能没有走索引,第二次执行使用第一次执行的执行计划
三、看你的存储过程做了些什么,有可能第一次把活干完了,导致第二次执行没什么活干
以上回答基于oracle体系结构

⑤ 单独执行很快,为什么在存储过程里面执行很慢

慢的原因是你在对List的循环中使用了List的get函数.
典型的"Shlemiel喷涂算法",所以越跑越慢啊.
List里是一个链表,get方法会从头一个个地数,越到后面,数的时间就越长.所以会慢..
你应该修改方式,用下面的方法进行循环:
for(Iterator it = list.iterator(); it.hasNext() ;){
Map map = (Map)it.next();
// ...
}

⑥ 三菱plc读取程序为何勾选了软元件存储器很慢

三菱plc读取程序勾选了软元件存储器很慢的原因为内存过大。PLC程序由指令和软元件组成,指令的功能是发出命令,软元件是指令的执行对象。

⑦ 为什么存储过程比直接执行sql语句要慢很多

因为存储过程只需要编译一次
之后运行这个存储过程就不需要在编译了
但是SQL语句每次都要编译
在程序里
使用存储过程
可以减少网络传输量

⑧ SQL2000的数据库附加到SQL2005后,前台程序调用存储过程速度非常慢

2000和2005有些地方兼容性不是很好,除非是简单的信息,一般直接升级都会有问题,需要查到问题点,手动解决,不能期望他自己解决。

⑨ JDBC执行存储过程异常慢

1.connection不知道你是采用什么方式获取的,如果不是从连接池里取,你每connection.close()一次,下次get的时候会重新建立实际物理链接,这样会相当耗时。所以你检查一下是在获取connection时耗的时间多,还是在execute的时间多。代码:
long startTime = System.currentTimeMillis();
conn = getConnection(); // execute();
long endTime = System.currentTimeMillis();
System.out.println("获取链接的时间:" + (endTime - startTime));
执行的类似;

2.从你的存储过程的逻辑来说,要条件查询,更新某个字段的值,和入库,这三个步骤应该有输入参数的,那么你的这个参数是怎么传入的?
个人觉得你的这个存储过程可以优化成SQL来执行,效率应该会更好:
首先,你把输入参数放入一个临时表;
比如结构是:
_id _field
查询的条件 更新的字段

// 更新_table中存在的记录的_field字段,并且只更新_table与_tmp键值相等的记录
UPDATE _table t SET _field=(SELECT MAX(_field) FROM _tmp WHERE _id=t._id) WHERE EXISTS (SELECT 'X' FROM _tmp WHERE _id=t._id);

// 选择_table与_tmp键值不相等的记录(即_table中不存在的记录)插入_table
INSERT INTO _table (_id,_field) (SELECT _id,_field FROM _tmp t WHERE NOT EXISTS (SELECT 'X' FROM _table WHERE _id=t._id));

这样的话,每次都是两个批量操作,而且不需要输入参数,直接调用就可以,唯一需要多做的工作就是做临时表。