欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Oracle 數據庫中的 JSON性能注意事項(最佳實踐)

 更新時間:2025年04月24日 10:52:46   作者:dingdingfish  
本文檔概述了在 Oracle 數據庫中存儲和處理的 JavaScript 對象表示法 (JSON) 的性能調優(yōu)最佳實踐,感興趣的朋友一起看看吧

本文為白皮書“JSON in Oracle Database: Performance Considerations”的翻譯及閱讀筆記。

目的

本文檔概述了在 Oracle 數據庫中存儲和處理的 JavaScript 對象表示法 (JSON) 的性能調優(yōu)最佳實踐。應用這些最佳實踐將使開發(fā)人員、數據庫管理員和架構師能夠主動避免性能問題,并確保他們設計的應用程序和系統(tǒng)以最佳性能運行。
本文檔中的超鏈接提供文檔、更多信息、示例和免費實踐培訓的訪問。

Oracle 數據庫中 JSON 的簡介

2014 年,Oracle 發(fā)布了 Oracle 12.1.0.2,在所有 Oracle 數據庫版本中增加了原生 JSON 支持這點表示懷疑,應該是OSON發(fā)布后才算吧)。在此版本之前,JSON 通常存儲在 NoSQL 數據庫中,而 NoSQL 數據庫缺乏功能和數據一致性模型,這迫使開發(fā)人員添加額外的代碼來確保數據完整性。

為了彌補 NoSQL 的不足,開發(fā)人員開始使用關系數據庫或其他數據存儲技術,例如運行分析查詢。2014 年原生 JSON 支持功能的加入,消除了對這些額外專用數據存儲技術的需求,從而通過減少集成工作、簡化部署、降低風險和成本,顯著加快了開發(fā)速度。(融合數據庫的好處)此外,使用標準化 SQL 運算符存儲、處理和分析 JSON 顯著縮短了上手時間,降低了所需的技能,并使非開發(fā)人員也能夠輕松處理 JSON 數據。

Oracle 數據庫提供原生 JSON 支持。JSON 可與所有 Oracle 數據庫功能兼容,包括選件、Oracle 管理包、框架、架構和安全性。存儲在 Oracle 數據庫中的 JSON 還能受益于 Oracle 數據庫的性能、可擴展性、可用性、可擴展性、可移植性和安全性。(利用Oracle的強大能力也是融合數據庫的好處)訪問存儲在 Oracle 數據庫中的 JSON 與訪問其他數據庫訪問方法(包括 OCI、.NET 和 JDBC)相同。

有關 Oracle 數據庫中 JSON 的更多信息,請參閱 JSON 開發(fā)人員指南。

性能特性和技術 – 深入探討

以下部分更詳細地描述了工作負載部分中討論的功能:

在 Oracle 數據庫中存儲 JSON 數據以獲得最佳性能

JSON 可以使用數據類型為 VARCHAR2、CLOB、BLOB 或 JSON 的列來存儲。無論使用哪種類型,您都可以像操作其他類型的數據一樣操作 JSON 數據。

  • 對于 Oracle 21c,建議使用針對查詢和高效(部分)更新進行優(yōu)化的原生 JSON 類型??梢栽?JSON 列上定義 IS JSON 檢查約束,以強制執(zhí)行正確的 JSON 語法,如果應用程序能夠保證 JSON 的正確性,則可以禁用(而不是刪除)該約束。
  • 對于 Oracle 19c,建議使用原生 BLOB 數據類型,該類型也針對查詢和高效更新進行了優(yōu)化。
  • CLOB 也受支持,但應避免使用,因為由于 UCS2 編碼,CLOBS 通常需要兩倍的存儲空間(和磁盤讀?。?/li>
  • VARCHAR2 字段也受支持,如果已知 JSON 文檔的最大大小,或者 JSON 文檔已存儲在 VARCHAR2 字段中,又或者您更喜歡 VARCHAR2 的簡便性,則可以考慮使用 VARCHAR2 字段。VARCHAR2 值最多可容納 32K個(原文是32,不對)字節(jié)。

工作負載類型和數據訪問模式

數據庫工作負載可分為操作型工作負載和分析型工作負載。操作型工作負載也稱為聯(lián)機事務處理系統(tǒng) (OLTP),它們以事務為導向,擁有眾多用戶,并且旨在實現(xiàn)即時響應;例如,銀行的自動柜員機 (ATM)。OLTP 系統(tǒng)支持所有數據操作類型。典型的操作涉及使用最少行數插入或更新數據的事務。OLTP 系統(tǒng)的性能目標是事務速度、吞吐量和數據庫并發(fā)性。相比之下,分析型工作負載(例如聯(lián)機分析處理 (OLAP)、數據倉庫和數據湖)專為數據分析而構建,用戶較少,并且旨在處理大量數據。典型的操作包括使用復雜的資源密集型查詢處理數千或數百萬行數據,這些查詢會連接和聚合多個表之間的數據。OLAP 系統(tǒng)針對查詢進行了優(yōu)化。

按鍵檢索 JSON 文檔 (OLTP)

您的工作負載會根據關系列(鍵)選擇單個 JSON 文檔,并將 JSON 數據存儲在第二個(負載)列(可以認為是key/value中的value)中。鍵列上的主鍵約束強制鍵值唯一,并為其創(chuàng)建索引以便快速查找。如果鍵不是隨機的(例如,使用序列或標識列),則索引可能會成為高事務性系統(tǒng)中的熱點,因為并發(fā)/后續(xù)插入會命中同一個索引塊?;阪I列對索引進行哈希分區(qū)常見的分散熱點的做法)會將插入操作均勻分布到所有分區(qū)。SODA 和 MongoDB 集合自動具有主鍵列——基于鍵的文檔查找無需進一步操作。

按字段值檢索 JSON 文檔 (OLTP)

在這里,通過 JSON 文檔中的字段值選擇一個或幾個文檔。JSON_VALUE 或 JSON_EXISTS 運算符中的路徑表達式定義了這些值。如果重復使用相同的路徑表達式,建議使用 JSON_VALUE 的基于函數的索引。對感興趣的字段值進行索引,可以將數據檢索的全表掃描替換為索引查找,從而確保最佳性能。

雖然在 JSON 文檔中索引單個字段很容易,但數組索引卻更具挑戰(zhàn)性?;诤瘮档乃饕裏o法索引數組值(函數每個 JSON 數據只能返回一個值);在 Oracle 21c 之前的版本中,可以使用物化視圖作為替代方案:物化視圖將數組擴展為具有多個行條目的關系列,然后將其作為普通列進行索引。Oracle 全面的查詢重寫框架會自動重寫針對 JSON 文檔的 SQL 語句,以便使用物化視圖進行快速數據檢索。在 Oracle 21c 中,您可以使用此版本中引入的全新多值索引功能,原生地為 JSON 數組中的值創(chuàng)建索引。

使用全文搜索檢索 JSON 文檔 (OLTP、OLAP)

某些工作負載僅知道感興趣的值,而不知道 JSON 文檔中字段的路徑表達式,例如對任意文檔的臨時查詢。Oracle 提供了 JSON 搜索索引來提升此類工作負載的性能。借助 JSON 搜索索引,SQL/JSON 運算符 JSON_TEXTCONTAINS 允許根據文本搜索條件(包括詞干提取和模糊搜索)選擇行。

提取 JSON 值用于報告或分析 (OLAP)

在報告或分析用例中,JSON 數據會映射到關系模型,以便使用 SQL 進行進一步處理。常用的 SQL 操作包括連接(與其他 JSON 或關系數據)、聚合(求和、求平均值、窗口函數)或機器學習(分類、預測)。SQL/JSON 運算符 JSON_TABLE 允許從 JSON 映射到關系模型。Oracle 數據庫會盡可能將多個 JSON 查詢運算符優(yōu)化為單個 JSON_TABLE 語句(顯示在查詢執(zhí)行計劃中)。

對于高選擇性分析(根據字段過濾條件僅選擇少量 JSON 文檔),可以使用索引優(yōu)化訪問。如果訪問的行數較多(但并非全部),且索引的選擇性不再足夠,則應考慮對數據進行分區(qū),以從查詢中剔除不相關的分區(qū)。此外,處理大數據量時,建議充分利用并行執(zhí)行。SQL/JSON 運算符 JSON_TABLE 可以并行化,且沒有任何限制。(三個優(yōu)化手段:索引,分區(qū),并行

假設您反復運行相同的 JSON 到關系型數據庫轉換,例如每日報告或儀表板查詢。在這種情況下,物化視圖通過在視圖中物化中間結果,可以完全避免在運行時重復執(zhí)行相同的 JSON_TABLE 轉換。JSON_TABLE 物化視圖支持快速刷新,因此在插入或更新后能夠高效自動地刷新。物化視圖還可以與 Oracle Database In-Memory 結合使用,以受益于內存列壓縮和快速 SIMD 掃描。這可以顯著提升性能,尤其是對于分析查詢而言。(物化視圖(主)+ In-Memory(輔)優(yōu)化

JSON 生成 (OLTP、OLAP)

Oracle 數據庫新增了 SQL/JSON 運算符,(可能指的是JSON_ARRAY和JSON_OBJECT)用于從關系數據和查詢結果生成新的 JSON 數據。典型的用例是修改某個 JSON 文檔的結構,或將分析查詢的結果作為 JSON 數據提取返回。當僅訪問少量行時,索引可以提供快速訪問。如果 JSON 生成基于多行數據,則應考慮使用物化視圖,但需要注意的是,JSON 生成的快速刷新功能僅在有限情況下才支持。

性能特性和技術 – 深入探討

以下部分將更詳細地介紹與性能相關的功能,并附上示例。通常,常規(guī)的 SQL 調優(yōu)技巧是適用的:您可以利用已有的技能。這縮短了學習曲線,并消除了 DBA 和數據庫管理員對在 Oracle 數據庫中采用 JSON 的擔憂。這些調優(yōu)技巧背后的主要理念是減少需要讀取和處理的數據量:

基于函數的索引

基于函數的索引可以基于特定鍵或鍵組合創(chuàng)建,并優(yōu)化使用 SQL/JSON 運算符對相同鍵進行的查詢操作?;诤瘮档乃饕褂?JSON_VALUE 運算符構建,并支持位圖和 B 樹索引格式。

以下示例在示例 JSON 文檔的 PONumber 鍵上創(chuàng)建了一個(唯一的)函數索引,該索引可通過路徑表達式“$.PONumber”訪問。本示例假設 JSON 數據存儲在名為“purchaseorder”的表的“data”列中。

create unique index PO_NUMBER_IDX on PURCHASEORDER po(
json_value(po.DATA, '$.PONumber' returning number
null on empty error on error));

PONumber 值將被提?。ú⒕幦胨饕閿底?。這會影響范圍查詢(按數字排序而非字母排序),并避免在運行時進行數學運算或比較的數據類型轉換。缺失值將被編入索引,作為 SQL NULL 值。

以下查詢使用了簡化的 JSON 語法。由于使用了 number() 項方法,因此將使用索引進行數據檢索,如計劃所示。

select data from PURCHASEORDER po
where po.data.PONumber.number() = 200;
-----------------------------------------------------
| Id | Operation | Name |
-----------------------------------------------------
| 0 | SELECT STATEMENT | | 
| 1 | TABLE ACCESS BY INDEX ROWID| PURCHASEORDER | 
|* 2 | INDEX UNIQUE SCAN | PO_NUMBER_IDX |
-----------------------------------------------------

多值索引

如果路徑表達式可以選擇多個值,則建議使用多值索引——這在訪問 JSON 數組中的值時很常見。以下代碼在示例 JSON 文檔的 JSON 數組“LineItems”中的字段“UPCCode”上創(chuàng)建了多值索引。這些值以字符串形式進行索引。

create multivalue index UPCCODE_INDEX on PURCHASEORDER po
( po.data.LineItems.Part.UPCCode.string());

多值索引也使用 B 樹,但由于生成的 ROWID 需要去重,因此速度比函數索引略慢。因此,如果已知路徑表達式最多返回一個值,則應優(yōu)先使用基于函數的索引。多值索引是在 Oracle 21c 中引入的(出于早期的原因,可以使用物化視圖來加速對數組的訪問)。

以下查詢使用了多值索引:

select data from PURCHASEORDER po where
po.data.LineItems.Part.UPCCode.string() = '13131092705'; 
-------------------------------------------------------------
| Id | Operation 							| Name 			| 
|  0 | SELECT STATEMENT 					| 				| 
|* 1 | TABLE ACCESS BY INDEX ROWID BATCHED	| PURCHASEORDER | 
|* 2 | INDEX RANGE SCAN (MULTI VALUE) 		| UPCCODE_INDEX |
-------------------------------------------------------------

JSON 搜索索引

Oracle 數據庫支持使用基于 Oracle 全文索引的搜索索引來索引整個 JSON 文檔。該搜索索引不僅包含所有值,還包含其字段名稱,并允許進行全文搜索。以下示例在“purchaseorder”上創(chuàng)建了一個 JSON 搜索索引。

create search index PO_FULL_IDX on PURCHASEORDER po (po.data) for json
parameters('SYNC (EVERY "FREQ=SECONDLY; INTERVAL=1") DATAGUIDE OFF');

“parameters”子句指定索引是異步的,每秒同步一次。也可以在每次事務提交時同步索引,但這會增加索引維護成本并降低并發(fā) DML 的吞吐量。JSON 搜索索引還可以通過名為 JSON Dataguide 的功能在 DML 操作期間發(fā)現(xiàn)模式更改——例如,它允許自動生成 JSON_Table 視圖。“DATAGUIDE OFF”子句禁用此模式發(fā)現(xiàn)功能,從而降低 JSON 搜索索引在 DML 操作期間的成本。

JSON 搜索索引的底層數據結構是發(fā)布列表,通常比 B 樹索引慢。如果 JSON 搜索索引與基于函數的索引或多值索引一起使用,則優(yōu)化器會盡可能優(yōu)先選擇這些索引。由于 JSON 搜索索引會索引整個 JSON 數據,因此其大小將顯著大于其他索引,通常在原始數據的 20%-30% 左右。JSON 搜索索引支持 JSON 數組中的值以及全文搜索操作。以下示例選擇所有“Description”字段同時包含單詞“Magic”和“Christmas”的文檔。除了“{and}”,還可以使用“{near}”或“{not(…)}”。有關 JSON 搜索索引功能的更多信息,請參閱文檔

select data from PURCHASEORDER po
where JSON_TEXTCONTAINS(po.data, '$.LineItems.Part.Description', 'Magic
{and} Christmas');

查詢執(zhí)行計劃將 JSON 搜索索引顯示為“域索引”:

---------------------------------------------------------
| Id  | Operation 						| Name			|
---------------------------------------------------------
| 	0 | SELECT STATEMENT 				| 				|
| 	1 | TABLE ACCESS BY INDEX ROWID		| PURCHASEORDER |
|* 	2 | DOMAIN INDEX 					| PO_FULL_IDX	|
---------------------------------------------------------

對于包含大量 DML 操作的工作負載,使用單個 JSON 搜索索引來替代大量的函數索引和多值索引可能會有所幫助,從而減少索引維護量(DML 操作后的索引同步)。更多優(yōu)化策略請參閱右側引用的博客。

物化視圖

您可以使用物化視圖來提升頻繁訪問多行的查詢(而非基于索引驅動的鍵值查找)的性能。物化視圖會持久保存查詢結果。部分或完全匹配物化視圖查詢的后續(xù)查詢無需重新運行原始查詢即可訪問物化數據(以空間換取速度)。

在本文檔中,我們主要關注 JSON_TABLE 物化視圖。以下代碼將創(chuàng)建一個物化視圖,其中包含示例 JSON 文檔中“LineItems”數組的值。如前所述,使用物化視圖可以在 Oracle 19c 中索引 JSON 數組值,因為該版本不支持多值 JSON 索引。

create materialized view PO_MV build immediate
refresh fast on statement with primary key as
 select po.id, jt.* from PURCHASEORDER po, json_table(po.data, '$' error on error null on empty
 columns (
 	 po_number NUMBER PATH '$.PONumber', 
 	 userid VARCHAR2(10) PATH '$.User', 
 	 NESTED PATH '$.LineItems[*]'
 	 	columns ( itemno NUMBER PATH '$.ItemNumber',
 	 	description VARCHAR2(256) PATH '$.Part.Description',
 	 	upc_code NUMBER PATH '$.Part.UPCCode',
 	 	quantity NUMBER PATH '$.Quantity',
 	 	unitprice NUMBER PATH '$.Part.UnitPrice')))
jt;

在我們的物化視圖中將數組值轉換為多行,使我們能夠在 JSON 數組的字段上創(chuàng)建附加(輔助)索引,如下所示:

CREATE INDEX mv_idx ON PO_MV(upc_code, quantity);

現(xiàn)在,基表上的 SQL/JSON 查詢將透明地重寫,以盡可能使用物化視圖及其索引。以下查詢是一個示例,其中 Oracle 自動重寫查詢以使用物化視圖及其二級索引,如執(zhí)行計劃中所示:

select data from PURCHASEORDER po
where JSON_EXISTS(po.data, '$.LineItems[*]?(@.Part.UPCCode == 1234)');
-----------------------------------------------------------------
| Id | Operation							| Name 				|
 … 	
| 4 | MAT_VIEW ACCESS BY INDEX ROWID BATCHED| PO_MV 			|
|* 5 | INDEX RANGE SCAN 					| MV_IDX 			|
-----------------------------------------------------------------

為了使物化視圖 (MV) 與底層數據(DML 操作后)保持同步,我們將物化視圖設置為“語句快速刷新”。這可以自動執(zhí)行刷新過程,并始終保持物化視圖和基表數據一致。本文不深入討論物化視圖的各種刷新機制。更多詳細信息,請參閱相關文檔。

Oracle 分區(qū)

您可以像平常一樣對包含文檔的表進行分區(qū),以提高性能:分區(qū)可以將表和索引細分為單獨的較小物理對象,即所謂的分區(qū)。**分區(qū)表中的數據位置由分區(qū)鍵標識。此鍵可以是關系列,也可以是 JSON 數據中的字段。**從應用程序的角度來看,分區(qū)表與非分區(qū)表完全相同。

以下示例創(chuàng)建一個范圍分區(qū)表,其分區(qū)鍵從存儲在“data”列中的 JSON 文檔中提取,并使用基于 JSON_VALUE 的虛擬列“po_num_vc”;

CREATE TABLE part_j (id VARCHAR2 (32) NOT NULL PRIMARY KEY,
data JSON,
po_num_vc NUMBER GENERATED ALWAYS AS
(json_value (data, '$.PONumber' RETURNING NUMBER)))
PARTITION BY RANGE (po_num_vc)
	 (PARTITION p1 VALUES LESS THAN (1000), 
	 	PARTITION p2 VALUES LESS THAN (2000));

對 JSON 字段“$.PONumber”(用作虛擬列分區(qū)鍵的 JSON 字段)進行過濾的查詢將明顯受益于 Oracle 分區(qū)功能:一種稱為分區(qū)修剪的優(yōu)化技術會自動排除所有不相關的分區(qū),即已知不包含任何與查詢相關的數據的分區(qū)。
以下示例查詢只需訪問第一個分區(qū),因為查詢的相等謂詞只能在此分區(qū)中找到匹配的記錄。執(zhí)行計劃中顯示了這一點,其中 Pstart 列和 Pstop 列均為 1。

select data from part_j
where json_value (data, '$.PONumber' RETURNING NUMBER) = 500; -----------------------------------------------------------------
| Id 	| Operation 			| Name | Time | Pstart| Pstop |
-----------------------------------------------------------------
| 0 	| SELECT STATEMENT 		| 			| 00:00:01 | 	| 	|
| 1 	| PARTITION RANGE ALL	| 			| 00:00:01 | 1 	| 1 |
|* 2 	| TABLE ACCESS FULL 	| PART_J 	| 00:00:01 | 1 	| 1 |
-----------------------------------------------------------------

Oracle 分區(qū)有多種機制來對表進行分區(qū),由于篇幅原因,這里不再贅述。更多詳情請參閱文檔。通常,對于較大的 JSON 文檔(平均 > 32kb),使用關系列作為分區(qū)鍵在 DML 操作期間通常比使用 JSON_VALUE 虛擬列性能更高,因為后者需要在寫入正確分區(qū)之前從 JSON 中提取分區(qū)鍵。

并行執(zhí)行

通過使用多個進程處理 JSON 文檔,可以并行化 JSON 操作(例如查詢或批量更新)。這可以更高效地利用硬件資源,是大規(guī)模數據處理的關鍵。

大型數據倉庫應始終使用并行執(zhí)行來實現(xiàn)良好的性能。OLTP 應用程序中的特定操作(例如批處理操作)也可以從并行執(zhí)行中顯著受益
并行執(zhí)行支持查詢和 DML(插入、更新)。有多種方法可以啟用和配置并行執(zhí)行。例如,Oracle 自治數據庫會根據為連接選擇的消費者組自動選擇并行度。對于手動控制并行度的數據庫,您可以在會話級別啟用并行度或裝飾單個對象。例如,以下代碼為我們的表“purchaseorder”啟用了 8 級并行度。

alter table PURCHASEORDER parallel 8;

如果使用并行執(zhí)行,則執(zhí)行計劃將顯示帶有“PX”的行。

| 1 | PX COORDINATOR || 2 | PX SEND QC (ORDER)|

Oracle 內存列式存儲

JSON 數據可以存儲在內存列存儲(IM 列存儲)中,從而提升查詢性能。最大可達 32 KB 的 JSON 值可以與其他關系列一起直接加載并在內存中處理。通常,JSON 文檔中的值并非都與分析查詢相關。在這種情況下,只需在內存中分別移動相關的 JSON 字段即可更高效地利用內存:可以使用虛擬列或中間物化視圖。

以下示例向表“purchaseorder”添加了一個虛擬列,該列用于從訂單地址中提取“zipCode”字段。虛擬列已添加,并且表已啟用內存處理。

alter table PURCHASEORDER add (ZIP varchar2(4000) generated always as
(JSON_VALUE(data, '$.ShippingInstructions.Address.zipCode.number()')));
alter table PURCHASEORDER inmemory;

以下分析示例查詢按 zipCode 計算訂單數量,并利用快速內存??處理,如執(zhí)行計劃所示。

select zip, count(1) from PURCHASEORDER group by zip ;
-----------------------------------------------------
| Id 	| Operation 				| Name 			|
-----------------------------------------------------
| 0 	| SELECT STATEMENT 			| 				|
| 1 	| HASH GROUP BY 			| 				|
| 2 	| TABLE ACCESS INMEMORY FULL| PURCHASEORDER |
-----------------------------------------------------

Oracle Exadata 數據庫云服務器

Exadata 加速 JSON 性能:包含表和索引掃描的查詢可以將數據搜索和檢索處理卸載到 Exadata 存儲服務器。對于 JSON 運算符(例如,在查詢的 WHERE 子句中使用 JSON_VALUE 或 JSON_EXISTS),此卸載操作會自動且透明地進行。最大 4KB 的 JSON 文檔可以卸載到 Exadata 存儲服務器。更大的文檔將在數據庫中處理。

執(zhí)行計劃中的 STORAGE 術語表明卸載已完成:

-----------------------------------------------------
| Id | Operation 				| Name 			|
-----------------------------------------------------
|* 3 | TABLE ACCESS STORAGE FULL| PURCHASEORDER |
-----------------------------------------------------

Oracle 真正應用集群

Oracle 真正應用集群 (RAC) 允許客戶在多臺服務器上運行單個 Oracle 數據庫,以最大限度地提高可用性并在訪問共享存儲時實現(xiàn)水平可擴展性。

使用 Oracle Real Application Clusters 對于 JSON 文檔的處理是透明的,并且任何 SQL/JSON 處理都會自動受益。

Oracle 分片

Oracle 分片也是一種水平擴展技術,但與 RAC 不同,它采用無共享架構。分片技術允許 JSON 文檔擴展到海量數據和事務處理,并支持數據主權。JSON 文檔根據分片鍵(可以是關系列或 JSON 字段)分發(fā)到各個數據庫表分片中。

使用 Oracle 分片技術對于分片 JSON 文檔的處理是透明的。對于許多操作而言,分片文檔的處理僅在擁有特定分片的數據庫上進行,而跨分片查詢將透明地收集并聚合來自所有相關分片的結果數據。

Oracle 數據庫中 JSON 性能調優(yōu)特性到此結束。以下總結了 JSON 文檔存儲 API(MongoDB 集合和 SODA 集合)的性能相關主題:

性能技巧SODA 系列

Oracle 數據庫提供允許以集合形式訪問 JSON 數據的 API:適用于 MongoDB 的 Oracle 數據庫 API 和簡單 Oracle 文檔訪問 API -SODA。從概念上講,JSON 集合將 JSON 數據(稱為文檔)存儲在自動生成的表中(以便也可以通過 SQL 訪問)。SODA 支持與包含 JSON 數據的常規(guī)表相同的存儲選項,并且適用相同的建議:在 Oracle 19c 上使用 BLOB,在 Oracle 21c 上使用原生 JSON 類型。

用戶通常使用原生語言驅動程序(例如,Java 版 SODA 或 Python 版 SODA)處理 JSON 集合。SODA 原生語言驅動程序通常比 REST 驅動程序(REST 版 SODA)提供更高的吞吐量(每秒操作數)。

建議按如下方式配置 SODA 驅動程序:

  • 啟用 SODA 元數據緩存

SODA 驅動程序需要了解每個 JSON 集合的元數據(列名、類型等)。啟用元數據緩存可以減少與數據庫的往返次數,從而提高延遲和吞吐量。

  • 啟用語句緩存

語句緩存通過緩存重復使用的可執(zhí)行語句(例??如在循環(huán)中或在重復調用的方法中)來提高性能。對于 Java,語句緩存是使用 JDBC 啟用的。

  • 對于負載平衡系統(tǒng):關閉 DNS 緩存

負載平衡允許將 SODA 操作分布到不同的節(jié)點。如果啟用了 DNS 緩存,則所有連接都可能使用同一節(jié)點,從而導致負載平衡失效。對于 Java,應設置以下系統(tǒng)屬性:inet.addr.ttl=0

數據庫性能調優(yōu)技術也適用于 SODA:例如,SODA 集合可以分區(qū)或分片,并且可以使用索引和/或物化視圖加速查詢。SODA 操作會自動轉換為等效的 SQL 操作:例如,SODA 查詢將轉換為在 WHERE 子句中使用 JSON_EXISTS 運算符的 SELECT 語句。

可以從 v$sql 數據庫視圖中檢索 SQL 操作,也可以通過直接在 SODA 驅動程序中啟用日志記錄來檢索 SQL 操作:在 Java 中,使用標準日志記錄包 - 可以為 SODA 啟用它,如下所示:

java -classpath "..." -Doracle.soda.trace=true -Djava.util.logging.config.file=logging.properties <program>
  • ‘oracle.soda.trace=true’ 啟用 SQL 語句的日志記錄。
  • ‘logging.java.util.logging.config.file’ 定義 java.util.logging 配置文件的路徑,該文件允許不同的日志記錄級別:FINEST 是最詳細的日志記錄級別。

更多信息 – 鏈接

  • Oracle XE
  • Oracle Standard Edition
  • Oracle Enterprise Edition
  • Oracle Exadata Cloud Service
  • Oracle Exadata Cloud at Customer
  • Oracle Exadata Database Machine
  • Oracle Database Cloud Service
  • Oracle Autonomous JSON
  • Oracle Autonomous Transaction Processing
  • Oracle Autonomous Data Warehouse

到此這篇關于Oracle 數據庫中的 JSON性能注意事項(最佳實踐)的文章就介紹到這了,更多相關Oracle 數據庫JSON內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論