BUG:使用大量 IN 子句的查詢會造成堆疊溢位

本文曾發行於 CHT288095
本文已封存。本文係以「現狀」提供且不會再更新。
BUG #: 235727 (shiloh_bugs)
BUG #: 58274 (sqlbug_70)
徵狀
在 IN 或 NOT IN 子句內包含大量引數 (上千個) 的查詢可能會產生堆疊溢位的情況。例如,下面的查詢會造成堆疊溢位:
SELECT max(au_id) FROM authors WHERE au_id IN(1,2,5,......,11571)  -- Query contains over 11570 arguments.
發生堆疊溢位時,SQL Server 錯誤記錄檔中會包含類似下面的資訊:
2000-08-10 12:02:37.87 spid51    08/10/00 12:02:37 Stack Overflow Dump not possible - Exception c00000fd E at 0x005872862000-08-10 12:02:37.87 spid51    Address=587286 Exception Code = c00000fd2000-08-10 12:02:37.87 spid51    eax=195922d0 ebx=19592338 ecx=2ad0e938 edx=000000072000-08-10 12:02:37.87 spid51    esi=196ce2c8 edi=19592180 eip=00587286 esp=2ac930002000-08-10 12:02:37.87 spid51    ebp=2ac93028 efl=000102022000-08-10 12:02:37.87 spid51    cs=1b ss=23 ds=23 es=23 fs=38 gs=02000-08-10 12:02:37.87 spid51    1: Return Address 005872862000-08-10 12:02:37.87 spid51    2: Return Address 0058728B.................
其他可行方案
重寫查詢並使用 #temp 資料表以包含 IN 清單中的值,不要使用 IN 子句。例如,上述查詢可以重寫成這樣:
CREATE TABLE #IN_values (au_id char(4))INSERT INTO #IN_values select au_id FROM Table_with_values_123456789...SELECT max(au_id)FROM authors as AJOIN #IN_values as I ON (A.au_id = I.au_id)
狀況說明
Microsoft 已確認本篇文件開頭所列產品確實有上述問題。
其他相關資訊
用戶端的連線不會中斷,但可能會出現下面錯誤訊息:
伺服器:訊息 8621,層級 17,狀態 1,行 2。內部查詢處理器錯誤:查詢處理器在查詢最佳化期間已用完堆疊空間。
参考
本文件是根據 Microsoft Knowledgebase 文件編號 Q288095 翻譯的。若要參考原始英文文件內容,請至以下網址:

內容

文章識別碼:288095 - 最後檢閱時間:12/06/2015 00:23:53 - 修訂: 2.1

Microsoft SQL Server 7.0 Standard Edition, Microsoft SQL Server 2000 Desktop Engine (Windows), Microsoft SQL Server 2000 Enterprise Edition, Microsoft SQL Server 2000 Personal Edition, Microsoft SQL Server 2000 Developer Edition, Microsoft SQL Server 2000 Standard Edition

  • kbnosurvey kbarchive kbbug kbpending kbsqlserv2000bug kbsqlserv700bug KB288095
意見反應