来源:蜘蛛抓取(WebSpider)
时间:2017-01-03 13:45
标签:
win7黑屏解决办法
关于存储过程中调用了自定义的一个函数,速度超慢,请教如何解决的搜索推荐 -oracle-TryCatch
>> 相关推荐
关于的搜索推荐
我在oracle中写了一个存储过程,并在存储过程中调用了一个自定义的一个函数,但是速度就慢下来了,如果不调用自定义函数就很快。请教各位大虾这是怎么回事,如何解决?十分感谢!
引用楼主yiyu918的回复:
我在oracle中写了一个存储过程,并在存储过程中调用了一个自定义的一个函数,但是速度就慢下来了,如果不调用自定义函数就很快。请教各位大虾这是怎么回事,如何解决?十分感谢!
单独执行函数是个什么情况呢?
单独执行函数快一些,需要2秒多一点
看不到内容,想不出对策
我写好了一个函数,一个存储调用之后速度变的很慢,但是我把存储过程COPE到SQL窗口来运行,并且给它一样的参数,速度很快,请问是什么原因
------------
我做的系统大概是这样一个结构.主表A子表(B,C,D等等很多个)比如有港口表.银行表,船期表等等,大概有20多个这样的基本表,这些子表的设计结构基本上都是code,codena...
我的后台数据库是sqlserver,在连锁店那边盘点的时候调用了三个存储过程,先从多个复杂表中查得数据,分别插入到三张表中,然后数据窗口读取三张表中的数据.其中必然...
我在存取过程中调用了另外的存取过程,结果多返回一个结果集,请问怎么过滤掉这个结果集
------------
你调用别的存储过程时,不能直接调用,只要获取返回值就可...
ExtJs中tabpanel用了autoLoad加载一个gridpanel页面之后,gridpanel的速度会很慢,分页慢得像蜗牛,请问怎么解决?望指点!
------------
是因为数据量很大吗?...
如题 求高手 深入解析我用宏定义一个对象 调用了构造函数 调用了成员函数 但是整个程序结束的时候 为什么没有调用析构函数
------------
你的代码 在哪儿?我表...
在一个存储过程中怎样调用一个自定义函数返回的表变量给个列子
------------
参考如下:CREATEFUNCTIONdbo.function1(@paraint)RETURNS@tableTABLE(idnvarchar...
一个论坛浏览速度太慢了,把存放帖子的表改成了heap结构的,但是没有任何效果?请教各位大虾指点,heap结构要怎么做才能最大程度的提高读取速度?
------------
...
请高手简单讲讲 编这个程序:“能够查询本机所有的进程中,哪些进程中调用了特定的动态链接库”的思路和方法,多谢了,急!~
------------
---------...
SQL 1:select dbo.GetHL('USD',table.HB) HL from tableSQL 2: select (select top 1 t1.ZL/t2.ZL from t1 left join t2 on t1.id=t2.id where t1.HB='USD\...
进程函数UINT Write(LPVOID pParam) {while(a--==0){
CBDlg::OnReg();a=10;}} 想调用对话框中的按钮对应得到私有函数CBDlg::OnReg(),应...
我有4个表,A表有500条数据, B表有8条,C表有3条, D表有6条,现在用交叉组合成72000条数据,写入另外一个表中,用存储过程实现,耗时50秒左右,这个速度算不算...
请教各位大师,如何自定义INTERBASE 数据库函数?,请给个例人吧!多谢了!!!...
这问题很简单
但是我不会
呜呜CREATE FUNCTION GetJXCTJRuKu(@cpid int,@tjrq datetime)RETURNS floatASBEGINdeclare @ruku floatselect @ruku=(select RuKuS...
请教:在自定义全局函数中,如何通过参数传递自定义用户对象的动态数组?
------------
uo_1 aa[]f_user(aa)
aa 类型为uo_1是这个意思吗?
------------大家有什么好的存储过程优化方法吗?该如何解决 - Sql Server当前位置:& &&&大家有什么好的存储过程优化方法吗?该如何解决大家有什么好的存储过程优化方法吗?该如何解决&&网友分享于:&&浏览:3次大家有什么好的存储过程优化方法吗?公司里有个存储过程,写了几千行代码。其中用了10几张临时表。很多临时变量。我想问下大家,平时写存储过程有没有什么好的优化方法,经验呢?希望大家说的方法越多越好。------解决方案--------------------
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/songguozhi/archive//5883191.aspxSQL code
优化存储过程有很多种方法,下面介绍最常用的7种。
1.使用SET NOCOUNT ON选项
我们使用SELECT语句时,除了返回对应的结果集外,还会返回相应的影响行数。使用SET NOCOUNT ON后,除了数据集就不会返回额外的信息了,减小网络流量。
2.使用确定的Schema
在使用表,存储过程,函数等等时,最好加上确定的Schema。这样可以使SQL Server直接找到对应目标,避免去计划缓存中搜索。而且搜索会导致编译锁定,最终影响性能。比如select * from dbo.TestTable比select * from TestTable要好。from TestTable会在当前Schema下搜索,如果没有,再去dbo下面搜索,影响性能。而且如果你的表是csdn.TestTable的话,那么select * from TestTable会直接报找不到表的错误。所以写上具体的Schema也是一个好习惯。
3.自定义存储过程不要以sp_开头
因为以sp_开头的存储过程默认为系统存储过程,所以首先会去master库中找,然后在当前数据库找。建议使用USP_或者其他标识开头。
4.使用sp_executesql替代exec
原因在Inside Microsoft SQL Server 2005 T-SQL Programming书中的第四章Dynamic SQL里面有具体描述。这里只是简单说明一下:sp_executesql可以使用参数化,从而可以重用执行计划。exec就是纯拼SQL语句。
5.少使用游标
可以参考Inside Microsoft SQL Server 2005 T-SQL Programming书中的第三章Cursors里面有具体描述。总体来说,SQL是个集合语言,对于集合运算具有较高的性能,而Cursors是过程运算。比如对一个100万行的数据进行查询,游标需要读表100万次,而不使用游标只需要少量几次读取。
6.事务越短越好
SQL Server支持并发操作。如果事务过多过长,或是隔离级别过高,都会造成并发操作的阻塞,死锁。此时现象是查询极慢,同时cup占用率极低。
7.使用try-catch来处理错误异常
SQL Server 2005及以上版本提供对try-catch的支持,语法为:
----your code
begin catch
--error dispose
一般情况可以将try-catch同事务结合在一起使用。
begin tran
--…………
begin catch
--if error
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有用存储过程更新30万条数据,用了7个小时,有没有更好的方法 - 开源中国社区
当前访客身份:游客 [
当前位置:
CREATE OR REPLACE
PROCEDURE P_REPORT_CUST_VALID IS
RETAIL_NUM NUMBER ;
ENGINEER_NUM NUMBER ;
NUM NUMBER ;
CUSTOMER_INFO_ID NUMBER ;
J NUMBER ;
CURSOR SHOP_NUM IS SELECT * FROM CUST_SHOP_INFO_DETAIL ;
FOR C_SHOP_NUM IN SHOP_NUM LOOP
J := J + 1 ;
nvl(SUM(C.RETAIL_NUM),0)
r INTO RETAIL_NUM
PSI_SALES_C C
C.CUST_SHOP_DETAIL_ID = C_SHOP_NUM.SHOP_DETAIL_ID
AND TO_CHAR (
C.CREATED_DATE,
'yyyy-MM-dd'
) &= TO_CHAR (
ADD_MONTHS (SYSDATE ,- 3),
'yyyy-MM-dd'
nvl(SUM(C.ENGINEER_NUM),0)
E INTO ENGINEER_NUM
PSI_SALES_C C
C.CUST_SHOP_DETAIL_ID = C_SHOP_NUM.SHOP_DETAIL_ID
AND TO_CHAR (
C.CREATED_DATE,
'yyyy-MM-dd'
) &= TO_CHAR (
ADD_MONTHS (SYSDATE ,- 3),
'yyyy-MM-dd'
nvl(b.CUSTOMER_INFO_ID,0) sd INTO CUSTOMER_INFO_ID
CUST_SHOP_INFO b
b.SHOP_INFO_ID = (
A .SHOP_ID
CUST_SHOP_INFO_DETAIL A
A .SHOP_DETAIL_ID = C_SHOP_NUM.SHOP_DETAIL_ID
NVL (SUM(D .NUM), 0) INTO NUM
PSI_SALES_B D
D .FH_CUSTOMER_ID = CUSTOMER_INFO_ID
AND TO_CHAR (
D .CREATED_DATE,
'yyyy-MM-dd'
) &= TO_CHAR (
ADD_MONTHS (SYSDATE ,- 3),
'yyyy-MM-dd'
RETAIL_NUM = 0
AND ENGINEER_NUM = 0
AND NUM = 0
UPDATE CUST_SHOP_INFO_DETAIL csid
SET CSID.IS_VALID = '1'
CSID.SHOP_DETAIL_ID = C_SHOP_NUM.SHOP_DETAIL_ID ;
UPDATE CUST_SHOP_INFO_DETAIL csid
SET CSID.IS_VALID = '0'
CSID.SHOP_DETAIL_ID = C_SHOP_NUM.SHOP_DETAIL_ID ;
END LOOP ;
END P_REPORT_CUST_VALID ;
更新1000条数据大概三分钟,该怎么修改?
共有13个答案
<span class="a_vote_num" id="a_vote_num_
有没有大神,会的
<span class="a_vote_num" id="a_vote_num_
CURSOR SHOP_NUM IS SELECT * FROM CUST_SHOP_INFO_DETAIL ; 这个语句有问题, 你这样是全部一次性加载所有数据,不够效率,你可以使用分页,或者循环查询,你先试试只查询 200条一次,然后循环更新耗时多久,都可以打印日志
--- 共有 1 条评论 ---
怎么循环查询?不太懂
(6个月前) &
<span class="a_vote_num" id="a_vote_num_
分页批量更新数据提交事务。没有必要使用&RETAIL_NUM 这些中间变量,大概看了下,这些都可以作为最外层&CURSOR SHOP_NUM IS SELECT * FROM CUST_SHOP_INFO_DETAIL 的筛选条件。如果日期列是日期类型不是varchar类型,最好不要使用to_char转换成字符串比较,直接使用日期类型进行比较。你可以大概介绍下主要逻辑,其他人理解起来方便些。
--- 共有 2 条评论 ---
: 用一个变量记录处理了多少条数据,每 100(可以根据实际处理速度进行调整) 条提交事务。
(6个月前) &
如何分页提交事物?
(6个月前) &
<span class="a_vote_num" id="a_vote_num_
游标SHOP_NUM只用了SHOP_DETAIL_ID字段,那就只查询这一个字段就行了
LOOP中的前两条查询语句是对同一张表操作的,写到一起
where .. and .. 比较and连接的两部分哪部分查询起来快,快的放前面
比较日期不要to_char
<span class="a_vote_num" id="a_vote_num_
我就不说别的。
&&&&&&&&C.CREATED_DATE,
&&&&&&&&'yyyy-MM-dd'
&&&&) &= TO_CHAR (
&&&&&&&&ADD_MONTHS (SYSDATE ,- 3),
&&&&&&&&'yyyy-MM-dd'
这个SQL效率得有多糟糕。而且你需要把所有的记录都走一遍游标再判断吗?这么多全表扫描,真是要死人了。
<span class="a_vote_num" id="a_vote_num_
你应该把业务需求和场景说清楚吧, 各个表之间的关系,还有数据量多少等。
你用写程序的思维去写SQL,用游标去循环30万次,性能肯定上不去。
--- 共有 1 条评论 ---
(6个月前) &
<span class="a_vote_num" id="a_vote_num_
一条SQL就可以解决的事,非要用游标去处理。就算你游标里的SQL执行效率再高,循环30万次也要慢得跟蜗牛一样
--- 共有 1 条评论 ---
对每条数据进行计算,如何用一条sql写出来?
(6个月前) &
<span class="a_vote_num" id="a_vote_num_
CREATE OR REPLACE
PROCEDURE P_REPORT_CUST_VALID IS
RETAIL_NUM NUMBER ;
ENGINEER_NUM NUMBER ;
NUM NUMBER ;
CUSTOMER_INFO_ID NUMBER ;
J NUMBER ;
CURSOR SHOP_NUM IS SELECT CS.SHOP_DETAIL_ID FROM CUST_SHOP_INFO_DETAIL
FOR C_SHOP_NUM IN SHOP_NUM LOOP
J := J + 1 ;
--计算零售量
nvl(SUM(C.RETAIL_NUM),0)
r INTO RETAIL_NUM
PSI_SALES_C C
C.CUST_SHOP_DETAIL_ID = C_SHOP_NUM.SHOP_DETAIL_ID
C.CREATED_DATE &= ADD_MONTHS (SYSDATE ,- 3);
--计算工程量
nvl(SUM(C.ENGINEER_NUM),0)
E INTO ENGINEER_NUM
PSI_SALES_C C
C.CUST_SHOP_DETAIL_ID = C_SHOP_NUM.SHOP_DETAIL_ID
AND C.CREATED_DATE &= ADD_MONTHS (SYSDATE ,- 3);
--计算批发量
nvl(b.CUSTOMER_INFO_ID,0) sd INTO CUSTOMER_INFO_ID
CUST_SHOP_INFO b
b.SHOP_INFO_ID = (
A .SHOP_ID
CUST_SHOP_INFO_DETAIL A
A .SHOP_DETAIL_ID = C_SHOP_NUM.SHOP_DETAIL_ID
NVL (SUM(D .NUM), 0) INTO NUM
PSI_SALES_B D
D .FH_CUSTOMER_ID = CUSTOMER_INFO_ID
D .CREATED_DATE
ADD_MONTHS (SYSDATE ,- 3) ;
RETAIL_NUM = 0
AND ENGINEER_NUM = 0
--AND NUM = 0
INSERT INTO CUST_VALID(CUST_SHOP_D_ID,IS_VALID)VALUES(C_SHOP_NUM.SHOP_DETAIL_ID,'1');
INSERT INTO CUST_VALID(CUST_SHOP_D_ID,IS_VALID)VALUES(C_SHOP_NUM.SHOP_DETAIL_ID,'0');
END LOOP ;
END P_REPORT_CUST_VALID ;
我这个场景是 &有一个表CUST_SHOP_INFO_DETAIL&大概30万条数据,根据需求,我要每一条都要判断是否有效,而计算是否有效,就要查询PSI_SALES_C 和 PSI_SALES_B&对应的数据进行判断,我通过测试,就是在查询PSI_SALES_B&这个表的时候,速度立马降下来了,我把它注释掉,时间只用0.68秒,如果加上注释的部分,大概一分钟,不过PSI_SALES_C 大概1600万条数据,而PSI_SALES_B&大概仅300万条数据。
--- 共有 1 条评论 ---
我把更新变为新插入到一个表中
(6个月前) &
<span class="a_vote_num" id="a_vote_num_
把游标改一下,存储过程中出现游标是个大问题,你可以在游标的地方加上:
v_begintime:=to_char(sysdate,'yyyy-mm-dd hh24:mi:ss');
& // 你的逻辑sql
v_endtime:=to_char(sysdate,'yyyy-mm-dd hh24:mi:ss');
试试就出来了,哪里比较耗时
<span class="a_vote_num" id="a_vote_num_
不去学习使用查询计划分析性能,使用统计信息分析性能,帮你解决再多这样的问题都是白搭。
更多开发者职位上
有什么技术问题吗?
开源中国...的其它问题
类似的话题2013年4月 Oracle大版内专家分月排行榜第二2013年3月 Oracle大版内专家分月排行榜第二2010年5月 Oracle大版内专家分月排行榜第二
2013年1月 Oracle大版内专家分月排行榜第三2011年12月 Oracle大版内专家分月排行榜第三2010年8月 Oracle大版内专家分月排行榜第三2010年4月 Oracle大版内专家分月排行榜第三2010年3月 Oracle大版内专家分月排行榜第三
2013年4月 Oracle大版内专家分月排行榜第二2013年3月 Oracle大版内专家分月排行榜第二2010年5月 Oracle大版内专家分月排行榜第二
2013年1月 Oracle大版内专家分月排行榜第三2011年12月 Oracle大版内专家分月排行榜第三2010年8月 Oracle大版内专家分月排行榜第三2010年4月 Oracle大版内专家分月排行榜第三2010年3月 Oracle大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。