none
效能調校-SQL 指令詢問 RRS feed

  • 問題

  •  

    目前有發現一個現象

    從client 以odbc 方式連線至主機

    對單一Table下了查詢的資料,條件是以like型式

    Table總筆數有110萬筆

    ex:   select * from customer where tel like '%12345'

    發現第一次執行的時間是1min,再執行一次相同的指令就變成10幾秒

    想請教在SQL是不是有這樣的特性會讓第一次被執行的指令速度比較慢

    謝謝

     

    2008年6月12日 上午 04:15

解答

  • 第一次被執行的語法,執行後會放到類似快取的暫存區

    第二次再run相同的語法時,對 sql server來說就不用再重新產生新的執行計畫

    而只直到快取取資料即可,雖然快,但並不表示語法是ok的

    如果一定要用like,建議把%放右邊吧,用 LIKE '12345%'是符合SARGs

    有機會用index搜尋快速找到資料

    但放左邊,以萬用字元開頭,sql server無法搭配索引結構來達到快速搜尋

     

    2008年6月12日 上午 05:46
  • 1. 多加一點條件來縮小查詢範圍。

    2. LIKE 本身其實效能就不好,所以應盡可能搭配其他條件來縮小查詢。

    3. I/O 的速度如果可以加快會比較好。

    4. 相同的查詢結果是會被快取住的。

    5. 除非資料量小,否則不應一次傳回全部的資料。

    2008年6月15日 上午 10:59
    版主

所有回覆

  • 第一次被執行的語法,執行後會放到類似快取的暫存區

    第二次再run相同的語法時,對 sql server來說就不用再重新產生新的執行計畫

    而只直到快取取資料即可,雖然快,但並不表示語法是ok的

    如果一定要用like,建議把%放右邊吧,用 LIKE '12345%'是符合SARGs

    有機會用index搜尋快速找到資料

    但放左邊,以萬用字元開頭,sql server無法搭配索引結構來達到快速搜尋

     

    2008年6月12日 上午 05:46
  • 1. 多加一點條件來縮小查詢範圍。

    2. LIKE 本身其實效能就不好,所以應盡可能搭配其他條件來縮小查詢。

    3. I/O 的速度如果可以加快會比較好。

    4. 相同的查詢結果是會被快取住的。

    5. 除非資料量小,否則不應一次傳回全部的資料。

    2008年6月15日 上午 10:59
    版主