2016-03-01 58 views
2

我有下面的SQL查詢,它無法執行的錯誤「查詢處理器耗盡內部資源,並不能產生查詢計劃。這是一個罕見的事件,只有預期的非常複雜的查詢或引用大量表或分區的查詢,請簡化查詢。「左加入與條件引發查詢處理器錯誤

SELECT merchant.id,merchant.name,order.id,order.name,order.shipaddress 
FROM  orders AS order 
LEFT JOIN 
merchants AS merchant 
ON 
order.merchantid = merchant.id 
WHERE 
order.id IN (12 , 50 , 60 , 48,.. ...(upto 38000 id's)) 
ORDER BY order.id 

如果我刪除where條件,相同的查詢運行左連接條件或內連接conidtion罰款(並返回65記錄)。

它也適用於包含條件的地方,但僅限於內部連接。最初我認爲它在WHERE條件下的IN子句的問題,但現在我有點困惑如何左是造成這個問題。

任何幫助我如何解決這個問題。一種解決方法是將WHERE子句中的所有記錄插入到臨時表中並按照下面的說明使用它。但是這個問題與相同?

The query processor ran out of internal resources exception

+3

您應該在表中存儲38,000個ID並在表上使用'JOIN','IN'或'EXISTS'。它會更快,特別是如果表有索引。而且,'left join'是多餘的,因爲'WHERE'條件將它變成了一個內連接。 –

+1

我想臨時表是要走的路。而且,當左連接將右側表的條件放在ON子句中時,即查詢中存在左連接問題,即將WHERE子句條件移至ON子句(使用AND)以獲得真正的左連接行爲。現在您可以定期獲得內部連接結果。 – jarlh

+0

把你的ID放到表變量中並使用'join' /'exists'。 「 –

回答

1

因爲你IN條款太大你得到這個錯誤。按照documentation

包括一個 IN子句一個非常大的數量值(成千上萬)會消耗資源並返回錯誤8623或8632.要 解決此問題,存儲在中的項目列表中。

正如評論中所建議的那樣,您應該將這些ID保存在(臨時)表中,然後加入它們。