疑難排解資源管理員
本主題將針對使用資源管理員時可能會發生的狀況,提供疑難排解指引。這項指引會組織成下列類別:
錯誤
非預期的結果
效能相關的問題和錯誤
資源管理員錯誤
資源管理員的錯誤訊息涵蓋了所有與設定和使用資源管理員相關的動作。
下表將提供資源管理員錯誤訊息的範例,並且提供有關如何解決錯誤訊息中所描述之問題的指引。
錯誤號碼 |
錯誤訊息 |
解決方案 |
---|---|---|
8645 |
等候記憶體資源來執行資源集區 'myTestPool' (257) 中的查詢時發生逾時。請重新執行查詢。 |
將逾時值設定為更高的值,或減少伺服器的查詢負載。 |
8651 |
無法執行作業,因為無法在資源集區 'myTestPool' (257) 中取得要求的記憶體授權。請重新執行查詢、降低查詢負載或檢查資源管理員的組態設定。 |
請稍後再重新執行查詢。減少伺服器的查詢負載。要求管理員檢查資源管理員的組態設定。 |
8657 |
無法取得 1024 KB 的記憶體授權,因為它超過工作負載群組 'myTestGroup' (267) 和資源集區 'myTestPool' (257) 中的最大組態限制。請連絡伺服器管理員,以提高記憶體使用限制。 |
請重寫查詢,以便減少耗用記憶體的作業,例如排序和雜湊聯結。要求伺服器管理員允許更高的記憶體使用限制。 管理員可以調整下列其中一個或兩個參數:
管理員可以從 sys.dm_exec_query_resource_semaphores 的 max_target_memory_kb 資料行中取得實際的實體限制。 每個查詢的限制可由 max_target_memory_kb * request_max_memory_grant_percent 計算出。
附註
管理員必須確定錯誤訊息中所述的必要記憶體少於上面計算之每個查詢的限制。不過,您應該注意,增加 request_max_memory_grant_percent 具有減少大型查詢並行的副作用。例如,使用者可能預期會使用預設 25% 設定來執行三個大型查詢,但是只會使用 40% 設定來執行兩個大型查詢。
|
10900 |
啟動時,無法設定資源管理員。請參閱 SQL Server 錯誤記錄以取得明確的錯誤訊息,或執行 DBCC CHECKCATALOG('master') 檢查 master 資料庫的一致性。 |
請嘗試執行 "DBCC CHECKCATALOG('master')"。 |
10901 |
使用者沒有改變資源管理員組態的權限。 |
請授與允許修改資源管理員組態的權限,然後再試一次。 |
10902 |
使用者定義函數 'dbo.rgclassifier_v1' 不存在 master 資料庫中,或使用者沒有存取權限。 |
請在 master 中建立分類使用者定義函數 (UDF),或授與現有分類 UDF 的必要權限。 |
10903 |
分類使用者定義函數的指定結構描述名稱 'dbo' 可能不存在,或使用者沒有使用權限。 |
請嘗試另一個結構描述名稱,或取得此結構描述的正確權限。 |
10904 |
資源管理員組態失敗。在即將卸除或移到其他資源集區的工作負載群組中有使用中工作階段。請中斷受影響工作負載群組中的所有使用中工作階段,然後再試一次。 |
請中斷受影響群組中的所有使用中工作階段,然後再試一次。
附註
當群組中存在開啟的工作階段時,這個資源管理員版本不允許在集區之間移動群組。
|
10905 |
無法完成資源管理員組態,因為記憶體不足。請減少伺服器負載,或嘗試在專用管理員連接上進行作業。 |
請減少伺服器的負載,或嘗試在專用管理員連接上進行設定作業。 |
10906 |
物件 'dbo'.'rgclassifier_v1' 不是有效的資源管理員分類使用者定義函數。有效的分類使用者定義函數必須是結構描述繫結、會傳回 sysname,而且沒有參數。 |
請提供有效的分類 UDF。有效的分類 UDF 必須:
|
10907 |
值為 50 的屬性 'MIN_CPU_PERCENT' 大於值為 40 的屬性 'MAX_CPU_PERCENT'。 |
請提供小於或等於最大值的最小值。 |
10908 |
值為 40 的屬性 'MAX_MEMORY_PERCENT' 小於值為 60 的屬性 'MIN_MEMORY_PERCENT'。 |
請提供大於或等於最小屬性值的最大值。 |
10909 |
無法建立資源集區。資源集區數上限不能超過目前的限制 20,其中包括預先定義的資源集區。 |
請卸除不需要的資源集區。 |
10910 |
無法完成作業。指定的 'MIN_CPU_PERCENT' 值 25 導致所有資源集區的最小值總和超過 100%。請降低值,或修改其他資源集區使總和小於 100。 |
請降低 MIN_CPU_PERCENT 的值。 |
10911 |
無法執行要求的作業,因為資源集區 'myTestPool2' 不存在。 |
請查詢 sys.resource_governor_resource_pools 目錄檢視,以便查看目前定義了哪些資源集區。選擇現有的集區或建立新的集區。 |
10912 |
無法完成作業。不允許卸除預先定義的工作負載群組。 |
請選擇要卸除之使用者建立的工作負載群組。 |
10913 |
不允許使用者刪除在 'internal' 資源集區中的工作負載群組 'internal'。 |
請在使用者建立的集區或預設的集區中建立工作負載群組。 |
10914 |
工作負載群組 '#mygroup' 名稱的開頭不可以是 # 或 ##。 |
建立群組或集區時,請勿使用 # 或 ##。 |
10915 |
無法完成作業。不允許改變 'internal' 工作負載群組。 |
請選擇要改變之使用者建立的集區或群組。 注意:您可以變更預設群組或資源集區的組態。 |
10916 |
無法卸除資源集區 'myTestPool',因為它包含工作負載群組 'myTestGroup'。請卸除或移除使用這個資源集區的所有工作負載群組後,再卸除這個資源集區。 |
請卸除或移出使用這個集區的所有工作負載群組,然後再卸除這個集區。 |
10917 |
ALTER WORKLOAD GROUP 失敗。必須指定 'WITH' 或 'USING' 子句。 |
請在 ALTER WORKLOAD GROUP 陳述式中使用 'WITH' 或 'USING' 子句。 |
10918 |
無法建立資源集區 'myTestPool',因為它已經存在。 |
請選擇不同的資源集區名稱。 |
10919 |
從 master 資料庫讀取資源管理員組態時發生錯誤。請檢查 master 資料庫的完整性,或連絡系統管理員。 |
請嘗試執行 "DBCC CHECKCATALOG('master')"。 |
10920 |
無法卸除使用者定義函數 'dbo.myclassifer'。它正做為資源管理員分類之用。 |
無。 |
10921 |
無法將 'default' 工作負載群組移出 'default' 資源集區。 |
不適用。 |
10981 |
資源管理員重新組態成功。 |
這則訊息會寫入 SQL Server 事件記錄檔。 |
10982 |
無法執行資源管理員分類使用者定義函數。如需詳細資訊,請參閱 SQL Server 錯誤記錄中工作階段識別碼 58 之前的錯誤。分類函數經過時間: 800 毫秒。 |
這則訊息會寫入 SQL Server 錯誤記錄檔。 注意:SQL Server 錯誤記錄檔中具有相同伺服器處理序識別碼 (SPID) 的先前訊息可能會提供特定的失敗原因。長時間執行的分類可能會導致使用者登入逾時。請查看分類經過時間是否超過用戶端登入逾時。 |
10983 |
使用者已取消資源管理員重新組態作業。 |
不適用。 |
10984 |
資源管理員重新組態失敗。 |
不適用。 |
非預期的結果
非預期的結果將描述各種資源管理員元素正常運作,但是結果並非您所預期的情況。例如,工作階段分類似乎沒有正確運作,或者存在與卸除或建立工作負載群組相關聯的問題。
工作階段分類
當下列條件存在時,工作階段將會移至預設的工作負載群組:
分類 UDF 不存在或未啟用。
分類 UDF 將它們放在此處,表示函數邏輯具有錯誤。
基本的疑難排解
如果沒有任何分類 UDF 可用於分類,則所有工作階段將會自動移至預設的工作負載群組。建立分類 UDF 之後,您必須確認它已向資源管理員註冊,而且記憶體中組態已更新。
建立、註冊和啟用分類 UDF 是三個步驟的程序:
第一步,您必須建立函數。
CREATE FUNCTION function_name() RETURNS <something> WITH SCHEMABINDING
第二步,您必須向資源管理員註冊此函數。
ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION=schema_name.function_name)
第三步,您必須更新資源管理員的記憶體中組態。
ALTER RESOURCE GOVERNOR RECONFIGURE
疑難排解分類時,您應該進行的第一件事就是確認您所建立的函數已向資源管理員註冊,而且組態已更新。您可以針對資源管理員目前使用的分類 UDF,使用下列查詢來取得結構描述名稱 (schema_name) 和分類函數名稱 (function_name)。
USE master
SELECT
object_schema_name(classifier_function_id) AS [schema_name],
object_name(classifier_function_id) AS [function_name]
FROM sys.dm_resource_governor_configuration
當您變更了分類 UDF,但是資源管理員仍然使用先前的函數邏輯來分類工作階段時,您就可以使用上述方法來進行疑難排解。這種行為表示您所做的變更沒有套用至記憶體中組態。
進階的疑難排解
您可能會建立不產生預期結果或需要大量資源而且非常複雜的分類函數。如果您已完成基本的疑難排解,就必須確認函數邏輯正確無誤。編碼錯誤產生無限迴圈或失控查詢是最嚴重的案例狀況。
此時,您可以使用專用管理員連接 (DAC) 來疑難排解撰寫不夠周全的分類函數,因為 DAC 不受分類限制而且可以在資源管理員執行和分類內送工作階段時使用。如需詳細資訊,請參閱<使用專用管理員連接>。
[!附註]
如果 DAC 無法用於疑難排解,您可以在單一使用者模式中重新啟動系統。雖然單一使用者模式不受分類限制,但是您無法在資源管理員分類執行時進行診斷。
您可以透過查詢下列項目,取得分類函數的相關資訊:
sys.dm_exec_query_stats (包含陳述式資訊,但不包含實際函數)
sys.dm_exec_sql_text (與從 sys.dm_exec_query_stats 中取得的 sql_handle 搭配使用)
PreConnect:Starting 事件類別 (提供分類函數的識別碼和名稱)
重新設定失敗
資源管理員會將中繼資料變更與執行中工作階段分開,直到 ALTER RESOURCE GOVERNOR RECONFIGURE 陳述式完成為止。如果您嘗試卸除包含使用中或已開啟之工作階段的群組,或者您嘗試卸除包含工作負載群組的資源集區,ALTER RESOURCE GOVERNOR RECONFIGURE 將會失敗。
若要取得記憶體中和儲存的組態,請分別查詢 sys.dm_resource_governor_configuration 和 sys.resource_governor_configuration。is_reconfiguration_pending (sys.dm_resource_governor_configuration) 的值為 1 表示工作階段組態尚未更新。如果發生這種情況,您的選項如下所示:
等候工作階段完成或卸除其連接。
明確停止使用中工作階段或卸除工作階段連接。
重新建立您已卸除的群組或集區、調整其設定,然後重新執行 ALTER RESOURCE GOVERNOR RECONFIGURE。
效能相關的問題和錯誤
如果在您使用資源管理員時似乎發生效能問題,您就必須判斷此問題是否由資源管理員組態所造成。本節所提供的疑難排解指引會分成兩個類別:
工作階段分類
查詢執行
工作階段分類
長時間執行的登入觸發程序或分類使用者定義函數 (UDF) 可能會對伺服器效能造成影響。如果登入觸發程序或分類 UDF 需要長時間才能完成,則連接將會逾時,但是觸發程序或函數會繼續執行並使用伺服器資源。
如果您懷疑有工作階段以預先連接的狀態執行,請使用專用管理員連接來登入,然後檢查<PreConnect:Starting 事件類別>,以便了解是否有多個已啟動但未完成的要求或工作階段。
若要解決這個問題並防止它再次發生:
停止工作階段
識別長時間執行函數或登入觸發程序的可能原因
移除並取代導致此問題的觸發程序或函數
查詢執行
在查詢經過分類之後,執行此查詢時似乎停止回應 (當機) 或失敗,而且您懷疑目前的資源管理員設定可能是原因。您必須調查資源管理員組態的下列層面:
要求計數節流
最大 CPU 限制
CPU 頻寬節流
記憶體授權大小
記憶體授權逾時錯誤
記憶體不足錯誤
次佳查詢計畫
要求計數節流
在此狀況中,使用者報告效能降低,而且您懷疑要求計數已節流。
您必須進行的第一件事就是確認使用者目前所在的群組是否明確設定了要求計數節流。您可以檢查使用者的群組成員資格來查看 GROUP_MAX_REQUESTS 設定是否已啟用,藉以達成此目的。如果 GROUP_MAX_REQUESTS 未啟用,就表示沒有明確的要求計數節流,而且您應該採取下列步驟來進一步調查。
查詢 sys.dm_os_waiting_tasks,以便了解是否有任何要求正在等候 RESMGR_THROTTLED 等候類型。這種等候類型的存在就表示要求計數節流。
啟動效能監視器,然後使用 Queued requests 和 Active requests 計數器來收集資料。非零的 Queued request 計數表示要求節流。
查看 Active requests 值是否符合 GROUP_MAX_REQUESTS 設定。如果 Active requests 值高於 GROUP_MAX_REQUESTS 設定,表示此群組可能具有無法節流的要求 (例如,開啟的交易)。
如果 Queued requests 為零,請檢查共用相同資源集區之所有工作負載群組的 Active requests,因為此集區可能已經因要求過多而超過負載。
最大 CPU 限制
如果您設有由資源管理員事件產生所驅動的原則,就可以使用達到最大 CPU 限制時所產生的事件。
在此狀況中,您想要判斷針對偵測使用過多 CPU 之查詢所設定的最大 CPU 限制 (REQUEST_MAX_CPU_TIME_SEC) 是否過低。
下列動作將協助您驗證 CPU 限制設定。
- 啟動 SQL 追蹤工作階段,然後收集 CPU Threshold Exceeded 事件。當使用者要求達到最大 CPU 使用量限制時,伺服器就會自動產生 SQL 追蹤事件。如果您的設定過低,就會產生大量事件。
[!附註]
這個事件也會公開成伺服器事件通知,以便您可以撰寫回應此事件的指令碼。
- 啟動效能監視器,然後使用 Max request cpu time (ms) 計數器來收集資料。您可以使用這個計數器的值當做指南,以便針對工作負載群組設定適當的限制。
CPU 頻寬節流
在此狀況中,您懷疑 CPU 頻寬已節流,因為 CPU usage % 效能計數器等於或接近資源管理員的 MAX_CPU_PERCENT 設定。下列查詢會針對 SQL Server 執行個體的所有工作負載群組和資源集區傳回 CPU usage % 值。
select * from sys.dm_os_performance_counters where counter_name = 'cpu usage %'
如需詳細資訊,請參閱<sys.dm_os_performance_counters (Transact-SQL)>。
您可以透過在系統上執行下列檢查,判斷 CPU 頻寬是否已節流。
檢查整體伺服器 CPU 使用情形。如果 SQL Server 以外的負載目前正在使用中,它可能會影響您正在疑難排解的查詢。
檢查資源集區之間 CPU 使用量的分配。某個資源集區可能已節流,因為另一個集區針對 CPU 使用量所設定的最小值比較高。請比較預期 (已計算的 CPU 使用情形) 與實際 CPU 使用情形的計數器。
檢查指派給有問題之資源集區的工作負載群組。其他工作負載群組的負載可能會影響共用相同集區的使用者。
檢查排程器之間 CPU 使用量的分配。您正在調查的查詢可能會放置在包含長時間執行之查詢的排程器上。在此情況下,查詢似乎已節流,但是實際的問題是排程器之間的負載分配不平均。
檢查是否有工作負載由其他工作階段封鎖而非由資源管理員設定所節流的可能情況。
檢查目前正在系統上執行查詢的工作階段數目。當並行執行要求的數目增加時,SQL Server 將嘗試確定所有要求至少都會收到一些 CPU 時間來防止 CPU 資源用盡。
記憶體授權大小
在此狀況中,您懷疑授權記憶體的大小導致查詢執行速度很慢。
由於資源管理員會減少授權記憶體來強制執行最大查詢記憶體限制,所以大型查詢可以納入限制中。如果某個查詢取得小於 100% 的記憶體授權,您可能必須轉散暫存資料並將資料寫入磁碟,而這樣做可能會對效能造成明顯的影響。
您必須判斷大型查詢的百分比,以便設定適當的最大查詢大小限制。下列動作將協助您判斷最佳的設定:
查詢 sys.dm_exec_query_memory_grants,以便查看記憶體授權的目前狀態。ideal_memory_kb 資料行會根據基數估計值顯示理想的數量。requested_memory_kb 資料行會顯示要求的數量,而這個數量在達到最大查詢限制之後可能已經減少。如果 requested_memory_kb 遠低於 ideal_memory_kb,則查詢最後可能會經常轉散 (假設基數估計值是正確的)。
啟動效能監視器,然後使用 Reduced memory grants/sec 計數器來收集資料。這個計數器的值代表在達到最大要求大小限制之後,收到的記憶體授權計數小於理想數量的比率。大型查詢的執行速度可能會比理想數量的執行速度更慢,因為它們必須轉散至磁碟,以便維持在記憶體限制內。
若要減少記憶體授權問題,您可能必須增加集區大小限制及/或最大記憶體大小限制。
[!附註]
如果您只增加最大記憶體大小,這可能會導致大型查詢的並行減少。
記憶體授權逾時錯誤
在此狀況中,查詢會因記憶體授權逾時錯誤而失敗。
針對工作負載群組和資源集區定義所指定的使用中記憶體授權要求和記憶體限制總數可能會在記憶體授權逾時中扮演某個角色。如果有多個資源群組共用單一資源集區,其他群組中的並行查詢數目可能也會影響記憶體授權逾時。
下列動作將協助您判斷最佳的資源集區設定:
查詢 sys.dm_exec_query_memory_grants,以便查看這個群組與集區的記憶體授權和等候中查詢的數目。
查詢 sys.dm_exec_query_resource_semaphores,以便查看授與的總記憶體和目標。
如果授權記憶體使用量大於可用的記憶體空間,您就可以考慮增加資源集區大小限制。
記憶體不足錯誤
查詢因記憶體不足錯誤而失敗。
基本的疑難排解
下列動作將協助您判斷最佳的工作負載群組設定:
查詢 sys.dm_os_memory_brokers,以便檢查資源集區內部的相對記憶體分配和趨勢。如果有過多要求存在過小的記憶體空間中,就可能導致工作負載群組/資源集區超過負載,而且會導致記憶體不足的錯誤。
啟動效能監視器,然後使用記憶體相關的資源集區計數器來收集資料,以便取得記憶體授權、快取記憶體和編譯/最佳化工具記憶體的目標與目前記憶體使用量。如果目前值大於目標值,就表示資源集區超過負載。請考慮變更集區記憶體限制。
啟動效能監視器,然後使用 request max memory grant 計數器來收集資料。如果計數器的值超過工作負載群組中 REQUEST_MAX_MEMORY_GRANT_PERCENT 設定所判斷的值,就表示查詢可能會失敗。請考慮變更工作負載群組限制。
進階的疑難排解
記憶體不足 (701) 錯誤是當工作嘗試從記憶體管理員中配置記憶體區塊,但嘗試失敗時,系統所傳回的一般錯誤。如需詳細資訊,請參閱<MSSQLSERVER_701>。
下列狀況可能會導致這項錯誤發生:
- 記憶體集區達到其總限制。
[!附註]
資源管理員可能不是這個狀況的唯一原因。伺服器上可能有其他執行中應用程式的記憶體需求導致了這個狀況。
多重頁面或虛擬位址空間配置失敗,因為虛擬位址空間沒有夠大的可用區塊可進行所需的保留作業。這個狀況最有可能在 32 位元的架構上發生,而不太可能在 64 位元的架構上發生。
多重頁面或虛擬位址空間配置失敗,因為總認可達到認可限制。這個狀況同時適用於 32 位元和 64 位元的架構。
當您看見記憶體不足的錯誤時,錯誤記錄檔就是調查此錯誤的最佳起點。此記錄檔包含類似下列範例的輸出:
2006-01-28 04:27:15.43 spid51 Failed allocate pages: FAIL_PAGE_ALLOCATION 1
記錄在錯誤記錄檔中的可能失敗包括:
FAIL_PAGE_ALLOCATION,後面接著嘗試配置的頁面數目
FAIL_VIRTUAL_RESERVE,後面接著嘗試保留的位元組數目
FAIL_VIRTUAL_COMMIT,後面接著嘗試認可的位元組數目
您必須了解,觸發記憶體不足錯誤的工作通常不是造成此錯誤的工作。除非存在失控的工作,否則記憶體不足的狀況通常是多個執行中工作的累積。因此,使用 FAIL_PAGE_ALLOCATION 錯誤這個非常常見的情況時,您的調查必須全盤檢視系統活動。
錯誤記錄檔中下一個重要的資訊片段是記憶體狀態輸出。根據這項失敗,您應該尋找單一頁面、多重頁面、虛擬保留或認可的數目,以找出個別記憶體 Clerk。識別最大的記憶體取用者是繼續調查此錯誤的關鍵步驟。一般而言,最大的記憶體取用者屬於下列類型:
MEMORYCLERK_* 表示伺服器組態或工作負載需要特定的記憶體配置。SQL Server 元件具有對應的記憶體 Clerk,而且個別元件可能會有許多記憶體 Clerk。如需詳細資訊,請參閱<sys.dm_os_memory_clerks (Transact-SQL)>。雖然您有時候可以從記憶體 Clerk 中識別造成此問題的工作負載,但是比較可能的方法是檢查與 Clerk 相關聯的記憶體物件,以便了解造成大量記憶體耗用的原因。
CACHESTORE_*、USERSTORE_* 和 OBJECTSTORE_* 都是快取類型。快取的高記憶體耗用量可能表示:
記憶體配置在快取外部,但是尚未插入成為可收回的項目。這非常類似於上述 MEMORYCLERK 的情況。
所有快取項目都在使用中,因此無法收回。您可以透過查看 sys.dm_os_memory_cache_counters 並比較 entries_count 資料行與 entries_in_use_count 資料行的值,確認這點。
MEMORYCLERK_SQLQERESERVATIONS 會顯示查詢執行 (QE) 為了執行查詢搭配排序/聯結所保留的記憶體數量。當保留數量很高時所發生的記憶體不足錯誤通常表示伺服器發生錯誤。
錯誤記錄檔中的記憶體狀態輸出也會顯示哪個記憶體集區已用完。每個集區的記憶體 Broker 都會顯示奪取 (編譯)、快取和保留 (授與) 記憶體之間的記憶體分配。這三個 Broker 的數字會對應至上述與記憶體 Clerk 相關聯的記憶體物件。您可以透過使用自訂指令碼來擷取完整傾印的資訊,從給定的 Clerk 或記憶體物件中了解配置給集區的記憶體數量,而且 sys.dm_os_memory_cache_entries 動態管理檢視會顯示與每個項目相關聯的 pool_id。
如果您需要連絡客戶支援服務,請收集下列資訊供支援人員參考:
錯誤記錄檔,其中顯示記憶體不足的錯誤以及發生錯誤時的記憶體狀態輸出。
下列陳述式的輸出:
dbcc memorystatus dbcc sqlperf(spinlockstats) select * from sys.dm_os_memory_clerks select * from sys.dm_os_wait_stats order by wait_type select * from sys.dm_os_waiting_tasks select * from sys.dm_os_ring_buffers where ring_buffer_type='RING_BUFFER_OOM' select * from sys.dm_os_ring_buffers where ring_buffer_type='RING_BUFFER_RESOURCE_MONITOR' select * from sys.dm_os_ring_buffers where ring_buffer_type='RING_BUFFER_MEMORY_BROKER' select * from sys.dm_os_memory_cache_clock_hands
(選擇性) 使用 T8004 所收集的記憶體不足傾印。這個小型傾印將會提供一些重要資訊,例如環緩衝區和單一執行緒存取鎖/等候狀態。您可以關閉並開啟 T8004,藉以重設 T8004 的傾印計數器,而不需要重新啟動伺服器。
次佳查詢計畫
在此狀況中,您懷疑查詢執行速度很慢的原因是次佳查詢計畫。如果查詢最佳化工具由於資源集區的記憶體限制設定很低而無法取得足夠的記憶體,它可能就會產生次佳查詢計畫。
下列動作將協助您判斷最佳的資源集區設定:
取得 Query optimizations/sec 計數器的資料,以便查看工作負載群組是否具有大量查詢編譯。
取得 Suboptimal plans/sec 計數器的資料,以便查看查詢最佳化工具是否經常產生次佳計畫。
如果上述其中一個狀況存在,請考慮增加資源集區的記憶體限制。