SQL Server出現(xiàn)System.OutOfMemoryException異常的解決方法
今天在用SQL Server 2008執(zhí)行一個SQL腳本文件時,老是出現(xiàn)引發(fā)類型為“System.OutOfMemoryException”的異常錯誤,腳本明明是從SQL Server 2008導(dǎo)出的,應(yīng)該不會出錯,研究了好久問題才得以解決。
出現(xiàn)這個錯誤的主要原因是由于SQL腳本文件太大,估計超過了100M了,解決方法就是把腳本文件分成幾個腳本文件,分別去執(zhí)行即可。
來自微軟官方的解決方案:
原因:
因為計算機沒有足夠的內(nèi)存來完成請求的操作,則會出現(xiàn)此問題。
在 SQL Server 2000 Reporting Services 的限制會導(dǎo)致內(nèi)存綁定的處理報告的某些部分。例如,查詢結(jié)果處理和對象模型呈現(xiàn)受限于內(nèi)存。
計算機沒有足夠的內(nèi)存來完成請求的操作在一個或多個下列條件都為真:
1.一個報告是太大或太復(fù)雜。
2.其他正在運行的進程的費用是非常高的。
3.計算機的物理內(nèi)存是太小。
處理報表,則分兩個階段。兩個階段是執(zhí)行和呈現(xiàn)。在執(zhí)行階段期間或在呈現(xiàn)階段,會出現(xiàn)此問題。
如果在執(zhí)行階段中,會出現(xiàn)此問題,此問題很可能是因為太多的內(nèi)存消耗在查詢結(jié)果中返回的數(shù)據(jù)。此外,下列因素會影響內(nèi)存消耗,在執(zhí)行階段:
1.分組
2.篩選
3.聚合
4.排序
5.自定義代碼
如果在呈現(xiàn)階段中會發(fā)生此問題,原因被與該報表顯示何種信息以及報表顯示信息的方式。
1.數(shù)量和類型的控件
2.這些控件之間的關(guān)系
3.格式設(shè)置
4.顯示的數(shù)據(jù)量
解決方案:
若要解決此問題,請使用下列方法之一。
方法 1
向計算機中添加足夠的物理內(nèi)存。
注意如果您超過 2 千兆字節(jié) (GB) 的內(nèi)存可以啟用該 / 3gb 切換在 Boot.ini 文件中為更好的性能。 有關(guān)如何在 SQL Server 中使用了 / 3gb 開關(guān)的詳細信息單擊下面的文章編號,以查看 Microsoft 知識庫中相應(yīng)的文章:
274750如何配置 SQL Server 使用 2 GB 以上物理內(nèi)存
方法 2
將報告計劃安排為在內(nèi)存限制時較低的非高峰時段運行。
方法 3
調(diào)整所在進行相應(yīng)設(shè)置。
注意:呈現(xiàn)時通過報告服務(wù) Web 服務(wù)的報告,該報告服務(wù) Web 服務(wù)從 Machine.config 文件中獲得所在。但是,計劃的報告呈現(xiàn)由報表服務(wù)器的 Windows 服務(wù)。報表服務(wù)器的 Windows 服務(wù)獲取從 RSReportServer.config 文件的所在。
有關(guān)所在的詳細信息,請參閱"更多信息"一節(jié)。
方法 4
升級到 64 位版本的 Microsoft SQL Server 2005年報告服務(wù)。
方法 5
重新設(shè)計該報表。若要執(zhí)行此操作,請使用下列方法之一。
方法 A
重新設(shè)計報表查詢。通過重新設(shè)計報表查詢,通過以下方法,可以減少內(nèi)存消耗:
1.報告查詢中返回更少的數(shù)據(jù)。
2.在報告查詢的 WHERE 子句中使用的一個更好的限制。
3.移動到數(shù)據(jù)源的復(fù)雜的聚合。
方法 B
將報表導(dǎo)出為其他格式。通過使用不同的格式來顯示報表,您可以減少內(nèi)存占用。下表列出了幾個按順序從大多數(shù)內(nèi)存消耗到最低的內(nèi)存消耗的導(dǎo)出格式。
Microsoft Excel 呈現(xiàn)在 Excel 中的報表
(TIFF) 圖像 將報表呈現(xiàn)為靜態(tài)圖像的面向頁的格式
PDF 呈現(xiàn)報表采用可移植文檔格式 (PDF)
HTML 呈現(xiàn)到瀏覽器在 HTML 報表
CSV 呈現(xiàn)報表以逗號分隔的格式 ;在與 CSV 文件格式關(guān)聯(lián)的查看工具中打開報表
XML 呈現(xiàn)報表的 XML ;在瀏覽器中打開報表
注意:如果沒有應(yīng)用 XSLT 轉(zhuǎn)換,這種格式將消耗比 CSV 格式所消耗的內(nèi)存更少。
方法 C
簡化報表設(shè)計??梢酝ㄟ^以下方式簡化報表設(shè)計減少內(nèi)存消耗:
1.在報告中包含更少的數(shù)據(jù)區(qū)域或控件。
2.鉆取報表用于顯示詳細信息。
此外,如果報告的目的是只是數(shù)據(jù)的集合,可用于其他 Microsoft 產(chǎn)品更好的性能。例如,您可以使用數(shù)據(jù)轉(zhuǎn)換服務(wù) (DTS) 或 Microsoft SQL Server 2005年集成服務(wù)。
示例
下面的示例演示了如何解決此問題。請考慮下面的示例:
1.以 PDF 格式,并以 Excel 格式,無法呈現(xiàn)在報表管理器返回 160 頁的報告。當(dāng)使用 8.5 × 11 英寸頁面尺寸時,報表可能遠遠超過 250 頁。
2.報表的數(shù)據(jù)源返回報表服務(wù)器 500 兆字節(jié) (MB) 的數(shù)據(jù)。通常情況下,SQL Server 2000年報表服務(wù)要求數(shù)據(jù)集所使用的內(nèi)存量的兩到三倍。因此,SQL Server 2000年報告服務(wù)需要幾乎 1.5 GB 的內(nèi)存來呈現(xiàn)該報表。
若要解決此問題,在此示例中,重新設(shè)計報表,以顯示該報表僅為有限的一組篩選器值的匯總數(shù)據(jù)。此外,請確保聚合發(fā)生在報告數(shù)據(jù)中提取數(shù)據(jù)庫查詢和聚合中的報告本身不是。這些方法有助于大大減少到報表服務(wù)器返回的數(shù)據(jù)量。因此,成功地并更快地呈現(xiàn)報表。
相關(guān)文章
SQL SERVER數(shù)據(jù)庫開發(fā)之存儲過程應(yīng)用
SQL SERVER數(shù)據(jù)庫開發(fā)之存儲過程應(yīng)用...2006-09-09case?when?then?else?end語句的用法(附demo)
本文主要介紹了case?when?then?else?end語句的用法,主要介紹了兩種格式,簡單case函數(shù)和case搜索函數(shù),具有一定的參考價值,感興趣的可以了解一下2023-10-10親自教你使用?ChatGPT?編寫?SQL?JOIN?查詢示例
這篇文章主要介紹了使用ChatGPT編寫SQL?JOIN查詢,作為一種語言模型,ChatGPT 可以就如何構(gòu)建復(fù)雜的 SQL 查詢和 JOIN 提供指導(dǎo)和建議,但它不能直接訪問 SQL 數(shù)據(jù)庫,它可以幫助您了解語法、最佳實踐和有關(guān)如何構(gòu)建查詢以高效執(zhí)行的一般指導(dǎo),需要的朋友可以參考下2023-02-02一次SQL調(diào)優(yōu)數(shù)據(jù)庫性能問題后的過程(300W)
對單表超過300w+數(shù)據(jù)的Web應(yīng)用程序進行測試后發(fā)現(xiàn)了一些功能、性能問題,采取了以下辦法來進行調(diào)整2010-03-03SQL參數(shù)化查詢的另一個理由 命中執(zhí)行計劃
為了提高數(shù)據(jù)庫運行的效率,我們需要盡可能的命中執(zhí)行計劃,這樣就可以節(jié)省運行時間2012-08-08SQL語句練習(xí)實例之一——找出最近的兩次晉升日期與工資額
程序員們在編寫一個雇員報表,他們需要得到每個雇員當(dāng)前及歷史工資狀態(tài)的信息,以便生成報表。報表需要顯示每個人的晉升日期和工資數(shù)目。2011-10-10