SQL Server本地同一实例跨库导数据遇ASYNC NETWORK IO等待,耗时久求助
解决同一SQL Server实例跨库导入导出的NETWORK RESOURCE WAIT问题
针对同一实例下两个数据库间3000万条数据传输慢、出现NETWORK RESOURCE WAIT的问题,给你几个直接可行的方案:
直接用T-SQL内部传输,彻底绕开网络层
同一实例的数据库共享引擎资源,完全没必要通过localhost的网络连接来传输数据。用原生T-SQL语句直接在引擎内部读写是最快的方式:-- 快速创建新表并导入数据(目标表不存在时用) SELECT * INTO DB2.dbo.TargetTable FROM DB1.dbo.SourceTable; -- 往已存在的目标表插入数据 INSERT INTO DB2.dbo.TargetTable (Col1, Col2, ColN) SELECT Col1, Col2, ColN FROM DB1.dbo.SourceTable;如果数据量过大怕锁表或日志暴涨,可分批插入:
DECLARE @BatchSize INT = 100000; DECLARE @CurrentMaxID INT = 0; WHILE 1 = 1 BEGIN INSERT INTO DB2.dbo.TargetTable (ID, Col1, Col2) SELECT ID, Col1, Col2 FROM DB1.dbo.SourceTable WHERE ID > @CurrentMaxID ORDER BY ID OFFSET 0 ROWS FETCH NEXT @BatchSize ROWS ONLY; IF @@ROWCOUNT = 0 BREAK; SET @CurrentMaxID = (SELECT MAX(ID) FROM DB2.dbo.TargetTable); END修改连接方式,避免TCP/IP回环开销
用(local)或.\InstanceName代替localhost作为连接地址,前者会优先使用命名管道协议,比TCP/IP的本地回环通信效率高得多。也可以在连接属性里手动指定协议为Named Pipes,彻底跳过TCP/IP栈。排查隐性瓶颈(别被NETWORK WAIT误导)
有时候NETWORK RESOURCE WAIT只是表象,实际是其他资源瓶颈导致的:- 检查目标库的恢复模式:如果是完整恢复模式,大量插入会生成巨量事务日志,IO瓶颈会让引擎等待,表现为网络等待。可临时切换为简单恢复模式,导入完成后再改回。
- 禁用目标表的索引和约束:导入前先禁用非聚集索引、外键约束,导入完成后重建索引、启用约束,能大幅降低写入耗时。
- 检查系统资源:本地回环也可能被其他进程抢占带宽,比如杀毒软件实时扫描、后台同步工具,暂时关闭这类进程试试。
优化导入导出工具的配置
如果一定要用导入导出向导,确保勾选了批量复制操作选项,开启批量插入模式;同时在连接设置里强制使用本地协议,不要默认用TCP/IP。
内容的提问来源于stack exchange,提问作者Amir Mohammad Afsharzadeh
相关产品推荐
相关产品推荐

