通過調整表union all的順序優化SQL

2021-09-08 10:34:42 字數 3953 閱讀 6211

原文:

通過調整表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...