跨服务器数据表设计相关

时间:2021-01-17 12:41:00
现状:已有程序是用delphi写的;整个“上传药监信息”程序,用到了六张数据表(未上传购进,已上传购进,未上传销售,已上传销售,还有两表是存放在另服务器的药监码主表及细表)
问题:已有系统上传速度很慢,经常卡死!
准备重写程序,但是可能是看了太久原来的那个代码,现在没有思路,被困住了
希望各位能给支支招:主要是数据库方面的,表设计等。。。

12 个解决方案

#1


估计是每人愿意帮你重新设计的。
你可以自己先设计一个,帮你改改倒是可能。

#2


你要看看“慢”是在上传的哪部分,是传到文件服务器上慢(也就是网络问题)还是存到数据库慢(数据库的问题)?如果是网络问题,就没必要改动设计,如果是数据库慢,那就要检查插入SQLServer的时候是否有过多的约束、索引、判断?或者是对大数据量却一行一行插入等问题。先找原因,再找处理方法,你这个想法我觉得不保证有效。

#3


嗯,期待答案,和实践,并得到结论

#4


引用 2 楼 DBA_Huangzj 的回复:
你要看看“慢”是在上传的哪部分,是传到文件服务器上慢(也就是网络问题)还是存到数据库慢(数据库的问题)?如果是网络问题,就没必要改动设计,如果是数据库慢,那就要检查插入SQLServer的时候是否有过多的约束、索引、判断?或者是对大数据量却一行一行插入等问题。先找原因,再找处理方法,你这个想法我觉得不保证有效。

不好意思,新手问的问题描述不太清楚(主要是我也没把原程序理解透彻)。
首先网络是没有问题的,那就是代码出问题了。例如,在A中写的存储过程中,有一步是要根据A中某表的数据删除服务器B中某表的的数据,这一步用单条逐步可以实现,或者将待处理数据id全部插入B的临时表,然后再调用B中存储过程删除冗余数据。但是这两种方法往往都会造成程序未执行完删除就卡死了。前者卡的数据相对来说还少很多。请问这个是否有悖于大数据量单条执行效率低呢?

#5


那你试试直接执行后面那种情况的语句,看看会不会非常慢?因为删除一条,本来就很快。所以基本上不存在卡死。但是大数据量的时候如果很慢,那就有可能卡住了。

#6


引用 5 楼 DBA_Huangzj 的回复:
那你试试直接执行后面那种情况的语句,看看会不会非常慢?因为删除一条,本来就很快。所以基本上不存在卡死。但是大数据量的时候如果很慢,那就有可能卡住了。


数据量一般不多几百条到一千条,单条逐步执行后会卡掉十几条未删除冗余数据,但是跨服务器执行存储过程(在B服务器上执行SQL:delete from 表 where id in (select id from 存放待删除数据id的表 ))这样就会卡很多。所以现在我常常需要在后台手动执行后续的删除工作(手动在B服务器上执行那个存过)

我在想,会不会跟程序里面query的commandtimeout(默认值30)属性有关,因为,当我把commandtimeout值设为0(无穷大),则程序虽然反应慢,但最终是能成功执行完包括删除冗余数据的!

#7


跨数据库甚至跨服务器需要做很多事情,比如权限检查等,本身就加大了处理的时间,而且索引、统计信息都仅在库中有效,所以速度上几乎不会比单库操作快。如果非必要,还是不建议使用跨库或者跨服务器处理。

#8


跨服务器数据表设计相关

#9


谢谢各位的帮助!我现在试一下多建个query来执行另一服务器的工作。这样速度可能会有所提高。结果待续

#10


跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关

#11


这个不跨服吧,你把语句都放到存储过程里做。

常见app慢的原因: http://www.sommarskog.se/query-plan-mysteries.html#linkedservers

#12


由于测试数据量不足,可能提速表现不明显,但是分开执行两个链接不同服务器的存过好于一个跨服务器存过。改良后:(无未删除冗余数据)

#1


估计是每人愿意帮你重新设计的。
你可以自己先设计一个,帮你改改倒是可能。

#2


你要看看“慢”是在上传的哪部分,是传到文件服务器上慢(也就是网络问题)还是存到数据库慢(数据库的问题)?如果是网络问题,就没必要改动设计,如果是数据库慢,那就要检查插入SQLServer的时候是否有过多的约束、索引、判断?或者是对大数据量却一行一行插入等问题。先找原因,再找处理方法,你这个想法我觉得不保证有效。

#3


嗯,期待答案,和实践,并得到结论

#4


引用 2 楼 DBA_Huangzj 的回复:
你要看看“慢”是在上传的哪部分,是传到文件服务器上慢(也就是网络问题)还是存到数据库慢(数据库的问题)?如果是网络问题,就没必要改动设计,如果是数据库慢,那就要检查插入SQLServer的时候是否有过多的约束、索引、判断?或者是对大数据量却一行一行插入等问题。先找原因,再找处理方法,你这个想法我觉得不保证有效。

不好意思,新手问的问题描述不太清楚(主要是我也没把原程序理解透彻)。
首先网络是没有问题的,那就是代码出问题了。例如,在A中写的存储过程中,有一步是要根据A中某表的数据删除服务器B中某表的的数据,这一步用单条逐步可以实现,或者将待处理数据id全部插入B的临时表,然后再调用B中存储过程删除冗余数据。但是这两种方法往往都会造成程序未执行完删除就卡死了。前者卡的数据相对来说还少很多。请问这个是否有悖于大数据量单条执行效率低呢?

#5


那你试试直接执行后面那种情况的语句,看看会不会非常慢?因为删除一条,本来就很快。所以基本上不存在卡死。但是大数据量的时候如果很慢,那就有可能卡住了。

#6


引用 5 楼 DBA_Huangzj 的回复:
那你试试直接执行后面那种情况的语句,看看会不会非常慢?因为删除一条,本来就很快。所以基本上不存在卡死。但是大数据量的时候如果很慢,那就有可能卡住了。


数据量一般不多几百条到一千条,单条逐步执行后会卡掉十几条未删除冗余数据,但是跨服务器执行存储过程(在B服务器上执行SQL:delete from 表 where id in (select id from 存放待删除数据id的表 ))这样就会卡很多。所以现在我常常需要在后台手动执行后续的删除工作(手动在B服务器上执行那个存过)

我在想,会不会跟程序里面query的commandtimeout(默认值30)属性有关,因为,当我把commandtimeout值设为0(无穷大),则程序虽然反应慢,但最终是能成功执行完包括删除冗余数据的!

#7


跨数据库甚至跨服务器需要做很多事情,比如权限检查等,本身就加大了处理的时间,而且索引、统计信息都仅在库中有效,所以速度上几乎不会比单库操作快。如果非必要,还是不建议使用跨库或者跨服务器处理。

#8


跨服务器数据表设计相关

#9


谢谢各位的帮助!我现在试一下多建个query来执行另一服务器的工作。这样速度可能会有所提高。结果待续

#10


跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关跨服务器数据表设计相关

#11


这个不跨服吧,你把语句都放到存储过程里做。

常见app慢的原因: http://www.sommarskog.se/query-plan-mysteries.html#linkedservers

#12


由于测试数据量不足,可能提速表现不明显,但是分开执行两个链接不同服务器的存过好于一个跨服务器存过。改良后:(无未删除冗余数据)