exists改写SQL,使其走正确的执行计划
生活随笔
收集整理的這篇文章主要介紹了
exists改写SQL,使其走正确的执行计划
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數據庫環境:SQL SERVER 2005
今天看到一條SQL,寫得不是很復雜,返回7000多條數據,卻執行了15s。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 DISTINCTctlm1101.fiscal_year* 100+ ctlm1101.fiscal_periodFROMctlm1101WHEREflag_curr = 'Y'AND id_oprcode = 'acinv'AND acinv_07.id_wh = ctlm1101.id_table) GROUP BY acinv_07.id_item ---------------------------------------- SELECT COUNT(*) FROM ctlm1101 WHERE flag_curr = 'Y'AND id_oprcode = 'acinv'--26SELECT COUNT(*) FROM acinv_07--1347176 View Code我們先看看一下SQL的執行計劃
2個表關聯走的是嵌套循環,且大表acinv_07是驅動表,ctlm1101被掃描了1347176次,
ctlm1101.id_table是連接列,且關聯后再對acinv_07.fiscal_year * 100 + acinv_07.fiscal_period過濾,
因此,慢是自然的了。
那我們是否可以改寫后,根據原SQL的意思,我們用Exists改寫成如下,核對數據無誤
SELECT acinv_07.id_item ,SUM(acinv_07.dec_endqty) dec_endqty FROM acinv_07 WHERE EXISTS ( SELECT NULLFROM ctlm1101WHERE flag_curr = 'Y'AND id_oprcode = 'acinv'AND acinv_07.id_wh = ctlm1101.id_tableAND ctlm1101.fiscal_year = acinv_07.fiscal_yearAND ctlm1101.fiscal_period = acinv_07.fiscal_period ) GROUP BY acinv_07.id_item View Code改寫之后,執行計劃走的是哈希連接,數據一查詢是秒出。我們來分析改寫后的執行計劃,
小表ctlm1101作為哈希連接的驅動表,id_table,fiscal_year,fiscal_period作為連接列,和大表acinv_07
關聯時過濾了大部分數據,所以通過哈希匹配可以快速返回所有結果。
?
轉載于:https://www.cnblogs.com/boss-he/p/4764466.html
總結
以上是生活随笔為你收集整理的exists改写SQL,使其走正确的执行计划的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Poj2480欧拉函数
- 下一篇: WebSocket学习