|
馬克褚工作室,最新課程: 😁2026/9/24週四,線上課程,至少五週。Garmin BaseCamp,手機GPS進階必學,gpx管理最佳利器,學會之後,您每天都會離不開它!。連結 😁2026/10/4週日,【手機GPS進階戶外課程,Android與iPhone同時上課,離線地圖的判讀;台北】離線地圖保證你不迷路,地圖判別讓你知道接下來如何走,盡情馳騁山林|台北市|104高年級。連結 |
表格Foreign key設定後的View顯示效率問題,小心導致主機當機哦
選單 | 此為最新版 | 回文件資料庫 | 教學資料| 文件編號:445 | ||
| 版本:1.00 , 狀態:OK (最後修改日期:2019/06/28 - 17:46:34) 版本說明:首版 | ||
最近積極在整理網站計數器,計數包括整體網站計數與個別類型計數。個別類型包括馬克紀錄、路線、文件...。馬克的每筆紀錄都會記錄造訪的人次。而最近也做了一個動作,將某些系統錯誤,測試性地導入到系統錯誤表格,並發出郵件給管理者。正由於這些動作,讓系統錯誤無所遁形,及時發現,並將錯誤揪出並避免。以下列出案例一,MVC的View效率問題。
表格可以設Foreign key,連結到相關表格,這在表格完整性有很大助益!另外的好處是,View的顯示,只要有設關聯,可以很方便地列出相關資料,不需在Control時就要辛苦地連結。
範例:
alter table [xx] add CONSTRAINT [logid-cst] FOREIGN KEY (log_id) REFERENCES [xxx](log_id)
問題來了,有個計數器表格可以儲存各類型資料造訪明細,裡頭資料相當多,馬克寫了個簡單顯示,要顯示各類型的造訪個數。在View中,藉由Foreign的便利,直接可以列出Count如下:
![]()
在local測試似乎正常,速度有些慢!放上遠端網站,執行該功能,畫面不動,然後陸續收到系統異常的Email如下:
![]()
以上訊息的產生是因為使用者造訪網頁時,系統自動新增造訪紀錄,結果無法新增!以上新放上去的程式在執行時,程式執行要耗費相當多的時間,顯然是顯示count時,系統必須一個個的去累計加總!要停止程式執行,只好停止主機的IIS,重新啟動。剛開始是以為沒有設Index,系統不好統計,加入後結果依舊,主機還是當機。
重新回到local來做測試,得到的心得是,View裏頭自動關聯的count在大筆數資料時會有嚴重的效率問題。開始改寫Control的linq指令...
原始的寫法很簡單:
public async Task
{
return View(await db.xx.ToListAsync());
}
由於筆者對於linq與傳遞到View的方式還不夠熟,所以花了將近兩天的時間,終於做出改革版本,速度是,一眨眼即可完成。
Control端:
![]()
View端:
![]()
ViewModel:
![]()
執行結果:
![]()
文件資訊: