1. 程式人生 > >高併發訪問資料庫問題

高併發訪問資料庫問題

但是後者的效率顯然要高於前者。因為後者不會產生大量鎖定的表掃描或是索引掃描。

如果你想校驗表裡是否存在某條紀錄,不要用count(*)那樣效率很低,而且浪費伺服器資源。可以用EXISTS代替。如: 
IF (SELECT COUNT(*) FROM table_name WHERE column_name ='xxx') 
可以寫成: 
IF EXISTS (SELECT * FROM table_name WHERE column_name = 'xxx')

12.儘量使用表變數來代替臨時表。如果表變數包含大量資料,請注意索引非常有限(只有主鍵索引)。

13.避免頻繁建立和刪除臨時表,以減少系統表資源的消耗。

14.臨時表並不是不可使用,適當地使用它們可以使某些例程更有效,例如,當需要重複引用大型表或常用表中的某個資料集時。但是,對於一次性事件,最好使用匯出表。

15.在新建臨時表時,如果一次性插入資料量很大,那麼可以使用 select into 代替 create table,避免造成大量log ,以提高速度;如果資料量不大,為了緩和系統表的資源,應先create table,然後insert。

16.如果使用到了臨時表,在儲存過程的最後務必將所有的臨時表顯式刪除,先 truncate table ,然後 drop table,這樣可以避免系統表的較長時間鎖定。 
17.在所有的儲存過程和觸發器的開始處設定 SET NOCOUNT ON ,在結束時設定 SET NOCOUNT OFF。無需在執行儲存過程和觸發器的每個語句後向客戶端傳送 DONE_IN_PROC 訊息。

18.儘量避免大事務操作,提高系統併發能力。

19.儘量避免向客戶端返回大資料量,若資料量過大,應該考慮相應需求是否合理。