超时已过期,200分

时间:2021-09-22 11:10:37
有两个相同的库表结构的数据库,现在要合并其中的一些数据。
cn1 是A公司的
cn2 是B公司的
我的思路是:
第一步.建立一个公共的临时表public_jk_jnl,这个表放在cn1 所在的数据库中
第二步.在A公司的数据库中,将需要的数据先插入到临时表#Jk_Jnl,经过一些筛选或者更新处理后,再插入到publicc_jk_jnl
第三步.在B公司的数据库中,将需要的数据先插入到临时表#Jk_Jnl,经过一些筛选或者更新处理后,再插入到publicc_jk_jnl

可能第一段是A公司的数据比较少吧,一般几百行,我每次执行第一段都是成功的;但是大多数时候执行到第二段的时候,就提示"超时已过期"。第一段代码总之从来不出错   就是第二段红色标记的80%的时间会出错。
其实第二段代码运行筛选B公司的数据,它数据也不多,不超过2千行就报错。

第一段代码
cn1.execute "delete from public_jk_jnl" 
cn1.excute "if object_id('tempdb..#jK_Jnl') is not null drop table #Jk_Jnl"
cn1.execute str1  '这里不会错
cn1.execute "inert into public_jk_jnl select * from  #Jk_Jnl""
cn1.execute "drop table #Jk_Jnl"

第二段代码
cn2.excute "if object_id('tempdb..#jK_Jnl') is not null drop table #Jk_Jnl"
cn2.execute str1  ’ 运行到这里报错
cn2.execute "inert into public_jk_jnl select * from  #Jk_Jnl"
cn2.execute "drop table #Jk_Jnl"

下面是语句str1,两个数据库的str1都是一样的,str1的意思 就是把这个月做的凭证筛选出来
str1="SELECT v.FVoucherID FVoucherID,v.FEntryCount,ve.FEntryID,v.FYear,v.FPeriod,v.FDate, v.FTransDate,
 v.FGroupID, vg.FName FGroupName, v.FNumber,v.FSerialNum,v.FReference FReference, v.FExplanation FVExplanation, 
ve.FExplanation FEExplanation, ve.FAccountID FAccountID, ve.FDetailID FDetailID, a.FNumber FAccountNumber,
 a.FName FAccountName, ve.FAccountID2 FSideAccountID, b.FNumber FSideAccountNumber,
 b.FName FSideAccountName,FSideDetailID=0,a.FContact FContact, ve.FSettleTypeID,
 ISNULL(e.Fname,SPACE(0)) FSettleTypeName,ve.FSettleNo FSettleNumber, FTplTypeName=tp.FTplTypeName,
FModuleName=tp.FModuleName, ve.FTransNo , ve.FCurrencyID FCurrencyID, c.FNumber FCurrencyNumber,
 c.FName FCurrencyName, ve.FExchangeRate, ve.FDC, ve.FAmountFor FAmountFor,ve.FAmount FAmount,
v.FPosted,a.FDelete ,'aaa' as fitemnumber,'aaaa' as fitemname INTO #Jk_Jnl 
 FROM t_Voucher v INNER JOIN t_VoucherGroup vg ON v.FGroupID = vg.FGroupID
 LEFT OUTER JOIN t_VoucherTplType tp on v.FTranType=tp.FTplTypeID 
INNER JOIN t_VoucherEntry ve ON v.FVoucherID = ve.FVoucherID
 INNER JOIN t_Account a ON ve.FAccountID = a.FAccountID 
LEFT OUTER JOIN ( Select * FROM t_Account b  ) b ON ve.FAccountID2 = b.FAccountID 
INNER JOIN t_Currency c ON ve.FCurrencyID = c.FCurrencyID 
 LEFT OUTER JOIN t_Settle e ON ve.FSettleTypeID=e.FitemID AND e.FitemID<>0 
 WHERE  FDate Between '2013-03-01' AND '2013-03-31' AND a.FNumber>='1122'  AND  a.FNumber<='1122.zzzzzzz'
 AND ve.FCurrencyID =  1 "

请问有什么方法避免吗?
还有一贴一起给分
http://bbs.csdn.net/topics/391959631

12 个解决方案

#1


请将要执行的SQL语句放在查询分析器中执行。

#2


赵老师,放到SQL 语句没有问题的,其实这个问题不是每次都现,多试几次就可以了,不过客户每次都这样点,他觉得不爽。

#3


        cn2.ConnectionString ="..."
        cn2.ConnectionTimeout = 60
        cn2.CommandTimeout = 60
        cn2.Open

#4


好像可以了,我测试两天。

#5


最好把任务分为多个子任务来完成。在用户实际应用中,数据路会急剧增长,很快又会超时临界。

#6


是呀,又不行了,只成功了一次。

#7


我这个语句其实很简单,你看我的查询条件:

#8


WHERE  FDate Between '2013-03-01' AND '2013-03-31' AND a.FNumber>='1122'  AND  a.FNumber<='1122.zzzzzzz'
 AND ve.FCurrencyID =  1 " 

只查一个月的:FDate Between '2013-03-01' AND '2013-03-31'
同时只查这个月内的具体某段编码:a.FNumber>='1122'  AND  a.FNumber<='1122.zzzzzzz'
已经不能再分解了呀

#9


问题可能不在筛选上。分析测试你上面的查询代码,哪里是瓶颈。甚至可以逐次去掉一些项目,看哪里造成效率降低。

有时代码写的不合适,你的一个查询项目,就要数据库引擎遍历全表一次,加上磁盘交换,就会很慢。

#10


ConnectionTimeout 属性
      

指示在终止尝试和产生错误前建立连接期间所等待的时间。

设置和返回值

设置或返回指示等待连接打开的时间的长整型值(单位为秒)。默认值为 15。

说明

如果由于网络拥塞或服务器负载过重导致的延迟使得必须放弃连接尝试时,请使用 Connection 对象的 ConnectionTimeout 属性。如果打开连接前所经过的时间超过 ConnectionTimeout 属性上设置的时间,将产生错误,并且 ADO 将取消该尝试。如果将该属性设置为零,ADO 将无限等待直到连接打开。请确认正在对其编写代码的提供者会支持 ConnectionTimeout 功能。

连接关闭时 ConnectionTimeout 属性为读/写,而打开时其属性为只读。

CommandTimeout 属性
      

指示在终止尝试和产生错误之前执行命令期间需等待的时间。

设置和返回值

设置或返回长整型值,该值指示等待命令执行的时间(单位为秒)。默认值为 30。

说明

使用 Connection 对象或 Command 上的 CommandTimeout 属性,允许由于网络拥塞或服务器负载过重产生的延迟而取消 Execute 方法调用。如果在 CommandTimeout 属性中设置的时间间隔内没有完成命令执行,将产生错误,然后 ADO 将取消该命令。如果将该属性设置为零,ADO 将无限期等待直到命令执行完毕。请确保正在写入代码的提供者和数据源支持 CommandTimeout 功能。

Connection 对象的 CommandTimeout 设置不会对相同 Connection 上 Command 对象的 CommandTimeout 设置产生影响,即 Command 对象的 CommandTimeout 属性不继承 Connection 对象的 CommandTimeout 的值。

在 Connection 对象上,打开 Connection 后,CommandTimeout 属性将保持读/写。

#11


回复赵老师:请确保正在写入代码的提供者和数据源支持 CommandTimeout 功能。这句不理解。
回复of123老师:我上面那个语句哪里看是全表扫描呀。

#12


 t_Voucher :凭证表头 (全表30万行)
 t_VoucherEntry  凭证表头  (全表130万行)

以下是基础资料表
t_VoucherGroup  凭证字属于基础资料 (全表6行)
t_Accoun  会计科目属于基础资料,全表1000行
 t_Currency  币别  属于基础资料 全表 3行
t_Settle 结算方式  属于基础资料 全表10行
 t_VoucherTplType 单据类型 属于基础资料 全表 300行

#1


请将要执行的SQL语句放在查询分析器中执行。

#2


赵老师,放到SQL 语句没有问题的,其实这个问题不是每次都现,多试几次就可以了,不过客户每次都这样点,他觉得不爽。

#3


        cn2.ConnectionString ="..."
        cn2.ConnectionTimeout = 60
        cn2.CommandTimeout = 60
        cn2.Open

#4


好像可以了,我测试两天。

#5


最好把任务分为多个子任务来完成。在用户实际应用中,数据路会急剧增长,很快又会超时临界。

#6


是呀,又不行了,只成功了一次。

#7


我这个语句其实很简单,你看我的查询条件:

#8


WHERE  FDate Between '2013-03-01' AND '2013-03-31' AND a.FNumber>='1122'  AND  a.FNumber<='1122.zzzzzzz'
 AND ve.FCurrencyID =  1 " 

只查一个月的:FDate Between '2013-03-01' AND '2013-03-31'
同时只查这个月内的具体某段编码:a.FNumber>='1122'  AND  a.FNumber<='1122.zzzzzzz'
已经不能再分解了呀

#9


问题可能不在筛选上。分析测试你上面的查询代码,哪里是瓶颈。甚至可以逐次去掉一些项目,看哪里造成效率降低。

有时代码写的不合适,你的一个查询项目,就要数据库引擎遍历全表一次,加上磁盘交换,就会很慢。

#10


ConnectionTimeout 属性
      

指示在终止尝试和产生错误前建立连接期间所等待的时间。

设置和返回值

设置或返回指示等待连接打开的时间的长整型值(单位为秒)。默认值为 15。

说明

如果由于网络拥塞或服务器负载过重导致的延迟使得必须放弃连接尝试时,请使用 Connection 对象的 ConnectionTimeout 属性。如果打开连接前所经过的时间超过 ConnectionTimeout 属性上设置的时间,将产生错误,并且 ADO 将取消该尝试。如果将该属性设置为零,ADO 将无限等待直到连接打开。请确认正在对其编写代码的提供者会支持 ConnectionTimeout 功能。

连接关闭时 ConnectionTimeout 属性为读/写,而打开时其属性为只读。

CommandTimeout 属性
      

指示在终止尝试和产生错误之前执行命令期间需等待的时间。

设置和返回值

设置或返回长整型值,该值指示等待命令执行的时间(单位为秒)。默认值为 30。

说明

使用 Connection 对象或 Command 上的 CommandTimeout 属性,允许由于网络拥塞或服务器负载过重产生的延迟而取消 Execute 方法调用。如果在 CommandTimeout 属性中设置的时间间隔内没有完成命令执行,将产生错误,然后 ADO 将取消该命令。如果将该属性设置为零,ADO 将无限期等待直到命令执行完毕。请确保正在写入代码的提供者和数据源支持 CommandTimeout 功能。

Connection 对象的 CommandTimeout 设置不会对相同 Connection 上 Command 对象的 CommandTimeout 设置产生影响,即 Command 对象的 CommandTimeout 属性不继承 Connection 对象的 CommandTimeout 的值。

在 Connection 对象上,打开 Connection 后,CommandTimeout 属性将保持读/写。

#11


回复赵老师:请确保正在写入代码的提供者和数据源支持 CommandTimeout 功能。这句不理解。
回复of123老师:我上面那个语句哪里看是全表扫描呀。

#12


 t_Voucher :凭证表头 (全表30万行)
 t_VoucherEntry  凭证表头  (全表130万行)

以下是基础资料表
t_VoucherGroup  凭证字属于基础资料 (全表6行)
t_Accoun  会计科目属于基础资料,全表1000行
 t_Currency  币别  属于基础资料 全表 3行
t_Settle 结算方式  属于基础资料 全表10行
 t_VoucherTplType 单据类型 属于基础资料 全表 300行