您目前已離線,請等候您的網際網路重新連線

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 - 最後檢閱時間:01/29/2004 16:17:54 - 修訂: 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
  • kbbug kbpending kbsqlserv2000bug kbsqlserv700bug KB288095
意見反應