連接到 localhost 比連接到網路伺服器慢得多
我有一個 Excel VBA 應用程序,它通過 ADODB 連接到 SQL Server 2008 R2 數據庫。
當我在工作的網路上時,連接幾乎是瞬時的。當我在家使用數據庫的本地副本時,連接大約需要 5 秒。起初我認為性能下降與查詢有關,甚至在 Stackoverflow 上發布了一個帶有錯誤假設的問題:https ://stackoverflow.com/q/10467876/138938
無論我指定“localhost”還是“.”,本地連接都一樣慢。似乎我的程式碼很難解決我的本地主機的確切位置。我應該對我的主機文件或其他一些設置做些什麼,我可以修改這些設置以加快我在本地機器上的連接速度嗎?
我還應該看什麼其他東西來解決問題?
謝謝!
嘗試在本地實例上啟用 TCP/IP :
- 打開 SQL Server 配置管理器*(mmc.exe ->$$ Ctl $$+$$ M $$-> 添加“SQL Server 配置管理器”管理單元)*
- 展開“SQL Server 網路配置”
- 點擊“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 連接到 localhost。由於 TCP/IP 被禁用,這可能會在兩秒超時後失敗,此時 Jet/ACE ODBC 連接似乎已退回到共享記憶體訪問。
啟用 TCP/IP 消除了兩秒的超時延遲,導致性能大幅提升(尤其是在多次呼叫數據庫時)。
如果這是特定於一個數據庫(您沒有提到是否可以毫無問題地連接到本地主機上的 master 等其他數據庫),請檢查其自動關閉設置是否為 True。如果在工作中您正在連接到其他人也不斷連接的數據庫實例,那麼數據庫將保持打開狀態並準備好使用並更快地響應。但是,在家裡,您將是唯一的使用者,如果您沒有連接,自動關閉將釋放與數據庫相關的資源並關閉它,從而降低您下次使用它時的響應速度。這樣做的效果可能非常明顯。
在大多數 SQL Server 版本上,此選項預設為 False,但如果您的數據庫最初是使用 MSDE 或 SQL Express 創建的,則預設情況下將其設置為 True。