我遇到了一個SQL語句與子查詢結構:子查詢導致SQL Server的無限執行
SELECT a12.ship_date SHIP_DATE,
Sum(a11.qty_sold) QTY_SOLD
FROM order_detail a11
JOIN order_fact a12
ON (a11.customer_id = a12.customer_id
AND a11.emp_id = a12.emp_id
AND a11.order_date = a12.order_date
AND a11.order_id = a12.order_id)
WHERE a12.ship_date IN (SELECT DISTINCT ship_date
FROM order_fact
WHERE order_date BETWEEN (SELECT DISTINCT day_date - 1
FROM lu_day
WHERE
day_date = CONVERT(DATETIME,
'2007-01-01 00:00:00',
120)) AND
(SELECT DISTINCT day_date + 1
FROM
lu_day
WHERE
day_date = CONVERT(DATETIME,
'2007-01-01 00:00:00',
120)))
GROUP BY a12.ship_date
它不會停止,直到我強迫這一點。但是,如果我改變的地方進入
where a12.SHIP_DATE in ('2009-09-08 00:00:00','2009-07-08 00:00:00')
它可以被正確執行。
我猜的原因是子查詢包含ORDER_FACT哪個列在外部查詢也依賴於它,但我不知道爲什麼。
我不熟悉SQL Server,任何人都可以解釋爲什麼會發生?謝謝。
========更新=======
謝謝你們的回答。刪除未使用的子查詢時可以更快地執行,但我仍然想知道大規模子查詢中發生了哪些瓶頸。
爲每個答案投票,因爲他們是正確的解決方案,但我認爲最好是一些執行計劃將幫助我學習更多。謝謝。
它可能不是無限的......只需執行很長時間。您應該檢查解釋計劃以查看優化程序是如何決定解決查詢的。 – Frazz
你能否在lu_day上解釋這些subSELECT背後的推理?他們有點模糊,因爲他們似乎在處理和返回常量。 – Frazz
如果您對日期('2007-01-01')進行硬編碼,爲什麼在查詢中選擇它?你可以這樣做:'WHERE order_date在CONVERT(DATETIME,'2006-12-31 00:00:00',120)和CONVERT(DATETIME,'2007-01-02 00:00:00',120) '? – NickyvV