![Page 1: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/1.jpg)
NOSQLINSIDE SQL
STRATEGY AND TACTICS
DMITRY DOLGOV
06-07-2017
![Page 2: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/2.jpg)
.1
![Page 3: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/3.jpg)
.
: Jsonb internals and performance-related factors: Benchmarks: How to shoot yourself in the foot
2
![Page 4: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/4.jpg)
.
: Jsonb internals and performance-related factors
: Benchmarks: How to shoot yourself in the foot
2
![Page 5: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/5.jpg)
.
: Jsonb internals and performance-related factors: Benchmarks
: How to shoot yourself in the foot
2
![Page 6: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/6.jpg)
.
: Jsonb internals and performance-related factors: Benchmarks: How to shoot yourself in the foot
2
![Page 7: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/7.jpg)
.
Internals
![Page 8: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/8.jpg)
.
Performance-related factors
: On-disk representation: In-memory representation: Indexing support
4
![Page 9: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/9.jpg)
.
Performance-related factors: On-disk representation
: In-memory representation: Indexing support
4
![Page 10: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/10.jpg)
.
Performance-related factors: On-disk representation: In-memory representation
: Indexing support
4
![Page 11: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/11.jpg)
.
Performance-related factors: On-disk representation: In-memory representation: Indexing support
4
![Page 12: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/12.jpg)
.5
![Page 13: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/13.jpg)
.
. .. Jsonb
.
.
document size
.
.
node
.
.
node
.
.
JEntry
.
.
content
.
.
...
6
![Page 14: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/14.jpg)
.
. .. Jsonb
.
.
document size
.
.
node
.
.
node
.
.
JEntry
.
.
content
.
.
...
7
![Page 15: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/15.jpg)
.
. ..Jsonb Header
.
.
type
.
.
number of items
.
.
JEntry
.
.
length or offset?
.
.
value type
.
.
value length or offset8
![Page 16: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/16.jpg)
.
JB_OFFSET_STRIDE
: JEntry may contains a value lenght or offset: Offset = access speed: Length = compressibility: Every JB_OFFSET_STRIDE’th JEntry contains an offset: Rest of them contain length
9
![Page 17: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/17.jpg)
.
. .. Bson
.
.
document size
.
.
node
.
.
node
.
.
Header
.
.
Content
.
.
...
10
![Page 18: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/18.jpg)
.
. .. Bson
.
.
document size
.
.
node
.
.
node
.
.
Header
.
.
Content
.
.
...
11
![Page 19: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/19.jpg)
.
. ..Bson Header
.
.
Value type
.
.
Key name
.
.
Value size
12
![Page 20: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/20.jpg)
.
. ..MySQL Json
.
.
node
.
.
node
.
.
Type
.
.
Value
.
.
...
13
![Page 21: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/21.jpg)
.
. ..MySQL Json
.
.
node
.
.
node
.
.
Type
.
.
Value
.
.
...
14
![Page 22: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/22.jpg)
.
. ..MySQL Json Object
.
.
Count of elements
.
.
Size
.
.
Pointers to keys
.
.
Pointers to values
.
.
Keys
.
.
Values15
![Page 23: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/23.jpg)
.
. .. Bson
.
.
Key
.
.
Value
.
.
Key
.
.
Value
.
.
Key
.
.
Value
.
.
...
. ..Jsonb/MySQL Json
.
.
Key
.
.
Key
.
.
Value
.
.
Key
.
.
Value
.
.
Value
.
.
...
16
![Page 24: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/24.jpg)
.
{”a”: 3, ”b”: ”xyz”}
17
![Page 25: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/25.jpg)
.
select pg_relation_filepath(oid),relpages from pg_classwhere relname = ’table_name’;
pg_relation_filepath | relpages----------------------+----------base/40960/325477 | 0(1 row)
18
![Page 26: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/26.jpg)
.
bson.dumps({”a”: 3, ”b”: u”xyz”})
19
![Page 27: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/27.jpg)
.
$ hexdump -C database/table.ibd
20
![Page 28: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/28.jpg)
.
TOAST
. .. Jsonb .. Compression .. Chunks .. Toast table
: TOAST_TUPLE_THRESHOLD bytes (normally 2 kB): PostgreSQL and MySQL use LZ variation: MongoDB uses snappy block compression
21
![Page 29: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/29.jpg)
.
Alignment
Variable-length portion is aligned to a 4-byte
insert into testvalues(’{”a”: ”aa”, ”b”: 1}’);
insert into testvalues(’{”a”: 1, ”b”: ”aa”}’);
22
![Page 30: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/30.jpg)
.
In-memory representation
: Tree-like representation (JsonbValue, Document, Json_dom): Little bit more expensive but more convenient to work with: Mostly in use to modify data (except MySQL): Most of the read operations use on-disk representation
23
![Page 31: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/31.jpg)
.
Indexing support
: Postgresql – single field, multiple fields, entire document: MongoDB – single field, multiple fields: MySQL – virtual columns, single field, multiple fields
24
![Page 32: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/32.jpg)
.
PG indexing details
: JGIN_MAXLENGTH: jsonb_path: jsonb_path_ops
25
![Page 33: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/33.jpg)
.
Benchmarks
![Page 34: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/34.jpg)
27
![Page 35: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/35.jpg)
.
AWS EC2m4.xlarge instanceseparate instance (database and generator)16GB memory, 4 core 2.3GHzUbuntu 16.04Same VPC and placement groupAMI that supports HVM virtualization typeat least 4 rounds of benchmark
28
![Page 36: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/36.jpg)
.
PostgreSQL 9.6.3MySQL 5.7.9MongoDB 3.4.4YCSB 0.9106 rows and operationsAWS EC2
29
![Page 37: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/37.jpg)
.
Configurationshared_bufferseffective_cache_sizemax_wal_sizeinnodb_buffer_pool_sizewrite concern level (journaled or transaction_sync)
30
![Page 38: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/38.jpg)
.
Document types“simple” document10 key/value pairs (100 characters)
“large” document100 key/value pairs (200 characters)
“complex” document100 keys, 3 nesting levels (100 characters)
31
![Page 39: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/39.jpg)
.
Select, GIN”simple” documentjsonb_path_opswhere data @> ’{”key”: ”value”}’::jsonb
32
![Page 40: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/40.jpg)
.33
![Page 41: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/41.jpg)
.34
![Page 42: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/42.jpg)
.
Select, BTree”simple” documentbtree
35
![Page 43: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/43.jpg)
.36
![Page 44: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/44.jpg)
.
Select, BTree”complex” documentbtree
37
![Page 45: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/45.jpg)
.38
![Page 46: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/46.jpg)
.
Scalability”simple” documentm4.largem4.xlargem4.2xlarge
39
![Page 47: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/47.jpg)
.40
![Page 48: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/48.jpg)
.
Insert”simple” documentjournaled
41
![Page 49: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/49.jpg)
.42
![Page 50: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/50.jpg)
.43
![Page 51: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/51.jpg)
.44
![Page 52: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/52.jpg)
.
Update 50%, Select 50%”simple” documentUpdate one fieldtransaction_sync
45
![Page 53: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/53.jpg)
.46
![Page 54: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/54.jpg)
.
Update 50%, Select 50%”simple” documentUpdate one fieldjournaled
47
![Page 55: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/55.jpg)
.48
![Page 56: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/56.jpg)
.
Update 50%, Select 50%”large” documentUpdate one field
49
![Page 57: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/57.jpg)
.50
![Page 58: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/58.jpg)
.
JSON vs JSONB”simple” documentbtreeinsert
51
![Page 59: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/59.jpg)
.52
![Page 60: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/60.jpg)
.
JSON vs JSONB”simple” documentbtreeselect
53
![Page 61: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/61.jpg)
.54
![Page 62: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/62.jpg)
.
SQL vs JSONB”simple” documentbtreeinsert
55
![Page 63: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/63.jpg)
.56
![Page 64: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/64.jpg)
.
SQL vs JSONB”simple” documentbtreeselect
57
![Page 65: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/65.jpg)
.58
![Page 66: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/66.jpg)
.
How to bring it down acci-dentally?
![Page 67: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/67.jpg)
.60
![Page 68: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/68.jpg)
.
: Update one field of a document: DETOAST of a document(select, constraints, procedures etc.)
: Reindex of an entire document
61
![Page 69: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/69.jpg)
.
Document slice”large” documentOne field from a document
62
![Page 70: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/70.jpg)
.63
![Page 71: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/71.jpg)
.
Document slice”large” document10 fields from a document
64
![Page 72: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/72.jpg)
.65
![Page 73: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/73.jpg)
.
Document slicecreate type test as (”a” text, ”b” text);insert into test_jsonbvalues(’{”a”: 1, ”b”: 2, ”c”: 3}’);select q.* from test_jsonb,jsonb_populate_record(NULL::test, data) as q;a | b---+---1 | 2(1 row)
66
![Page 74: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/74.jpg)
67
![Page 75: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/75.jpg)
.
TOAST_TUPLE_THRESHOLD”simple” document40 threadsdifferent document sizeselect
68
![Page 76: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/76.jpg)
.69
![Page 77: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/77.jpg)
.
Select, GIN”simple” documentjsonb_path_opswhere data @> jsonb_build_object(’key’, ’value’)
70
![Page 78: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/78.jpg)
.71
![Page 79: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/79.jpg)
.
: Jsonb is more that good for many use cases
: Benchmarks above are only ”hints”: You need your own tests
72
![Page 80: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/80.jpg)
.
: Jsonb is more that good for many use cases: Benchmarks above are only ”hints”
: You need your own tests
72
![Page 81: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/81.jpg)
.
: Jsonb is more that good for many use cases: Benchmarks above are only ”hints”: You need your own tests
72
![Page 82: NOSQL INSIDE SQL - STRATEGY AND TACTICS · JB_OFFSET_STRIDE: JEntrymaycontainsavaluelenghtoroffset: Offset=accessspeed: Length=compressibility: EveryJB_OFFSET_STRIDE’thJEntrycontainsanoffset](https://reader034.vdocuments.site/reader034/viewer/2022042220/5ec6bd7cd3e7652ec16646a9/html5/thumbnails/82.jpg)
.
Questions?
github.com/erthalion@erthalion 9erthalion6 at gmail dot com
73