1. 程式人生 > >where 條件並不是越多越好

where 條件並不是越多越好

今天在寫一個sql時,遇到這麼個問題,where條件多寫了幾個,結果結果執行計劃顯得很槽糕:

表A 有欄位 heard_id,class_no,bath_no,class_name

表B有欄位 heard_id,class_no,bath_no,class_value

首先A表與B表是通過heard_id相關聯,首先得承認這2個表設計有點問題,不滿足正規化的要求,有冗餘的資訊,如class_no,bath_no,結果我在寫寫sql時寫成這個樣子:

select a.class_no,a.batch_no,a.class_name,b,class_value

from a,b

where a.heard_id = b.heard_id

   and a.class_no = b.class_no

   and a.batch_no = b. batch_no

   and a.class_no = 10;

結果執行計劃顯示,A表在關聯B表的時候,並沒有用heard_id這個欄位的索引,而是選擇用了class_no,batch_no的聯合索引,結果導致這個sql跑了N久沒跑出來,後來稍微改了下,把class_no,batch_no條件拿掉了,變成

select a.class_no,a.batch_no,a.class_name,b,class_value

from a,b

where a.heard_id = b.heard_id

   and a.class_no = 10;

這樣寫執行計劃就選擇了heard_id這個欄位的索引,很快就查詢出來了,其實2個表關聯通過heard_id就足夠了,這也許是很多開發人員的開發習慣,只要可以,就把已知的所有條件都寫在where字句中,以確保萬無一失,其實有時候這樣做會適得其反,大家要注意了。。。。。。