PCDVD數位科技討論區
PCDVD數位科技討論區   註冊 常見問題 標記討論區為已讀

回到   PCDVD數位科技討論區 > 其他群組 > 七嘴八舌異言堂
帳戶
密碼
 

  回應
 
主題工具
comics
Major Member
 

加入日期: Oct 2002
您的住址: 中華民國台灣省桃園縣
文章: 154
資料庫問題請教

請教一下版上的各位

目前碰到一個狀況...

多名USER 同時會買一個東西...

而東西有限量...

所以會有一個欄位統計這個東西目前已有多少人購買...

每有一人購買就會於該欄位 +1

可是在壓力測試時,這個欄位UPDATE的速度會愈來愈慢....

因為在排隊UPDATE....

不知有沒有可以建議改善的方法...

謝謝

PS:資料庫是 SQL SERVER
     
      
舊 2014-12-27, 10:46 PM #1
回應時引用此文章
comics離線中  
micall.lee
*停權中*
 
micall.lee的大頭照
 

加入日期: Jul 2013
文章: 331
引用:
作者comics
請教一下版上的各位

目前碰到一個狀況...

多名USER 同時會買一個東西...

而東西有限量...

所以會有一個欄位統計這個東西目前已有多少人購買...

每有一人購買就會於該欄位 +1

可是在壓力測試時,這個欄位UPDATE的速度會愈來愈慢....

因為在排隊UPDATE....

不知有沒有可以建議改善的方法...

謝謝

PS:資料庫是 SQL SERVER

我的建議是你弄一小段程式,針對目前有幾筆交易紀錄,去統計目前的購買量,然後這個數值看是要即時顯示在甚麼地方(例如製作成報表或者弄在系統畫面某一個地方),或者用作於限制目前購買量的程式邏輯都可以

不需要一直針對資料庫交易,只需簡單的一筆查詢筆數就可以即時知道購買量有多少

能用查詢解決問題,就不要一直對資料庫交易

如果你是要限定購買量,也只需要在另一個資料表(例如:目前該商品庫存量),查詢然後比對目前的購買交易紀錄即可限制購買量
 

此文章於 2014-12-27 10:59 PM 被 micall.lee 編輯.
舊 2014-12-27, 10:51 PM #2
回應時引用此文章
micall.lee離線中  
潛水族
Advance Member
 

加入日期: Apr 2001
文章: 465
非同步....,
MSMQ......
__________________
ps.請看簽名,不準砲我
#相信政府
#相信黨
#台灣價值好棒棒
潛水~~~潛水~~~
舊 2014-12-27, 11:16 PM #3
回應時引用此文章
潛水族離線中  
shinRong
Regular Member
 

加入日期: Aug 2000
您的住址: Taipei, Taiwan
文章: 72
你可能當初建了一個"累計購買數量"欄位在物料主檔
物料主檔是很多動作都會參考到的檔案
可能資料筆數也多
造成異動成本過高

一般資料庫都不會這樣做
如果需要最即時的庫存量
通常是直接去計算銷售紀錄再去跟可用庫存量比對

舊 2014-12-28, 04:34 AM #4
回應時引用此文章
shinRong離線中  
darkangel
Major Member
 
darkangel的大頭照
 

加入日期: Aug 2001
文章: 211
1. 如果你有對該欄位做索引,把索引移除試試,常更新的欄位用索引只會更慢。
2. 跟其他網友看法一樣,從程式邏輯上去克服,不要去維護累計購買數(不要 update),而是直接去查詢庫存量跟購買數來做比對,select 比 update 快很多。
__________________
滿招損 謙受益
舊 2014-12-28, 04:52 AM #5
回應時引用此文章
darkangel離線中  
LR2001
Major Member
 

加入日期: Dec 2000
文章: 125
讓相關交易盡快完成確認(committed)。
舊 2014-12-28, 08:23 AM #6
回應時引用此文章
LR2001離線中  
micall.lee
*停權中*
 
micall.lee的大頭照
 

加入日期: Jul 2013
文章: 331
不過如果是很短的時間內會有大量的購買紀錄,再加上可購買的數量也會快速的更新,那就還要一些程式邏輯來控制,不過這就看有沒有其他高手來介紹可行的方案,這點我就比較沒太多經驗了

當然也可以修改購買流程與制度來控制,就不需要透過複雜的程式避免出錯
舊 2014-12-28, 09:33 AM #7
回應時引用此文章
micall.lee離線中  
LR2001
Major Member
 

加入日期: Dec 2000
文章: 125
伺服端程式讀取一次欄位數量後,做虛擬切割如下:

交易ID 1、3、5.... 去虛擬倉庫A存取。
交易ID 2、4、6.... 去虛擬倉庫B存取。
.
.
.
伺服端程式被存量不足信號觸發後,負責自動調撥、比對物件數量。
依此類推自行擴充完善......
舊 2014-12-28, 10:07 AM #8
回應時引用此文章
LR2001離線中  
ycli6921
Advance Member
 

加入日期: Mar 2002
文章: 484
累計購買數量放在記憶體裡,每次訂單進來做對應的遞增。
即使系統重啟,累計購買數量也可以由過去訂單記錄推算。
這樣需要的IO最少。
舊 2014-12-28, 09:22 PM #9
回應時引用此文章
ycli6921離線中  
comics
Major Member
 

加入日期: Oct 2002
您的住址: 中華民國台灣省桃園縣
文章: 154
引用:
作者micall.lee
不過如果是很短的時間內會有大量的購買紀錄,再加上可購買的數量也會快速的更新,那就還要一些程式邏輯來控制,不過這就看有沒有其他高手來介紹可行的方案,這點我就比較沒太多經驗了

當然也可以修改購買流程與制度來控制,就不需要透過複雜的程式避免出錯


我們的狀況就是類似您舉出的狀況,

依shinRong的建議
目前的確也是有建一個欄位在物件主檔...
我會試著去把這個欄位拉出來...

因為大量同時INSERT 購買的紀錄...
如果再去用 SELECT 統計總數,在同時大量購買的狀況下反而造成DATA LOCK...

我在想是否可以用 TRIGGER 自動去加總異動人數統計..
舊 2014-12-28, 10:44 PM #10
回應時引用此文章
comics離線中  


    回應


POPIN
主題工具

發表文章規則
不可以發起新主題
不可以回應主題
不可以上傳附加檔案
不可以編輯您的文章

vB 代碼打開
[IMG]代碼打開
HTML代碼關閉



所有的時間均為GMT +8。 現在的時間是02:13 PM.


vBulletin Version 3.0.1
powered_by_vbulletin 2025。