小弟這邊在SQL的使用上遇到一個很大的問題
就是當我針對DATA這的TABLE進行搜尋的時候
其他USER要寫入DATA這個TABLE時會受到搜尋的影響
變成
一定要完成搜尋後,寫入的資料才會被寫入
造成若搜尋15分鐘,則此15分鐘內針對DATA這的ATBLE無法寫入任何資料
請問應該在SQL上或是程式上修改
才能避免這種互相影響的問題呢?
胸毛多 wrote:
小弟這邊在SQL的使...(恕刪)
小弟使用的是SQL2005 與SQL2008
該表同時會有60~70的人員寫入資料
但只要有一個人搜尋,所有寫入的動作都會無法寫入
加記憶體有辦法改善嗎?(目前4G)Server等級主機非一般pc
SELECT FIELD_1, FIELD_2, .......
FROM TABLE_NAME WITH (NOLOCK)
WHERE .....
2. 限制查詢時一定要輸入條件
3. 先用 COUNT() 查詢一次,取得這次查詢會有多少筆資料,如果大於一個數量,就跳訊息請使
用者輸入更多的查詢條件後再查詢
4. 把你的 SQL 敘述用 SSMS 取得執行計畫,看看有沒有 Table Scan 或是 Index Scan 的地方
務必要修改你的 SQL 或是建立適當的索引消除 Table Scan 與 Index Scan,查詢條件應該是
Index Seek 才能使用到 Index 加速查詢
喵~~
滑鼠不能當飯吃,但可以混飯吃
不應該從效能去入手......
MSSQL自從2005開始便用了MVCC, 單純查詢不應該做成locking的.
1. 請檢查你的程式, 會不會有select ...... for update的東西, 這會讓查詢的同時鎖住了資料
2. 看看會不會用了table lock, row lock這些東西
3. 請看看你的maximum concurrent user,看看是否有足夠connection讓多人同時使用.
4. 請檢查各種資源, 看看會不會有一些資源沒設定好讓一個用戶在用時其他同戶沒資源只能waiting.
5. 請檢查有沒有contention造成的waiting.
先是這樣
還有要看你的TABLE有幾筆,
資料表切割要企業版,就算你切割了還是一樣會LOCK,
還有更新的筆數有有關聯,欄位的型態、數量也有差別,
最簡單的方式WITH (NOLOCK) ,但要注意是否是一對多、有下CONSTRAINT,
更新也可以改寫改成一次更新一千筆,這樣會好很多,
還有每筆更新都會占用一個記憶體,一次更新十萬筆就會占用十萬份,
如果常需要幾十萬筆的更新要改寫SQL或者設定,
還有很多方法例如建立複製資料表,
可以避免DIRTY DATA,但是資料會有時間差,
有機會確認一下資料庫記憶體使用率,
index、table file的使用率,
是否自動更新統計
如果都沒有專業的DBA協助考慮把常更新的TABLE做成一個獨立的DATA FILE
(還是FILE GROUP,一個是ORACLE一個是MS SQL不太確定是哪個)
60~70的人員寫入資料,是指同時大量更新,還是只是修改一筆,
同時大量更新的話,記憶體太少,只修改一筆代表程式寫不好,
更新完資料表沒有立即釋放。
綠手指
內文搜尋

X