如何查找 Oracle 中 SQL 查詢中返回的記錄的內(nèi)存大?。?/h1>
1 回答

TA貢獻(xiàn)1811條經(jīng)驗(yàn) 獲得超5個(gè)贊
通常,您可以使用 Java 的檢測(cè)功能來確定運(yùn)行時(shí)的內(nèi)存消耗。
然而,由于各種原因,確定實(shí)際內(nèi)存消耗并不總是那么容易,其中一些原因是:
框架、庫甚至 JVM 可能會(huì)創(chuàng)建數(shù)據(jù)或緩存的副本并重用它
查詢可能返回不同大小的結(jié)果,尤其是在使用 VARCHAR 等可變長度列類型時(shí)。您必須讀取該數(shù)據(jù)才能確定相應(yīng)對(duì)象的實(shí)際大小
某些對(duì)象可能被多個(gè)其他對(duì)象引用,因此它們的大小可能會(huì)被錯(cuò)誤地包含在內(nèi)(例如,如果使用某些枚舉常量,則可能會(huì)計(jì)入對(duì)象大小,但它實(shí)際上不會(huì)增加增量,因?yàn)樗芸赡芤呀?jīng)被加載) 。
此外,在大多數(shù)業(yè)務(wù)應(yīng)用程序中,您無需費(fèi)心確定一段代碼導(dǎo)致的確切內(nèi)存消耗。原因也有多種,例如:
內(nèi)存很便宜,因此如果遇到問題,(至少暫時(shí))增加可用內(nèi)存通常比(微)優(yōu)化一段代碼更容易。
由于情況的變化(例如活躍用戶數(shù)量、數(shù)據(jù)變化等),系統(tǒng)使用和負(fù)載通常無法預(yù)測(cè)。
JVM 通常能夠有效地使用垃圾收集來回收內(nèi)存以用于其他用途。
但這并不意味著您不應(yīng)該考慮內(nèi)存使用情況,例如,您真的需要同時(shí)在內(nèi)存中存儲(chǔ)所有 10k 行嗎?您需要這些數(shù)據(jù)多長時(shí)間?您將如何處理這些數(shù)據(jù)?
話雖如此,粗略估計(jì)內(nèi)存消耗通常很有幫助,并且在可能返回大量字符串的查詢的情況下,您應(yīng)該估計(jì)最壞的情況,即假設(shè)最大長度字符串。
為此,您需要了解行將包含的內(nèi)容,例如是否是整數(shù)、Integer
實(shí)例或可能有多少列。此外,您至少需要知道數(shù)據(jù)類型的內(nèi)存要求,即我們不考慮任何緩存、重復(fù)、開銷等。Long
BigInteger
ResultSet
Java 對(duì)象的大小取決于多種因素,例如您使用的是哪個(gè) JVM,是 32 位還是 64 位 JVM 等。各種來源表明,對(duì)象的內(nèi)存消耗可以從對(duì)象標(biāo)頭(通常是大小為 12 個(gè)字節(jié))和對(duì)象字段的大小。
使用它,我們假設(shè)Integer
大小為 16 字節(jié)(12b 標(biāo)頭和 4b?int
),Date
將是 24 字節(jié)(12b 標(biāo)頭,8bfastTime
和 4bcdate
引用),字符串將是 12b 標(biāo)頭,4b char[] 引用,8b 其他字段, 12h char[] 標(biāo)頭和字符本身的 2*length 字節(jié)(或總共 36 + 2* 長度)。
因此,假設(shè)您的 85 列被分成 20 個(gè)整數(shù)、10 個(gè)日期和 55 個(gè)最大長度為 256 字節(jié)的字符串。一行至少需要20?* 16 + 10 * 24 + 55 * 548 = 30700 字節(jié)。因此,10k 行需要 307000000 字節(jié)或大約 300 MB(當(dāng)所有字符串都達(dá)到最大長度時(shí))。
如果我復(fù)制整個(gè)數(shù)據(jù)并將其保存在文件中,對(duì)于 8 列的 10,000 條記錄,它僅顯示 604 KB。
讓我們也稍微分解一下:
604 KB 為 618496 字節(jié)(1024 為 1 KB)
除以 10k,平均每行得到 61.8 字節(jié)
除以 8,每列得到 7.7 個(gè)字節(jié)(如果我們不考慮任何行或列分隔符)
讓我們將其四舍五入為每列 8 個(gè)字節(jié),并假設(shè)您的文本文件是 Latin-1 編碼的(因此每個(gè)字符 1 個(gè)字節(jié)),因此每個(gè)文本列平均有 8 個(gè)字符,這非常短
在更簡單的計(jì)算中,如果我們使用與上述相同的假設(shè),604KB 意味著您的數(shù)據(jù)將包含大約 604k 個(gè)字符,在 Java 中僅字符數(shù)據(jù)就需要 1208k 字節(jié)(或大約 1.2 MB)。再加上 80k 字符串的開銷,即 36 字節(jié) * 80k,大約多出 2.8 MB,因此數(shù)據(jù)在內(nèi)存中需要大約 4 MB。
添加回答
舉報(bào)