MSSQL資料庫 1000W資料優化整理

2022-06-18 03:30:13 字數 2530 閱讀 9758

go

set statistics time on

select count([styleid]) from [dbo].[ky_style]

set statistics time off

set statistics time on

select count(*) from [dbo].[ky_style]

set statistics time off

set statistics time on

select count(*) as h from [dbo].[ky_style]

set statistics time off

(1

行受影響)

cpu 時間 = 687 毫秒,占用時間 = 925

毫秒。(

1行受影響)

cpu 時間 = 594 毫秒,占用時間 = 594

毫秒。(

1行受影響)

cpu 時間 = 594 毫秒,占用時間 = 688 毫秒。

1.應盡量避免在 where 子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃瞄。

不太準確,在sql server 2008測試過,不等於也可以走索引查詢的,主要取決於返回的列是不是索引鍵,以及返回的行數在表中總行數的比率;

3.應盡量避免在 where 子句中對字段進行 null 值判斷,否則將導致引擎放棄使用索引而進行全表掃瞄,如:

select id from t where num is null

可以在num上設定預設值0,確保表中num列沒有null值,然後這樣查詢:

select id from t where num=0

錯誤,既然給了用例,那麼就很好測試了,is null可以走索引查詢的;

4.應盡量避免在 where 子句中使用 or 來連線條件,否則將導致引擎放棄使用索引而進行全表掃瞄,如:

select id from t where num=10 or num=20

可以這樣查詢:

select id from t where num=10

union all

select id from t where num=20

不太準確

,是否全表掃瞄看or裡的條件的,如果條件都能走索引查詢,那就沒必要全表掃瞄了,而且用union或者union all也存在這個問題;

6.in 和 not in 也要慎用,否則會導致全表掃瞄,如:

select id from t where num in(1,2,3)

對於連續的數值,能用 between 就不要用 in 了:

select id from t where num between 1 and 3

錯誤,sql謂詞只是代表語義,通常不會代表執行計畫;

7.如果在 where 子句中使用引數,也會導致全表掃瞄。因為sql只有在執行時才會解析區域性變數,但優化程式不能將訪問計畫的選擇推遲到執行時;它必須在編譯時進行選擇。然 而,如果在編譯時建立訪問計畫,變數的值還是未知的,因而無法作為索引選擇的輸入項。如下面語句將進行全表掃瞄:

select id from t where num=@num

可以改為強制查詢使用索引:

select id from t with(index(索引名)) where num=@num

錯誤,引數化當然可以走索引查詢;

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

不知道用意何在,表變數不支援索引,沒有統計資訊,而且超過固定大小,表變數也會存到tempdb和臨時表一樣;

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

不知道用意何在,

會話結束,臨時表自動釋放的;

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

不太準確,以前確實是這樣的,但是insert...select從2008開始,和select...into一樣日誌最小化了;

24.如果使用到了臨時表,在儲存過程的最後務必將所有的臨時表顯式刪除,先 truncate table ,然後 drop table,這樣可以避免系統表的較長時間鎖定。

未測試,先不說,嘿嘿

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

不太準確,

用大事務還是小事務,還是得看,對於單個使用者重複n次提交,肯定是用1個大事務更快,因為只有一次commit;對於對個使用者併發,一般是希望事務越短小越好。

mysql大資料建立索引 1000W

重新新增索引,對於1000w級的資料,按常規的方式來操作,時間上是乙個很大的問題。而且對於1000w級的資料,本人建議對此表進行分表優化。如果非要新增索引操作,方法倒是有的。1.建立乙個新的表結構 create table a new like a 2.對 a new 表進行索引建立。3.在mysq...

W 資料庫基礎

資料庫系統由三部分組成 資料庫 db 資料庫管理系統 dbms 和資料庫應用系統 資料加是用來儲存資料的,裡面儲存兩大類資料 使用者資料及系統資料 資料字典,具體為系統中的使用者以及使用者孤許可權,各種統計資訊等 資料庫是長期儲存在計算機內有組織和可共享的資料集合 每種dbms都支援一種資料模型,主...

MSSQL資料庫注入

用下面的這種方法暫時解決了,目前為止沒有再出現插入了 在global.asax檔案下面加入如下 希望能管用.針對.net region sql注入式攻擊 分析 處理使用者提交的請求 分析使用者請求是否正常 傳入使用者提交資料 返回是否含有sql注入式攻擊 private bool processsq...