我有一個 5000 行的 Main 表、一個 51 行的 Managers 表和一個 16 行的 Phase 表。我創建了一個從主表到其他兩個表的 LEFT JOIN 查詢:
SELECT [tblTrue-UpMain].Contract_Number, [tblTrue-UpMain].ProjectName, [tblTrue-UpMain].AFGroupName, [tblTrue-UpMain].AFAccountMgr, [tblTrue-UpMain].AFSubStationName, [tblTrue-UpMain].AFAssociatedContract, [tblTrue-UpMain].AFPreviousFile, [tblTrue-UpMain].AFFinancing, [tblTrue-UpMain].AFReplaceCoverage, [tblTrue-UpMain].AFBillingRate, [tblTrue-UpMain].AFProjectType, [tblTrue-UpMain].AFPreviousClients, [tblTrue-UpMain].ID, [tblTrue-UpMain].AF_VS_File_Number, [tblTrue-UpMain].Customer_Number, [tblTrue-UpMain].Contract_Execution_Date, [tblTrue-UpMain].Service_Account, [tblTrue-UpMain].Contract_Account, [tblTrue-UpMain].Contract_No_IF_Or_AF, [tblTrue-UpMain].CM, [tblTrue-UpMain].FinanceReplacementCPUC, [tblTrue-UpMain].Project_Type, [tblTrue-UpMain].Contract_Status, [tblTrue-UpMain].Contract_Phase, Local_ContractManagers.Contract_Manager, Local_Contract_Phase.PhaseName
FROM ([tblTrue-UpMain]
LEFT JOIN Local_ContractManagers ON [tblTrue-UpMain].CM = Local_ContractManagers.CMID)
LEFT JOIN Local_Contract_Phase ON [tblTrue-UpMain].Contract_Phase = Local_Contract_Phase.PhaseID
WHERE ((([tblTrue-UpMain].Contract_Number) Like "AF*"))
ORDER BY [tblTrue-UpMain].Contract_Number;
[tblTrue-UpMain].CM和[tblTrue-UpMain].Contract_Phase都是索引。[洗掉這些索引不會影響時間。] Local_ContractManagers.CMID和Local_Contract_Phase.PhaseID都是主鍵。[在這兩種情況下,INNER JOINS 而不是 LEFT JOINS 運行了大約 1 秒。
當我使用 Managers 和 Phase 表作為 Access 表運行查詢時,它需要 1 秒或更短的時間。如果我使用 SQL Server 上的 Managers 和 Phase 表運行它,則需要 40 多秒。兩個查詢的主表都在 SQL Server 上。]
在 SSMS(SQL Server 上的所有表)上運行查詢也運行得很快。
任何想法為什么它可能會運行這么長時間?
uj5u.com熱心網友回復:
只要這些表都是基于 SQL Server 的?
那么查詢不應該花那么長時間。但是,如果你混合使用本地表和 SQL 服務器表,那么它會像烏龜一樣慢。
但是,解決問題的一種方法是什么?
啟動 SQL 管理器,并在 SQL 服務器中構建相同的查詢。
實際上,選擇創建新視圖。SQL“視圖”實際上就像是 Access 保存的查詢,您可以使用熟悉的查詢構建器(它類似于 Access 的)。您會注意到通常不允許排序,因此,在報告中執行此操作,甚至針對該視圖構建客戶端查詢。
現在,保存這個視圖,然后創建一個指向這個視圖訪問端的鏈接。
我經常這樣做,我有一個小助手 VBA 例程來添加這個鏈接,這比使用功能區中的 ODBC 管理器要少得多。
現在,代替您擁有的本地查詢,嘗試使用 SQL“視圖”(它將顯示為鏈接表)。
結果應該是非常高的性能,并且與您在 sql studio 中嘗試查詢時一樣好。
視圖往往是比使用存盤程序更好的選擇,因為它更容易在 Access 甚至 VBA 代碼中使用。
事實上,我建議為鏈接視圖指定與本地 SQL 查詢相同的名稱。這樣,現有的表單、代碼或報告就不需要任何修改,并且您可以獲得出色的性能。
這種性能甚至包括打開帶有“where”子句的報表。因此,您仍然可以使用客戶端過濾器,甚至可以使用在 VBA 中創建的使用“where”子句啟動報告的過濾器。訪問只會提取那些符合標準的記錄(因此這種方法是一種網路/帶寬友好的方法)。
那么,任何時候你都會遇到像烏龜一樣緩慢的表演?嘗試查看方法,它解決了我看到的所有性能問題。
對于基于一個表的簡單查詢?然后視圖沒有幫助。但是,一旦您開始引入連接和附加表,那么訪問就無法在不提取大量資料的情況下進行正確的連接 - 所以視圖確實很有幫助。
[tblTrue-UpMain].CM 和 [tblTrue-UpMain].Contract_Phase 都是索引。
我們假設您談論的是 SQL 服務器端索引。不要試圖創建索引的客戶端——它們不做任何事情并且不能被使用。
我也強烈建議您在使用視圖時不要嘗試在服務器端創建索引。始終在基本 sql server 表服務器端創建索引 - 不多也不少。
編輯:添加一個帶有 vba 的鏈接代替 odbc manager.=
因此,如前所述,由于經常需要添加一個新表或一個新視圖(作為 SQL 服務器的鏈接),因此我撰寫了一個 VBA 例程以節省時間。
例行程式沒什么特別的。我有一大堆這樣的例程。我的意思是,一旦采用了拆分資料庫,那么為了便于部署,我們會隨著時間的推移“拼湊”一些重新鏈接代碼。這僅適用于訪問后端或 sql server 后端。
那么,我的小 VBA 助手例程要添加一個鏈接嗎?
假設我剛剛創建了一個新的視圖 sql server 端。說查看客戶。
現在,我需要在客戶端有一個鏈接表(或視圖)。啟動 odbc 管理器并完成所有這些步驟以僅鏈接一張表需要太多時間 痛苦。
所以,我有這個例程,并從除錯視窗運行它。所以,我會按 ctrl-g,然后在除錯視窗中輸入:
MyCreateOneLink "server table", "Local name for link"
所以,上面的要快得多。
那么,上面的例程是什么樣的呢?
在我的標準代碼模塊中,我有這個:
Sub MyCreateOneLink(strServerTable As String, strLocalTable As String)
Dim tdfcurrent As DAO.TableDef
Set tdfcurrent = CurrentDb.CreateTableDef(strLocalTable)
tdfcurrent.connect = dbCon("MYSERVER\SQLEXPRESS", "Customers", "MyUserName", "MyPassword", cControlPassword, "MyApp")
tdfcurrent.SourceTableName = strServerTable
CurrentDb.TableDefs.Append tdfcurrent
End Sub
上面呼叫了一個例程“dbcon()”。該例程從傳遞的值創建一個有效的 SQL 連接字串。
這個:
Public Function dbCon(ServerName As String, _
DataBaseName As String, _
Optional UserID As String, _
Optional USERpw As String, _
Optional APP As String = "Office 2010", _
Optional WSID As String = "Axis") As String
' returns a SQL server conneciton string
dbCon = "ODBC;DRIVER=SQL Server;" & _
"SERVER=" & ServerName & ";" & _
"DATABASE=" & DataBaseName & ";"
If UserID <> "" Then
dbCon = dbCon & "UID=" & UserID & ";" & "PWD=" & USERpw & ";"
End If
dbCon = dbCon & _
"APP=" & APP & ";" & _
"WSID=" & WSID & ";" & _
"Network=DBMSSOCN"
End Function
上面的“本機”驅動程式必須更改,但這里的簡單想法是有一個快速代碼,因此從訪問命令提示符(除錯視窗),我可以輸入一個快速簡單的命令來創建一個表鏈接。
因此,在開發程序中,通常會使用訪問命令列(立即)視窗,因此我們可以呼叫一些小的 VBA 輔助例程,例如為我們創建表鏈接。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/512861.html
標籤:sql服务器毫秒访问短信
上一篇:從多個鏈接表中洗掉記錄訪問vba
