4 盡可能不用Distinct

2022-09-03 23:06:26 字數 1380 閱讀 4882

大多數情況下,distinct函式都會導致對最終結果集完成一次排序,因此,這就成為成本最昂貴的排序之一。distinct一直是sql語言中成本最高的函式之一。不過,對於db2 v9,優化工具會盡量利用索引來消除為確定唯一性所帶來的排序,其方法類似於目前用group by語句完成優化時的做法。不過,實際上不必在sql中使用distinct,完全可以使用其他方式重寫查詢來得到同樣的結果,這樣做往往更為高效。開發人員現在都很喜歡用distinct,很多人在所有語句上都會加上distinct來確保不出現重複。不過這種**的效率很低。在對應用調優時,我首先要做的事情之一就是審查源**,找出所有包含distinct的語句,了解這些查詢是否確實會得到重複的結果,檢視這個distinct是否會導致乙個排序,然後重寫這些語句。通過對每晚批量作業的全面分析,就能很容易地大幅減少批量處理週期時間。不過要記住,如果查詢中包含distinct,只要不會因此導致執行乙個排序,這個查詢可能也很高效。

要從結果集消除重複,可以嘗試下面的做法:

使用group by(v9之前),這會利用關聯索引來消除為確定唯一性所導致的排序。

使用乙個in或exists子查詢重寫查詢。如果某個表可能導致重複(由於是一對多關係),但是這個表中並不包含結果集將返回的資料,這種情況下這種方法就很適用。

例如,給定當前參與專案的一組員工。其中很多員工可能同時參加了多個專案,不過我們希望他們只出現一次。以下查詢:

select distinct e.empno, e.lastname  

from emp         e,  

empprojact  ep  

where 

e.empno

= ep

.empno 

可以重寫為:

select e.empno, e.lastname  

from emp         e,  

empprojact  ep  

where 

e.empno

= ep

.empno  

group by e.empno, e.lastname 

也可以重寫為:

select e.empno, e.lastname  

from emp  e  

where exists  

(select 1  

from   empprojact  ep  

where 

e.empno

= ep

.empno) 

還可以重寫為:

select e.empno, e.lastname  

from emp  e  

where e.empno in  

(select ep.empno  

from   empprojact  ep)  

盡可能使用 const

使用 const 的好處在於它允許指定一種語意上的約束 某種物件不能被修改 編譯器具體來實施這種約束。通過 const,你可以通知編譯器和其他程式設計師某個值要保持不變。只要是這種情況,你就要明確地使用 const 因為這樣做就可以借助編譯器的幫助確保這種約束不被破壞。對指標來說,可以指定指標本身為...

盡可能使用const

const定義語義約束 制定乙個不被改動的物件,編譯器會強制實施這項約束。只要某值保持不變時事實,就應該確實說出來,這樣編譯器可以確保這項約束不違反。const多才多藝 可以用在classes外部修飾global或namespace作用域中的常量,或修飾檔案 函式 或區塊作用於中被宣告為static...

盡可能使用const

一 中心思想 1 將某些東西宣告為const可幫助編譯器偵測出錯誤用法。const可被施加於任何作用域內的物件 函式引數 函式返回型別 函式返回型別 成員函式本體 2 編譯器強制實施bitwise constness,但你編寫程式時應該使用 概念上的常量性 3 當const和non const成員函...