程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> Oracle SQL查詢優化

Oracle SQL查詢優化

編輯:Oracle數據庫基礎
下面的優化方法比較常用也比較容易掌握,其中的SQL語句系手動敲入,難免出錯,請吻Copy。

1、 使用where子句進行過濾,在where條件裡面避免使用函數

2、 使用表連接而不使用多個查詢

BAD:

selece name,product_type_id from products where product_id = 1;

-- product_type_id = 1;

Select name from product_type where product_type_id = 1 ;

GOOD:

Select pt.Name from product_type pt ,products p where p.product_type_id = pt.product_type_id and product_id = 1;

3、 執行多個表查詢時使用完全限定的列引用,以免在篩選查詢結果時判斷表的每個列

BAD:

Select p.name,pt.name,description,price from products p ,product_types pt

Where p.product_type_id = pt.product_type_id and product_id = 1;

GOOD:

Select p.name,pt.name, p.description, p.price from products p ,product_types pt

Where p.product_type_id = pt.product_type_id and product_id = 1;

4、 使用case表達式代替多個查詢

BAD:

Select count(*) from products where price < 13;

Select count(*) from products where price between 13 and 15;

Select count(*) from products where price >15;

GOOD:

Select

Count(case when price < 13 then 1 else null end) low,

Count(case when price between 13 and 15 then 1 else null end) med,

Count(case when price >15 then 1 else null end) high

From products;

5、 添加表索引

從一個包含多行的表查詢少數行時,只需要為一個列指定索引,當單個查詢檢索的行數不大於總行數的10%時,建立索引是有用的。意味著索引的候選列應該用於存儲范圍廣泛的值。好的候選列應該是對於每個記錄包含唯一數字的列,差的索引候選列只是包含小范圍數字代碼的列,如1、2、3、4,。Oracle會為主鍵列和包含在唯一索引中的列創建索引。

6、 使用where而不是用having;where用於過濾行,而having用於過濾組。

BAD:

Select product_type_id ,avg(price) from product group by product_type_id

Having product_type_id in (1,2);

GOOD:

Select product_type_id,avg(prict) from products where product_type_id in (1,2)

Group by product_type_id;

7、 使用union all而不是union

Union all 用於獲得兩個查詢檢索到的所有行,包括重復行;union用於獲得檢索到的所有不重復的行。因為union刪除了重復行,所以需要一定的時間,所以盡量使用union all;

8、 使用exists而不是用in

BAD:

Select product_id,name from products where product_id in(select productid from purchases);

GOOD:

Select product_id,name from products outer where EXISTS(select 1 from purchases inner where inner.product_id = outer.product_id);

9、 使用Exists而不使用DISTINCT

DISTINCT用於禁止重復行的顯示,而exists用於檢測子查詢返回的行的存在性。DISTINCT在禁止重復行之前要排序檢索到的行。

         BAD:

Select distinct pr.product_id,pr.name from products pr,purchases pu where pr.product_id = pu.product_id;

GOOD:

Select product_type_id,avg(prict) from products where product_type_id in (1,2)

Group by product_type_id;

10、使用綁定變量

         Oracle會緩存已經執行過的SQL語句,但兩個SQL語句必須完全相同,包括字符、空格、字母的大小寫。

         使用綁定變量的例子:

         Variable product_id_bv number

         Begin :product_id_bv :=1 end; /

Select * from producst where product_id = : product_id_bv;

Begin :product_id_bv :=2 end; /

Select * from producst where product_id = : product_id_bv;

   注意:綁定變量是特定於會話的,如果會話丟失,則應該重新設置綁定變量。

         顯示綁定變量:PRINT product_id_bv;

         綁定變量可定義為多種變量格式,如果值類型(number等),也可以定義為游標或table;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved