操作系統:Windows 2007
數據庫版本:SQL SERVER 2005
今天同事讓我看一條SQL,說是在前臺查詢很快,但是把SQL取出來,在數據庫中執行的時候,跑10分鐘都不出結果。
看了一下SQL,最后定位到一個視圖中的一個子查詢上面。該子查詢的SQL文本如下:
SELECT acinv_07.id_item , SUM(acinv_07.dec_endqty) dec_endqtyFROM acinv_07WHERE 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時,不到萬不得已,不要對索引列進行計算。
新聞熱點
疑難解答