Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ OrioleDB ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ»ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ API для Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Π΄Π²ΠΈΠΆΠΊΠΎΠ² PostgreSQL

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ OrioleDB ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π΅ состояниС Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠ³ΠΎ API, примСняСмого для доступа Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌ ΠΈ индСксам Π² PostgreSQL (Table/Index Access Method (AM) API), ΠΈ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ»ΠΈ ΠΏΡƒΡ‚ΠΈ Π΅Π³ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ. Π‘ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° появлСния Π² PostgreSQL 12 ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ API Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ хранСния Π΄Π°Π½Π½Ρ‹Ρ…. Однако, нСсмотря Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ этого API ΠΈ извСстныС ограничСния встроСнного ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° хранСния, Π΄ΠΎ сих ΠΏΠΎΡ€ Π½Π΅ появилось ΠΏΠΎΠ»Π½ΠΎΡ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Π΄Π²ΠΈΠΆΠΊΠΎΠ² хранСния, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π² Π²ΠΈΠ΄Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ.

НаиболСС вострСбованными функциями для Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ‚Π°Π±Π»ΠΈΡ‡Π½Ρ‹Ρ… Π΄Π²ΠΈΠΆΠΊΠΎΠ² PostgreSQL ΡΠ²Π»ΡΡŽΡ‚ΡΡ:

  • ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ MVCC, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π½Π° основС ΠΆΡƒΡ€Π½Π°Π»Π° UNDO.
  • ИндСксно-ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Π³Π΄Π΅ индСкс Π½Π΅ являСтся Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ускоряСт запросы, Π° прСдставляСт собой ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ структуру Π΄Π°Π½Π½Ρ‹Ρ…, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ хранятся Π΄Π°Π½Π½Ρ‹Π΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

ИзмСнСния, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π² API Table/Index AM для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ MVCC, Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ с оглядкой Π½Π° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ OrioleDB, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ΅ для устранСния извСстных нСдостатков встроСнного ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° хранСния PostgreSQL. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ для ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ OrioleDB с PostgreSQL Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ внСсСниС ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΠΊΠΎΠ΄ PostgreSQL, Ρ‡Ρ‚ΠΎ услоТняСт Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ΠΈ ΠΏΠΎΠ΄Ρ‡Ρ‘Ρ€ΠΊΠΈΠ²Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΌΠΎΠ΄Π΅Ρ€Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ API Table AM.

API Table AM Π½Π΅ навязываСт Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ способ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ MVCC. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, API Table AM ΠΈ API Index AM Π΄Π΅Π»Π°ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅: ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ TID (Tuple/row Identifier) Π»ΠΈΠ±ΠΎ индСксируСтся всСми индСксами, Π»ΠΈΠ±ΠΎ Π½Π΅ индСксируСтся Π²ΠΎΠΎΠ±Ρ‰Π΅. Π”Π°ΠΆΠ΅ Ссли Index AM ΠΈΠΌΠ΅Π΅Ρ‚ нСсколько ссылок Π½Π° ΠΎΠ΄ΠΈΠ½ TID (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, GIN), всС эти ссылки Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ индСксированному Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ.

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ OrioleDB ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ»ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ API для Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Π΄Π²ΠΈΠΆΠΊΠΎΠ² PostgreSQL

Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ ΠΊΡ€ΠΈΡ‚ΠΈΠΊΠΎΠ²Π°Π»ΠΈ Π·Π° ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ числа ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ записи (Β«write amplificationΒ») β€” Ссли обновляСтся ΠΎΠ΄ΠΈΠ½ индСксированный Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ индСкс Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅. ΠŸΡ€ΠΈ нСобходимости Π² ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΌΠ΅Ρ€Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ прСимущСства ΠΆΡƒΡ€Π½Π°Π»Π° UNDO ΠΈΠ»ΠΈ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ хранСния Π±Π΅Π· «усилСния записи» (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠ΅Ρ‚ΠΎΠ΄ WARM), трСбуСтся Π½Π°Ρ€ΡƒΡˆΠΈΡ‚ΡŒ это ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ OrioleDB ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ»ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ API для Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Π΄Π²ΠΈΠΆΠΊΠΎΠ² PostgreSQL

Table AM основанный Π½Π° UNDO, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ€ΡƒΡˆΠ°Ρ‚ΡŒ это ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ HOT (Heap-Only Tuples), Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ старыС вСрсии строк ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π² ΠΆΡƒΡ€Π½Π°Π»Π΅ UNDO ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ страницС. Но, ΠΏΠΎ мнСнию Π°Π²Ρ‚ΠΎΡ€ΠΎΠ², этого прСимущСства нСдостаточно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΡ€Π°Π²Π΄Π°Ρ‚ΡŒ сущСствованиС ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Table AM.

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ ограничСния ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ API:

  • Π’ΠΎ врСмя обновлСния строки Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ индСксы ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡƒ «всС ΠΈΠ»ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎΒ».
  • ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ Π² API Index AM возмоТности Ρ‚ΠΎΡ‡Π΅Ρ‡Π½ΠΎΠ³ΠΎ удалСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ. Π’ настоящСС врСмя ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ ΠΈΠ· индСксов массово с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² ambulkdelete ΠΈ amvacuumcleanup. ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‡Π΅Ρ‡Π½ΠΎΠ΅ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ Ρ‡Π΅Ρ€Π΅Π· этот API ΠΏΡ€ΠΈΠ²Π΅Π»Π° Π±Ρ‹ ΠΊ Π½ΠΈΠ·ΠΊΠΎΠΉ эффСктивности, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ вСсь индСкс. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, API Π½Π΅ позволяСт ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠ· ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ΅ΠΉ, ΡΡΡ‹Π»Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ TID, слСдуСт ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ. Он ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΡ… всС.
  • Π˜Π½Π΄Π΅ΠΊΡΡ‹ Π² настоящСС врСмя ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° строки Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΏΠΎ Π½ΠΎΠΌΠ΅Ρ€Ρƒ Π±Π»ΠΎΠΊΠ° (32 Π±ΠΈΡ‚Π°) ΠΈ Π½ΠΎΠΌΠ΅Ρ€Ρƒ смСщСния (16 Π±ΠΈΡ‚). И Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 11 Π±ΠΈΡ‚ Π½ΠΎΠΌΠ΅Ρ€Π° смСщСния ΠΌΠΎΠΆΠ½ΠΎ бСзопасно ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ ΠΈΠ· TID Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π²ΠΎ всС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ доступа индСкса. ΠŸΡ€ΠΈ этом Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ рСализациям MVCC ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ (payload) вмСстС с TID. НапримСр, Π² OrioleDB трСбуСтся ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько Π±ΠΈΡ‚ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ индСксов Β«delete-markingΒ» ΠΈΠ»ΠΈ ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ видимости.

ΠŸΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ Π΄Π²Π° способа ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Ρ‚ΡŒ ограничСния Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅:

    ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ 1: API Index AM прСдоставляСт возмоТности для Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ MVCC.

    Π’ Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Table AM ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π·Π° всС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ MVCC, Index AM прСдоставляСт Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ возмоТности для Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ MVCC, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ: Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ (payload) вмСстС с TID, ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ‚ΠΎΡ‡Π΅Ρ‡Π½ΠΎΠ³ΠΎ удалСния ΠΈ Π΄Π°ΠΆΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ Ρ‚ΠΎΡ‡Π΅Ρ‡Π½ΠΎΠ³ΠΎ обновлСния (Ссли TID Π² индСксС Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Ρ‘Π½, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠ°Ρ полСзная Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ° – ΠΌΠΎΠΆΠ΅Ρ‚). ΠšΡ€ΠΎΠΌΠ΅ этого, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ нСскольким ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ°ΠΌ индСкса ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ TID, ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ API, примСняСмыС ΠΏΡ€ΠΈ сканировании индСкса, Ρ‚Π°ΠΊΠΆΠ΅ Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ.

    ΠŸΠΎΠ΄Ρ…ΠΎΠ΄ 2: Π˜Π½Π΄Π΅ΠΊΡΡ‹, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ MVCC.

    ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²ΠΎΠΉ Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ индСксы, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ MVCC. Π’ΠΎ Π΅ΡΡ‚ΡŒ Β«executorΒ» (ΠΈΠ»ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Table AM) просто Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ insert() ΠΈ delete() Π² Index AM, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Index AM прСдоставляСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ сканирования c ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ MVCC. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ упростило Π±Ρ‹ сканированиС с использованиСм Ρ‚ΠΎΠ»ΡŒΠΊΠΎ индСксов (index-only). Π”Π°ΠΆΠ΅ вСсь Table AM Π² Ρ‚Π°ΠΊΠΎΠΌ случаС ΠΌΠΎΠ³ Π±Ρ‹ ΡΡ‚Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΌ слоСм, хранящим Π΄Π°Π½Π½Ρ‹Π΅ Π² индСксС.

    На Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ΅ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ индСкса 2 обновляСтся Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠ΅ΠΉ 11 со значСния Β«AΒ» Π½Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Β«BΒ». ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Β«AΒ» ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½ΠΎ ΠΊΠ°ΠΊ xmax == 11, Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Β«BΒ» ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½ΠΎ ΠΊΠ°ΠΊ xmin == 11. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ индСкс 2 ΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²ΠΈΠ΄ΠΈΠΌΡ‹Π΅ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈ Π² соотвСтствии с MVCC Π±Π΅Π· ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ ΠΊΡƒΡ‡ΠΈ (heap). Π‘Π±ΠΎΡ€ΠΊΠ° мусора индСкса 2 Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Π° Π±Π΅Π· использования ΠΊΡƒΡ‡ΠΈ.

    Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ OrioleDB ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ»ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ API для Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Π΄Π²ΠΈΠΆΠΊΠΎΠ² PostgreSQL

    ΠŸΡ€ΠΈ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠΈ всСх пСрСчислСнных Π½ΠΎΠ²ΡˆΠ΅ΡΡ‚Π² Π² API индСксных ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² доступа, маловСроятно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π΄ΠΎΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ всС индСксы для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ всСх Π½ΠΎΠ²Ρ‹Ρ… возмоТностСй. Π‘ΠΎΠ»Π΅Π΅ рСалистично Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ нСсколько Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΉ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ индСксного ΠΌΠ΅Ρ‚ΠΎΠ΄Π° доступа. НапримСр, Π² Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠΌΡƒ B-tree, Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ смоТСт Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ B-tree с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ MVCC Π²Π½ΡƒΡ‚Ρ€ΠΈ индСкса ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² записи ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹.

    Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ OrioleDB ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΠ»ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ API для Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹Ρ… Π΄Π²ΠΈΠΆΠΊΠΎΠ² PostgreSQL

    Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, прСдлагаСтся ΠΏΠ΅Ρ€Π΅ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ API Table AM, Π½ΠΎ ΠΈ API Index AM, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ исправно слуТил сообщСству PostgreSQL Π½Π° протяТСнии ΠΌΠ½ΠΎΠ³ΠΈΡ… Π»Π΅Ρ‚. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, прСдлагаСтся Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Index AM Π½Π° логичСский слой ΠΈ слой Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π­Ρ‚Π° пСрСосмыслСнная Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ PostgreSQL ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ хранСния.

    Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ