• 2

SQL的搜尋與寫入相互影響問題

小弟這邊在SQL的使用上遇到一個很大的問題
就是當我針對DATA這的TABLE進行搜尋的時候
其他USER要寫入DATA這個TABLE時會受到搜尋的影響
變成 
一定要完成搜尋後,寫入的資料才會被寫入
造成若搜尋15分鐘,則此15分鐘內針對DATA這的ATBLE無法寫入任何資料
請問應該在SQL上或是程式上修改
才能避免這種互相影響的問題呢?
2011-06-29 16:17 發佈
你是在用oracle, MySQL, DB2, postgresql 還是MSSQL?
不同資料庫, 不同版本的差異太大, 答不了你啊!
胸毛多 wrote:
小弟這邊在SQL的使...(恕刪)

如果要搜尋那麼久有幾種情形
1.資料欄位與筆數太多 2.CPU不夠力 3.記憶體不敷使用 4.硬碟讀太慢

如果是2,3,4就是花錢
如果是1, 就要切割Table, 分成數個

還有就是下SQL指令時
WHERE 後面什麼樣的條件, 也會影響搜尋時間, 最好想出最佳方式
A Pink, Hello Venus

胸毛多 wrote:
小弟這邊在SQL的使...(恕刪)


小弟使用的是SQL2005 與SQL2008
該表同時會有60~70的人員寫入資料
但只要有一個人搜尋,所有寫入的動作都會無法寫入
加記憶體有辦法改善嗎?(目前4G)Server等級主機非一般pc
胸毛多 wrote:
小弟使用的是SQL2...(恕刪)

這兩種是我常用的
我是沒遇過這種情形
你可能要去看書,可能要改設定,"搜尋時不要鎖Table"

另外搜尋要那麼久
就代表程式很有改善空間,SQL語法要重編
A Pink, Hello Venus
1. 純查詢加上 WITH (NOLOCK)
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 加速查詢
喵~~ 滑鼠不能當飯吃,但可以混飯吃
先說一下, 本人是oracle的DBA, 所以MSSQL的我只能概念性地回答你

不應該從效能去入手......

MSSQL自從2005開始便用了MVCC, 單純查詢不應該做成locking的.

1. 請檢查你的程式, 會不會有select ...... for update的東西, 這會讓查詢的同時鎖住了資料

2. 看看會不會用了table lock, row lock這些東西

3. 請看看你的maximum concurrent user,看看是否有足夠connection讓多人同時使用.

4. 請檢查各種資源, 看看會不會有一些資源沒設定好讓一個用戶在用時其他同戶沒資源只能waiting.

5. 請檢查有沒有contention造成的waiting.

先是這樣
1. MSSQL Server的Locking機制要到SQL 2008才有長足改善,SQL2005只是半吊子,所以還是建議Select下nolock進行Dirty read

2. 請說明前端程式是怎麼開發的,很多時候AP並沒有要求hold lock,但ADO .Net Kernel or even MSDTC自己幫你加上cursor lock,那會動才有鬼


最簡單的方法WITH (NOLOCK) ,但會發生DIRTY DATA要看能不能接受,

還有要看你的TABLE有幾筆,
資料表切割要企業版,就算你切割了還是一樣會LOCK,

還有更新的筆數有有關聯,欄位的型態、數量也有差別,
最簡單的方式WITH (NOLOCK) ,但要注意是否是一對多、有下CONSTRAINT,
更新也可以改寫改成一次更新一千筆,這樣會好很多,
還有每筆更新都會占用一個記憶體,一次更新十萬筆就會占用十萬份,
如果常需要幾十萬筆的更新要改寫SQL或者設定,

還有很多方法例如建立複製資料表,
可以避免DIRTY DATA,但是資料會有時間差,

有機會確認一下資料庫記憶體使用率,
index、table file的使用率,
是否自動更新統計

如果都沒有專業的DBA協助考慮把常更新的TABLE做成一個獨立的DATA FILE
(還是FILE GROUP,一個是ORACLE一個是MS SQL不太確定是哪個)

60~70的人員寫入資料,是指同時大量更新,還是只是修改一筆,
同時大量更新的話,記憶體太少,只修改一筆代表程式寫不好,
更新完資料表沒有立即釋放。
綠手指
看完大家的回答,
我也來說說我的做法

我的資料庫每天大約會有 80K 筆資料進資料庫
雖然我沒有70~80 人會同時使用.

但是我把資料分為"當天"跟"以前"!
如果查詢當天資料應該就不慢,那就不會有這問題.因為當天資料最常被使用.

我想你可能需要朝資料分類跟管理去把資料庫作一些整理
這樣效率會比較高一點

給你當建議
  • 2
內文搜尋
X
評分
評分
複製連結
Mobile01提醒您
您目前瀏覽的是行動版網頁
是否切換到電腦版網頁呢?