Access 以Multi thread 查詢, 結果更慢? |
答題得分者是:RootKit
|
junlin
初階會員 ![]() ![]() 發表:66 回覆:94 積分:42 註冊:2002-03-13 發送簡訊給我 |
我的DB是ACCESS 97, 放在一台Server上(win2003 server), 以網芳的方式分享出來給Client使用,
而且資料是依年月分開放置於MDB檔內, 例如:201012.mdb, 201011.mdb....... 若要查詢1年前的資料在哪一個MDB檔時, 都是一個一個MDB去找, 平均來說, 每個MDB約花2秒, 也就是說總共花費12*2=24秒. 所以我使用Multi thread, 一開始就開啟12個thread, 每個thread去讀取每個月的MDB, 想像中是只要花費2~5秒的時間就能找到1年前的資料, 但是實際上跑出來, 卻和一個一個MDB去找的時間差不多, 甚至更久 經測試後, 只要thread越多, 花費的時間就越久, 差不多是 "thread數量*2秒" 我發現都是卡在execute這句, 每個thread內在執行 execute 查詢語法時, 都耗掉 差不多是 "thread數量*2秒" 的時間, 這樣改成multi thread就沒有意義了 我想問問大家有沒有遇過類似的問題?? p.s. 每個thread都是自行create db connection, 而且只有做select 的動作 編輯記錄
junlin 重新編輯於 2010-12-28 20:16:25, 註解 無‧
|
老大仔
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:78 回覆:837 積分:1088 註冊:2006-07-06 發送簡訊給我 |
我比較好奇的是~為什麼不直接用FileListBox來做選擇mdb的事呢???
反正都要搜尋有哪些mdb可以用 那倒不如就用個元件來顯示那些mdb給使用者選擇 然後再來做連線、Select 的事情~ ===================引 用 junlin 文 章=================== 我的DB是ACCESS 97, 放在一台Server上(win2003 server), 以網芳的方式分享出來給Client使用, 而且資料是依年月分開放置於MDB檔內, 例如:201012.mdb, 201011.mdb....... 若要查詢1年前的資料在哪一個MDB檔時, 都是一個一個MDB去找, 平均來說, 每個MDB約花2秒, 也就是說總共花費12*2=24秒. 所以我使用Multi thread, 一開始就開啟12個thread, 每個thread去讀取每個月的MDB, 想像中是只要花費2~5秒的時間就能找到1年前的資料, 但是實際上跑出來, 卻和一個一個MDB去找的時間差不多, 甚至更久 經測試後, 只要thread越多, 花費的時間就越久, 差不多是"thread數量*2秒" 我發現都是卡在execute這句, 每個thread內在執行 execute 查詢語法時, 都耗掉 差不多是 "thread數量*2秒" 的時間, 這樣改成multi thread就沒有意義了 我想問問大家有沒有遇過類似的問題?? p.s. 每個thread都是自行create db connection, 而且只有做select 的動作 |
fusung
中階會員 ![]() ![]() ![]() 發表:26 回覆:169 積分:99 註冊:2003-11-25 發送簡訊給我 |
|
smallfox
高階會員 ![]() ![]() ![]() ![]() 發表:2 回覆:113 積分:128 註冊:2003-02-19 發送簡訊給我 |
|
junlin
初階會員 ![]() ![]() 發表:66 回覆:94 積分:42 註冊:2002-03-13 發送簡訊給我 |
to 老大仔, 沒辦法由使用者選擇要哪個MDB, 因為他們也不知道
![]() to fusung, 不是用同步模式喔, 我有試著讓main thread在開啟thread後做其他的事, 會馬上動作的. to smallfox, 我是用相同環境去測試, 其他的因素影響很小, 可以忽略不計, 至於connection的部分也有測 過, 還蠻快的, 所以就放在thread內了. 剛才測了一下, 如果針對同一個MDB檔, 開30個thread去select資料, 速度就很快了, 就像是預料的一樣, 在5秒內就查完了,難道是ACCESS或是JET Driver不支援multi thread嗎??
編輯記錄
junlin 重新編輯於 2010-12-30 00:58:59, 註解 無‧
|
RootKit
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:16 回覆:358 積分:419 註冊:2008-01-02 發送簡訊給我 |
應該是檔案存取的問題,以每個檔案 2 Sec 搜尋是非常快了。
檔案開啟是需要時間的。有時候會因為硬碟 Catch不同也會影響。 1. 建議建立獨立的總索引檔 1 MDB 要查詢並自動指定讀取哪一個檔案。 2. 或者使用 3-Tier 來處理,減少初次 Connect 時間及避免因重複開啟檔案造成拖累的問題。 網芳網路效率是很差的(對檔案),如果在本地存取整合後傳給 Client 也許會好一些。 3. 改用 FireBird or SQL Express 以我經驗 ACCESS 在 Multi-Thread 下 Multi-Connection 效率是很低的。 參考 |
kevin2004
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:18 回覆:463 積分:416 註冊:2005-05-29 發送簡訊給我 |
ACCESS 97, 放在一台Server上(win2003 server), 以網芳的方式分享出來給Client使用,
而且資料是依年月分開放置於MDB檔內, 例如:201012.mdb, 201011.mdb....... ==>不管是不是MultiThread,你這種網芳 Access97 切成以月切割 ==> DB的架構要想快,是很有問題的。光是由TCP/IP的角度來看 ==> ,就注定快不起來。而且即使用W2003Ser,Access也很不 ==> 適合共享使用。而且你的資料庫切到月,也實在太細太細了。
------
Kevin |
kevin2004
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:18 回覆:463 積分:416 註冊:2005-05-29 發送簡訊給我 |
|
junlin
初階會員 ![]() ![]() 發表:66 回覆:94 積分:42 註冊:2002-03-13 發送簡訊給我 |
感謝大家的回覆, 後來我還是決定不用multi thread了, 因為無法解決我的問題,
我的作法是, 在存放MDB的那個server內, 撰寫1個web service, 然後透過它來搜尋並回傳資料所在的mdb路徑, 之後client再直接去讀那個mdb檔, 這樣速度就很快了. 這種MDB的架構是前人遺留的產物, 目前還沒時間大翻修, 所以只好針對影響比較大的部分先修改, 分數我就給rookit了, 因他提到的3-tier想法促成了我用web service的方法解決了這個問題. 其他人就不好意思了, 還是很感謝大家的回應. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |