提高远程服务器上DELETE / INSERT的性能

时间:2009-09-17 10:37:07

标签: sql-server insert

在这种情况下,有两个数据库服务器:一个在我们的LAN(服务器A)中,另一个在我们的远程位置(服务器B)。

我们希望将项目的数据从服务器A传输到服务器B.为此,我们首先删除服务器B上的某个ProjectID的现有数据,之后只需将数据从服务器A插入服务器B.数据在服务器A上准备。

实际传输的数据量约为2.5MB。通过我们的20MBit连接,这应该在闪存中完成。但是使用SQL需要30-40秒。实际上,如果您使用相同数量的数据并使用FTP传输,则需要4秒。 :)

我已打开SET NO COUNT。我已经读到这可以使远程查询更快 什么可能导致这种缓慢的转移?

编辑:
SQL应该是真正的原因。它像这样崩溃:
- 从各种数据库中选择数据并将其插入服务器A上的数据库中 - 从Server B DB中删除ProjectID = x
- 插入服务器B数据库 - 从服务器A DB中选择*,其中ProjectID = x

最后两步大约需要40秒。正如您所看到的,我所做的就是删除旧记录并插入新记录。没有连接或困难的t-sql语法。

4 个答案:

答案 0 :(得分:1)

我会彻底检查发生删除的数据库B的设计和结构。检查以确保索引设计和优化,检查任何外键关系以及对引用删除的表的其他表的任何级联删除会发生什么,还要检查任何与删除相关的触发器并查看它们正在执行的操作。

我还会检查远程服务器本身并确保硬件没有任何问题,例如发生故障的硬盘驱动器或驱动器控制器。我有一个数据库曾经遭受过大量的缓慢。他们花了一个月的时间才最终确定罪魁祸首是一张失败的RAID卡。

如果这些都不是罪魁祸首,请尝试在两台服务器之间通过网络运行一些吞吐量测试,看看你是否真正获得了应该获得的带宽。查看并查看共享20MBit连接的其他数据。也许在某些时候有一个过载/故障的路由器或交换机,或者其中一个路由器/交换机的DNS信息不正确,并且无法沿正确的路径发送数据。

答案 1 :(得分:0)

你是吗? 从A中选择,插入B,从A?中删除

你可以 从A中选择,插入到B中 当你完成后,你可以删除

您也可以使用批量操作(选择多个ProjectID)并将其插入另一台服务器。

确保ProjectID是主键或Clustered Index ...如果没有,你必须找到一个不需要首先通过ProjectID搜索的解决方案。

如果您不需要任何

,也可以禁用两台服务器上的所有日志记录,备份,更改跟踪和统计信息

最后,多线程或多进程可以为您带来一些好处(在服务器B中插入时从服务器A中选择)。

答案 2 :(得分:0)

你检查过服务器b上的表是否有任何触发器? Perhpas他们正在导致经济放缓。

答案 3 :(得分:-3)

您也可以使用mysqldump:

mysqldump --complete-insert --create-options --add-locks --disable-keys --extended-insert --quick --quote-names -u $ user --password = $ password $ database | gzip --fast -c> {$ backupPath} / $ database。$ dateStr.sql.gz

然后通过网络传输gzipped转储并将其加载回新数据库。