第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何查找 Oracle 中 SQL 查詢中返回的記錄的內(nèi)存大???

如何查找 Oracle 中 SQL 查詢中返回的記錄的內(nèi)存大?。?/h1>
千萬里不及你 2023-12-30 15:35:36
我正在執(zhí)行一個(gè)返回 10,000 條記錄的查詢。SELECT * FROM employee WHERE id < 11000;返回的數(shù)據(jù)由 85 列組成(varchar、日期、編號(hào))。(我還有另一個(gè)類似的查詢獲取僅由 10 列(varchar)組成的數(shù)據(jù)。)Oracle中有什么辦法可以找到這個(gè)結(jié)果集的數(shù)據(jù)大小嗎?就像加載的數(shù)據(jù)將是 100 MB 或 200 MB需求:實(shí)際上我需要加載內(nèi)存中的所有記錄;對(duì)于這些記錄在Java中進(jìn)行一些處理。所以我需要使用Oracle中的一些先決條件來檢查數(shù)據(jù)的大小,或者您可以建議檢查相同的任何其他適當(dāng)?shù)姆椒▎??(我有生產(chǎn)訪問權(quán)限。所以我將在檢查數(shù)據(jù)大小后實(shí)現(xiàn)邏輯)。這個(gè)預(yù)檢查只是為了避免java中出現(xiàn)內(nèi)存不足異常。如果我復(fù)制整個(gè)數(shù)據(jù)并將其保存在文件中,則 8 列的 10,000 條記錄僅顯示 604 KB。記憶中是否也有同樣的意志?
查看完整描述

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ù)、開銷等。LongBigIntegerResultSet

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。


查看完整回答
反對(duì) 回復(fù) 2023-12-30
  • 1 回答
  • 0 關(guān)注
  • 181 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)