与本地主机的连接比与网络服务器的连接慢得多

Hea*_*ing 3 performance sql-server sql-server-2008-r2 network

我有一个 Excel VBA 应用程序,它通过 ADODB 连接到 SQL Server 2008 R2 数据库。

当我在工作时使用网络时,连接几乎是即时的。当我在家使用数据库的本地副本时,连接大约需要 5 秒。起初我认为性能下降与查询有关,甚至在 Stackoverflow 上发布了一个带有错误假设的问题:https ://stackoverflow.com/q/10467876/138938

无论我指定“localhost”还是“.”,本地连接都一样慢。看来我的代码很难解析我的本地主机到底在哪里。我是否应该对主机文件或其他一些设置进行修改以加快本地计算机上的连接速度?

我还应该注意什么来排除故障?

谢谢!

mwo*_*e02 5

尝试在本地实例上启用 TCP/IP :

  • 打开 SQL Server 配置管理器(mmc.exe -> [Ctl] + [M] -> 添加“SQL Server 配置管理器”管理单元)
  • 展开“SQL Server 网络配置”
  • 单击“Protocols for MSSQLSERVER”(或任何本地实例名称)
  • 将“TCP/IP”设置为启用

我今晚刚刚遇到这个问题。与 @Aaron Bertrand 在评论中看似直观的建议相反,禁用 TCP/IP 实际上导致了我的延迟。默认情况下,TCP/IP 是禁用的,因此这也可能是其他人感到沮丧的常见原因。

我在连接到远程服务器和 SQL Server 本地实例时运行 ProcMon.exe。我使用 Jet/ACE ODBC TraceSQLMode 来调试延迟。每次发出 ODBC 命令时,TraceSQLMode 都会写入文本文件。

连接到远程服务器时,总共不到一秒就将七个命令写入文本文件。对于本地实例,每个ODBC 调用之间几乎正好有两秒的时间。

我假设 Jet/ACE ODBC 驱动程序最初在每次 ODBC 调用时都尝试通过 TCP/IP 连接到本地主机。由于 TCP/IP 被禁用,这可能会在两秒超时后失败,此时 Jet/ACE ODBC 连接似乎已退回到共享内存访问。

启用 TCP/IP 消除了两秒的超时延迟,从而显着提高了性能(尤其是在多次调用数据库时)。