萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> oracle教程 >> SQL語句性能調整

SQL語句性能調整

一、 索引(INDEX)使用的問題

1. 索引(INDEX),用還是不用?這是個的問題。

是全表掃描還是索引范圍掃描主要考慮SQL的查詢速度問題。這裡主要關心讀取的記錄的數目。根據DONALD K .BURLESON的說法,使用索引范圍掃描的原則是:

對於數據有原始排序的表,讀取少於表記錄數40%的查詢應該使用索引范圍掃描。對讀取多於表記錄數40%的查詢應全表掃描。

對於未排序的表,讀取少於表記錄數7%的查詢應該使用索引范圍掃描,反之,對讀取多於表記錄數7%的查詢應全表掃描。

注:在不同的書中,對是否使用索引的讀取記錄的百分比值不太一致,基本上是一個經驗值,但是讀取記錄的百分比越低,使用索引越有效。

2. 如果列上有建索引,什麼SQL查詢是有用索引(INDEX)的?什麼SQL查詢是沒有用索引(INDEX)的?

存在下面情況的SQL,不會用到索引:

存在數據類型隱形轉換的,如:

select * from staff_member where staff_id=’123’;

列上有數學運算的,如:

select * from staff_member where salary*2<10000;

使用不等於(<> )運算的,如:

select * from staff_member where dept_no<>2001;

使用substr字符串函數的,如:

select * from staff_member where substr(last_name,1,4)=’FRED’;

‘%’通配符在第一個字符的,如:

select * from staff_member where first_name like ‘%DON’;

字符串連接(||)的,如:

select * from staff_member where first_name||’’=’DONALD’

3. 函數的索引

日期類型也是很容易用到的,而且在SQL語句中會使用to_char函數以查詢具體的的范圍日期。如:select * from staff_member where TO_CHAR(birth_day,’YYYY’)=’2003’; 我們可以建立基於函數的索引如:CREATE INDEX Ind_emp_birth ON staff_member (to_char((birth_day,’YYYY’));

  • 共4頁:
  • 上一頁
  • 1
  • 2
  • 3
  • 4
  • 下一頁
copyright © 萬盛學電腦網 all rights reserved