操作系統:Windows 2007
數據庫版本:SQL SERVER 2005
發表日期:2014-11-07?16:56:01
今天同事讓我看一條SQL,說是在前臺查詢很快,但是把SQL取出來,在數據庫中執行的時候,跑10分鐘都不出結果。
看了一下SQL,最后定位到一個視圖中的一個子查詢上面。該子查詢的SQL文本如下:
SELECT
acinv_07.id_item ,
SUM
(acinv_07.dec_endqty) dec_endqty
FROM
acinv_07
WHERE
acinv_07.fiscal_year
*
100
+
acinv_07.fiscal_period
=
(
SELECT
DISTINCT
ctlm1101.fiscal_year
*
100
+
ctlm1101.fiscal_period
FROM
ctlm1101
WHERE
flag_curr
=
'
Y
'
AND
id_oprcode
=
'
acinv
'
AND
acinv_07.id_wh
=
ctlm1101.id_table)
GROUP
BY
acinv_07.id_item
在acinv_07表上的列fiscal_year和列fiscal_period是有索引的。但是,如果對索引列進行運算,就會導致原本可以走索引的走不了索引。于是,動手改寫成如下SQL:
SELECT
id_item ,
SUM
(dec_qty) dec_qty
FROM
dpurreq_03
GROUP
BY
id_item
) a ,
(
SELECT
a.id_item ,
SUM
(a.dec_endqty) dec_endqty
FROM
acinv_07 a ,
(
SELECT
DISTINCT
ctlm1101.fiscal_year ,
ctlm1101.fiscal_period ,
id_table
FROM
ctlm1101
WHERE
flag_curr
=
'
Y
'
AND
id_oprcode
=
'
acinv
'
) b
WHERE
a.fiscal_year
=
b.fiscal_year
AND
a.fiscal_period
=
b.fiscal_period
AND
a.id_wh
=
b.id_table
GROUP
BY
a.id_item
再執行,4s鐘左右就可以跑出結果了。
對于開發來說,純粹是為了實現把結果數據展示出來,而不會過多考慮SQL的性能問題。
?
總結
寫SQL時,不到萬不得已,不要對索引列進行計算。
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

