2014-09-20 90 views
0

所有,VBA SQL查詢 - 優化

我有兩個tabels:案例(IdCase,名稱)和警報(IdAlert,refIdCase,配置文件)。 一種情況可以通過refIdCase連接多個警報。 我在VBA listbox中列表中顯示了案例名和分配給這個案例的配置文件。

首先我下載了​​50個案例。然後爲每個記錄集找到配置文件名稱。不幸的是它需要一些時間:(有沒有什麼更快的方法來實現這一

set rsCases = cn.Execute("SELECT TOP 50 * FROM Cases") Do Until rsCases.EOF Set rsProfiles = cn.Execute("SELECT DISTINCT TOP 50 Profile FROM Alert WHERE refIdCase = " & rsCases.Fields("IdCase").value & ";") rsCases.movenext

UPDATE:我認爲這個問題是我們對SQL Server連接我們位於波蘭和服務器是在北美。美國,我執行從位於NA計算機相同的動作,並只用了4秒,但在這裏,來自波蘭大約需要45秒。

謝謝 TJ

+0

有趣的解決方案 - 什麼是**業務需求**本(非高性能)解決方案正在解決? – 2014-09-20 22:02:08

+0

1)位於Access數據庫或某些其他RDBMS中的表位於何處?你在Alerts表上有某種索引嗎? 2)你是否需要子查詢中的50條記錄?如果它返回更多,那也是可以接受的? – 2014-09-20 22:05:16

+0

我在outlook中創建了這個宏。我們有監控團隊對警報作出反應。這個宏幫助他們(根據警報主體創建升級電子郵件,在外部系統中創建票證等)。另外,我們希望在SQL中保留操作的歷史記錄。無論何時用戶運行宏,此代碼都會檢查歷史記錄並顯示已分配警報的案例。大約需要1秒鐘搜索每個案例的配置文件。大約1分鐘顯示歷史記錄。這是一點點長:/ – 2014-09-20 22:13:07

回答

1

的問題是,您要發送51請求數據庫。發送1:

set rstCases = cn.Execute("SELECT c.IdCase, c.Name, a.IdAlert, a.Profile 
          FROM Cases c 
            INNER JOIN 
            (SELECT TOP 50 IdAlert, Profile 
            FROM Alerts 
            ORDER BY ???) a 
            ON c.IdCase=a.refIdCase 
          ORDER BY ???") 

(換行是爲了清晰 - 不要再在你的代碼)