1. 程式人生 > 實用技巧 >SQL慢查詢原因及優化

SQL慢查詢原因及優化

SQL慢查詢原因:

  1. 沒有索引或者沒有使用到索引
  2. I/O吞吐量小,形成了瓶頸效應
  3. 沒有建立計算列導致查詢不優化
  4. 記憶體不足
  5. 網路速度慢
  6. 查詢出的資料量過大(可以採用多次查詢,其他的方法降低資料量)
  7. 鎖或者死鎖
  8. sp_lock,sp_who,活動的使用者檢視,原因是讀寫競爭資源
  9. 返回了不必要的行和列(這裡其實也和索引有關,如果不必要的行和列,沒有用到索引造成了全表掃描,或者是這些行和列佔用了鎖,才會拖慢)
  10. 查詢語句不好,沒有優化

SQL語句優化:

  1. 儘量避免全表掃描,首先考慮在where和order by涉及的列上建立索引
  2. 儘量避免在where子句中對欄位進行null值判斷,會導致引擎放棄使用索引而進行全表掃描
  3. 儘量避免在where子句中使用!= 或 <> 操作符,會導致引擎放棄使用索引而進行全表掃描
  4. 應儘量避免在 where 子句中使用 or 來連線條件,會導致引擎放棄使用索引而進行全表掃描
  5. 應儘量避免使用 in 和 not in,會導致全表掃描,能用between就不要用in
  6. 全模糊查詢也會導致全表掃描,可以考慮全文檢索
    如:
     select id from t where name like '%c%';
  7. 在 where 子句中使用引數,也會導致全表掃描,可以改為強制使用索引
    如:
     select id from t where num=@num ;
    改為:
     select
    id from t with(index(索引名)) where num=@num ;
  8. 儘量避免在 where 子句中對欄位進行表示式操作, 這將導致引擎放棄使用索引而進行全表掃描
    如:
     select id from t where num/2=100;
    可以改為:
     select id from t where num=100*2;
  9. 儘量避免在 where 子句中對欄位進行函式操作,這將導致引擎放棄使用索引而進行全表掃描
  10. 不要在 where 子句中的“=”左邊進行函式. 算術運算或其他表示式運算,否則系統將可能無法正確使用索引