原文:
通過調整表union all的順序優化sql
作業系統:windows xp
資料庫版本:sql server 2005
今天遇到乙個sql,過濾條件是自動生成的,因此,沒法通過調整sql的謂詞達到優化的目的,只能去找sql中的「大表」。有乙個檢視返回的結果集比較大,如果能調整的話,也只能調整該檢視了。
看了一下該檢視的結構,裡面還套用了另一層檢視,直接看最裡層檢視的查詢sql。
select a.dfeesum_no ,
a.opr_amt - isnull(b.dec_pay, 0) - isnull(b.dec_corrpay, 0)
- isnull(b.dec_deduamt, 0) dec_amt ,
a.dec_camt - isnull(b.dec_pay, 0) - a.dec_comprate
* isnull(b.dec_deduamt, 0) dec_compamt ,
a.dec_ramt - isnull(b.dec_corrpay, 0) - ( a.dec_comprate - 1 )
* isnull(b.dec_deduamt, 0) dec_corramt ,
a.dec_qty - isnull(b.dec_qty, 0) - isnull(b.dec_deduqty, 0) opr_qty ,
isnull(b.dec_pay, 0) dec_pay ,
isnull(b.dec_corrpay, 0) dec_corrpay ,
isnull(b.dec_deduqty, 0) dec_deduqty ,
isnull(b.dec_deduamt, 0) dec_deduamt ,
isnull(b.dec_qty, 0) dec_qty
from ctlm8686 a
left join ( select dfeesum_no ,
sum(dec_ramt) dec_pay ,
sum(dec_corramt) dec_corrpay ,
sum(dec_qty) dec_qty ,
sum(case when flag_dedu = '1' then dec_deduamt
else 0
end) dec_deduamt ,
sum(case when flag_dedu = '1' then dec_deduqty
else 0
end) dec_deduqty
from dfeepay_03
group by dfeesum_no
) b on a.dfeesum_no = b.dfeesum_no
union all
select a.dfeesum_no ,
a.dec_amt - isnull(b.dec_pay, 0) - isnull(b.dec_corrpay, 0)
- isnull(b.dec_deduamt, 0) dec_amt ,
a.dec_compamt - isnull(b.dec_pay, 0) - a.dec_comprate
* isnull(b.dec_deduamt, 0) dec_compamt ,
a.dec_corramt - isnull(b.dec_corrpay, 0) - ( a.dec_comprate - 1 )
* isnull(b.dec_deduamt, 0) dec_corramt ,
a.opr_qty - isnull(b.dec_qty, 0) - isnull(b.dec_deduqty, 0) opr_qty ,
isnull(b.dec_pay, 0) dec_pay ,
isnull(b.dec_corrpay, 0) dec_corrpay ,
isnull(b.dec_deduqty, 0) dec_deduqty ,
isnull(b.dec_deduamt, 0) dec_deduamt ,
isnull(b.dec_qty, 0) dec_qty
left join ( select dfeesum_no ,
sum(dec_ramt) dec_pay ,
sum(dec_corramt) dec_corrpay ,
sum(dec_qty) dec_qty ,
sum(case when flag_dedu = '1' then dec_deduamt
else 0
end) dec_deduamt ,
sum(case when flag_dedu = '1' then dec_deduqty
else 0
end) dec_deduqty
from dfeepay_03
group by dfeesum_no
) b on a.dfeesum_no = b.dfeesum_no
返回結果集有1433891行,其中
改寫後的sql如下
select a.dfeesum_no ,
a.opr_amt - isnull(b.dec_pay, 0) - isnull(b.dec_corrpay, 0)
- isnull(b.dec_deduamt, 0) dec_amt ,
a.dec_camt - isnull(b.dec_pay, 0) - a.dec_comprate
* isnull(b.dec_deduamt, 0) dec_compamt ,
a.dec_ramt - isnull(b.dec_corrpay, 0) - ( a.dec_comprate - 1 )
* isnull(b.dec_deduamt, 0) dec_corramt ,
a.dec_qty - isnull(b.dec_qty, 0) - isnull(b.dec_deduqty, 0) opr_qty ,
isnull(b.dec_pay, 0) dec_pay ,
isnull(b.dec_corrpay, 0) dec_corrpay ,
isnull(b.dec_deduqty, 0) dec_deduqty ,
isnull(b.dec_deduamt, 0) dec_deduamt ,
isnull(b.dec_qty, 0) dec_qty
from ( select a.dfeesum_no ,
a.opr_amt ,
a.dec_camt ,
a.dec_comprate ,
a.dec_ramt ,
a.dec_qty
from ctlm8686 a
union all
select a.dfeesum_no ,
a.dec_amt ,
a.dec_compamt ,
a.dec_comprate ,
a.dec_corramt ,
a.opr_qty
) aleft join ( select dfeesum_no ,
sum(dec_ramt) dec_pay ,
sum(dec_corramt) dec_corrpay ,
sum(dec_qty) dec_qty ,
sum(dec_deduamt) dec_deduamt,
sum(dec_deduqty) dec_deduqty
from dfeepay_03
where flag_dedu = '1'
group by dfeesum_no
) b on a.dfeesum_no = b.dfeesum_no
跑這個檢視的查詢語句,從原來的一分半鐘降到一分鐘,對於整個sql而言,則從原來跑幾分鐘的直接10s出結果。
通過調整表union all的順序優化SQL
原文 通過調整表union all的順序優化sql 作業系統 windows xp 資料庫版本 sql server 2005 今天遇到乙個sql,過濾條件是自動生成的,因此,沒法通過調整sql的謂詞達到優化的目的,只能去找sql中的 大表 有乙個檢視返回的結果集比較大,如果能調整的話,也只能調整該...
線性表的順序列表實現
教材 data structures and algorithm analysis in c third edition 線性表 線性表是由element組成的有限且有序的序列,有序指的是每乙個元素都有自己的位置,並非指按其值大小排序。而按照元素其值與元素位置的關係可以分為有序線性表 sorted ...
線性表的順尋儲存
此表很好建立,而且進行查詢,刪除,插入都容易理解,但是有乙個缺點 刪除和插入需要調動好些元素 線性表的順序實現 include include define maxsize 15 struct sqlist 線性表的初始化 void init sq sqlist l 線性表的建立 void buil...