設計高效sql一般經驗談

2021-06-27 15:12:17 字數 2158 閱讀 6107

1不用在sql語句使用系統預設的保留關鍵字

2盡量用exists 和 not exists 代替 in 和 not in

這條在sql2005之後,在索引一樣,統計資訊一樣的情況下,exists ,in效果是一樣的。

以adventureworks資料庫為例,查詢在

humanresources.employeeaddress

有位址的

employee

資訊,

用in 

語句如下:

setstatistics

ioon

select

*from humanresources.employee

where

employeeid in

(select employeeid from humanresources.employeeaddress ea)

setstatistics

iooff

執行後,訊息如下:

(290 

行受影響)

表'employeeaddress'

。掃瞄計數

1,邏輯讀取

4 次,物理讀取

0 次,預讀

0 次,

lob 

邏輯讀取

0 次,

lob 

物理讀取

0 次,

lob 

預讀0 次。

表'employee'

。掃瞄計數

1,邏輯讀取

9 次,物理讀取

0 次,預讀

0 次,

lob 

邏輯讀取

0 次,

lob 

物理讀取

0 次,

lob 

預讀0 次。

執行計畫如圖

用exists ,語句如下,

setstatistics

ioon

select

*from humanresources.employee

where

exists(

select employeeid from humanresources.employeeaddress ea

where

humanresources.employee.employeeid=ea.employeeid)

setstatistics

iooff

執行後,訊息如下:

(290 

行受影響)

表'employeeaddress'

。掃瞄計數

1,邏輯讀取

4 次,物理讀取

0 次,預讀

0 次,

lob 

邏輯讀取

0 次,

lob 

物理讀取

0 次,

lob 

預讀0 次。

表'employee'

。掃瞄計數

1,邏輯讀取

9 次,物理讀取

0 次,預讀

0 次,

lob 

邏輯讀取

0 次,

lob 

物理讀取

0 次,

lob 

預讀0 次。

執行計畫如圖:

3盡量不用select * from …..,而要寫欄位名 select field1,field2,…

這條沒什麼好說的,主要是按需查詢,不要返回不必要的列和行。

4在sql 查詢中應盡量使用索引列來加快查詢速度

5任何在order by 語句的非索引項或者有計算表示式都將降低查詢速度

6任何在where子句中使用is null 或 is not null 的語句不允許使用索引,效率較低

7萬用字元%在詞首時,系統不使用索引,當萬用字元出現在其他位置時,優化器就能利用索引

8在海量資料的sql查詢語句中盡量少用格式轉換

9任何對列的操作都將導致表掃瞄,它包括資料庫函式、計算表示式等,查詢時要盡可能將操作移至等號右邊

10 in 、or子句常會使索引失效

11通常情況下,連線比子查詢效率要高

hibernate 經驗談(一)

以前仔細研究過hibernate,現在隨著專案接觸,也慢慢的有所深入,下面將自己的一些新的體會發出來。1.盡量少用one to many的對映,如果用請把lazy設定成true,這樣在查詢主表時所有關聯的子表就不會查詢了,更不會浪費資料庫的資源。2.如果lazy true 時,如果需要 用crite...

系統設計經驗談(三)

2010 12 1 1.抽象的模組劃分圖是示意圖,在系統設計中應該有配套具體的模組關係圖對其進行解釋。2.環形呼叫關係的出現有時是不可避免的。盡量不要出現。2010 12 2 1.在複雜呼叫系統中,應該明確同步阻塞關係。2.在interpreter模式中,若需要崩潰恢復,不能使用凍結指令碼虛擬機器並...

OO分析設計經驗談

1.oo分析設計不一定用於oo語言,同樣適用於vb,php 以前版本 c等 程式設計之前最好進行oo設計,然後再進行編碼,這樣的 可讀性和易重構性要強得多.2.oo設計之前,首先應具備一定的oo概念.如果從來沒有接觸過,應好好補一下.3.uml是現在做oo設計的統一語言,應好好學習,應擁有一本 4....