程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> 如何調整SQL語句性能

如何調整SQL語句性能

編輯:關於SqlServer
下面就某些SQL語句的where子句編寫中需要注意的問題作詳細介紹。在這些where子句中,即使某些列存在索引,但是由於編寫了劣質的SQL,系統在運行該SQL語句時也不能使用該索引,而同樣使用全表掃描,這就造成了響應速度的極大降低。   

  1. IS NULL 與 IS NOT NULL   

  不能用null作索引,任何包含null值的列都將不會被包含在索引中。即使索引有多列這樣的情況下,只要這些列中有一列含有null,該列就會從索引中排除。也就是說如果某列存在空值,即使對該列建索引也不會提高性能。

  任何在where子句中使用is null或is not null的語句優化器是不允許使用索引的。

  2. 聯接列   

  對於有聯接的列,即使最後的聯接值為一個靜態值,優化器是不會使用索引的。我們一起來看一個例子,假定有一個職工表(employee),對於一個職工的姓和名分成兩列存放(FIRST_NAME和LAST_NAME),現在要查詢一個叫比爾.克林頓(Bill Cliton)的職工。   

  下面是一個采用聯接查詢的SQL語句,   

  select * from employss

   where

   first_name  ''  last_name ='Beill Cliton';

  上面這條語句完全可以查詢出是否有Bill Cliton這個員工,但是這裡需要注意,系統優化器對基於last_name創建的索引沒有使用。   

  當采用下面這種SQL語句的編寫,Oracle系統就可以采用基於last_name創建的索引。

  Select * from employee

   where

   first_name ='Beill' and last_name ='Cliton';

  遇到下面這種情況又如何處理呢?如果一個變量(name)中存放著Bill Cliton這個員工的姓名,對於這種情況我們又如何避免全程遍歷,使用索引呢?可以使用一個函數,將變量name中的姓和名分開就可以了,但是有一點需要注意,這個函數是不能作用在索引列上。下面是SQL查詢腳本:

  select * from employee

   where

   first_name = SUBSTR('&&name',1,INSTR('&&name',' ')-1)

   and

   last_name = SUBSTR('&&name',INSTR('&&name’,' ')+1)

  3. 帶通配符(%)的like語句   

  同樣以上面的例子來看這種情況。目前的需求是這樣的,要求在職工表中查詢名字中包含cliton的人。可以采用如下的查詢SQL語句:

  select * from employee where last_name like '%cliton%';

  這裡由於通配符(%)在搜尋詞首出現,所以Oracle系統不使用last_name的索引。在很多情況下可能無法避免這種情況,但是一定要心中有底,通配符如此使用會降低查詢速度。然而當通配符出現在字符串其他位置時,優化器就能利用索引。在下面的查詢中索引得到了使用:  

  select * from employee where last_name like 'c%';  

  4. Order by語句   

  ORDER BY語句決定了Oracle如何將返回的查詢結果排序。Order by語句對要排序的列沒有什麼特別的限制,也可以將函數加入列中(象聯接或者附加等)。任何在Order by語句的非索引項或者有計算表達式都將降低查詢速度。   

  仔細檢查order by語句以找出非索引項或者表達式,它們會降低性能。解決這個問題的辦法就是重寫order by語句以使用索引,也可以為所使用的列建立另外一個索引,同時應絕對避免在order by子句中使用表達式。

  5. NOT   

  我們在查詢時經常在where子句使用一些邏輯表達式,如大於、小於、等於以及不等於等等,也可以使用and(與)、or(或)以及not(非)。NOT可用來對任何邏輯運算符號取反。
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved